• Excel操作类


    1.新建Excel并保存数据

    2.追加Excel并自动分页保存数据

    View Code
    using System;
    using System.Collections.Generic;
    using System.Runtime.InteropServices;
    using Excel = Microsoft.Office.Interop.Excel;
    using System.Diagnostics;
    using System.IO;
    using System.Collections;
    using System.Data;

    namespace AssismentForm
    {
    /// <summary>
    /// excel操作类
    /// 开发环境:2007
    /// </summary>
    public class ExcelHelper1 : IDisposable
    {
    #region 构造函数
    /// <summary>
    /// 构造函数,打开一个已有的工作簿
    /// </summary>
    /// <param name="fileName">Excel文件名</param>
    public ExcelHelper1(string fileName)
    {
    if (!File.Exists(fileName))
    throw new Exception("指定路径的Excel文件不存在!");
    //创建一个Application对象并使其可见
    excelApp = new Excel.ApplicationClass();

    excelApp.Visible = false;
    excelApp.DisplayAlerts = false;
    excelApp.AlertBeforeOverwriting = false;

    //打开一个WorkBook
    workBook = excelApp.Workbooks.Open(fileName,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

    //得到WorkSheet对象
    workSheet = (Excel.Worksheet)workBook.Worksheets.Add(Type.Missing, Type.Missing, Type.Missing, Type.Missing);
    }

    /// <summary>
    /// 构造函数,新建一个工作簿
    /// </summary>
    public ExcelHelper1()
    {
    excelApp = new Excel.ApplicationClass();
    excelApp.Visible = false;
    //设置禁止弹出保存和覆盖的询问提示框

    excelApp.DisplayAlerts = false;
    excelApp.AlertBeforeOverwriting = false;

    //新建一个WorkBook
    workBook = excelApp.Workbooks.Add(Type.Missing);

    //得到WorkSheet对象
    workSheet = (Excel.Worksheet)workBook.Sheets.get_Item(1);
    ((Excel.Worksheet)workBook.Sheets.get_Item(2)).Delete();
    ((Excel.Worksheet)workBook.Sheets.get_Item(2)).Delete();
    }
    #endregion

    #region 成员变量
    //输出路径
    private string outputFile = null;
    private object missing = System.Reflection.Missing.Value;
    /// <summary>
    /// ExcelApp应用程序
    /// </summary>
    public Excel.Application excelApp;
    Excel.Workbook workBook;
    /// <summary>
    /// 工作表
    /// </summary>
    public Excel.Worksheet workSheet;
    Excel.Range range;
    Excel.Range range1;
    Excel.Range range2;
    Excel.TextBox textBox;
    //WorkSheet数量
    private int sheetCount = 1;
    #endregion

    #region 公共属性
    /// <summary>
    /// 输出Excel文件路径
    /// </summary>
    public string OutputFilePath
    {
    set { this.outputFile = value; }
    }
    #endregion

    #region 公共方法

    #region Data Export Methods

    /// <summary>
    /// 将DataTable数据写入Excel文件(不分页)
    /// </summary>
    /// <param name="dt">DataTable</param>
    /// <param name="top">表格数据起始行索引</param>
    /// <param name="left">表格数据起始列索引</param>
    public void DataTableToExcel(DataTable dt, int top, int left)
    {
    int rowCount = dt.Rows.Count; //DataTable行数
    int colCount = dt.Columns.Count; //DataTable列数
    //利用二维数组批量写入
    object[,] arr = new object[rowCount + 1, colCount];
    for (int j = 0; j < rowCount; j++)
    {
    for (int k = 0; k < colCount; k++)
    {
    if (j == 0)
    {
    arr[j, k] = dt.Columns[k].ColumnName;
    }
    arr[j + 1, k] = dt.Rows[j][k].ToString();
    }
    }
    range = (Excel.Range)workSheet.Cells[top, left];
    range = range.get_Resize(rowCount + 1, colCount);
    range.Value2 = arr;
    }

    /// <summary>
    /// 将DataTable数据写入Excel文件(自动分页)
    /// </summary>
    /// <param name="dt">DataTable</param>
    /// <param name="sheetCounts">sheet数量</param>
    /// <param name="top">表格数据起始行索引</param>
    /// <param name="left">表格数据起始列索引</param>
    /// <param name="rowsList">每个sheet行数</param>
    /// <param name="nameList">名字列表</param>
    public void DataTableToExcel(DataTable dt, int sheetCounts, List<int> rowsList, List<string> nameList, int top, int left)
    {
    int rowCount = dt.Rows.Count; //源DataTable行数
    int colCount = dt.Columns.Count; //源DataTable列数
    sheetCount = sheetCounts; //WorkSheet个数

    //复制sheetCount-1个WorkSheet对象
           for (int i = 1; i < sheetCount; i++)
    {
    workSheet = (Excel.Worksheet)workBook.Worksheets.get_Item(i);
    workSheet.Copy(missing, workBook.Worksheets[i]);
    }
    int rows = 0;
    for (int i = 1; i <= sheetCount; i++)
    {
    int startRow = rows; //记录起始行索引
    rows += rowsList[i - 1];

    //获取要写入数据的WorkSheet对象,并重命名
    workSheet = (Excel.Worksheet)workBook.Worksheets.get_Item(i);
    workSheet.Name = i + "-" + nameList[i - 1];
    //利用二维数组批量写入
    int row = rowsList[i - 1];
    object[,] ss = new object[row + 1, colCount];

    for (int j = 0; j < row; j++)
    {
    for (int k = 0; k < colCount; k++)
    {
    if (j == 0)
    {
    ss[j, k] = dt.Columns[k].ColumnName;
    }
    ss[j + 1, k] = dt.Rows[startRow + j][k].ToString();
    }
    }
    range = (Excel.Range)workSheet.Cells[top, left];
    range = range.get_Resize(row + 1, colCount);
    range.Value2 = ss;
    }
    }
    #endregion

    #region 输出Excel(注意:如果目标文件已存在的话会出错)

    /// <summary>
    /// 保存文件
    /// </summary>
    public void SaveFile()
    {
    try
    {
    workBook.Save();
    }
    catch (Exception e)
    {
    throw e;
    }
    finally
    {
    this.Quit();
    }
    }

    /// <summary>
    /// 另存文件
    /// </summary>
    public void SaveAsFile()
    {
    if (this.outputFile == null)
    throw new Exception("没有指定输出文件路径!");

    try
    {
    workBook.SaveAs(outputFile, missing, missing, missing, missing, missing, Excel.XlSaveAsAccessMode.xlExclusive, missing, missing, missing, missing, missing);
    }
    catch (Exception e)
    {
    throw e;
    }
    finally
    {
    this.Quit();

    }
    }

    /// <summary>
    /// 将Excel文件另存为指定格式
    /// </summary>
    /// <param name="format">HTML,CSV,TEXT,EXCEL,XML</param>
    public void SaveAsFile(string format)
    {
    if (this.outputFile == null)
    throw new Exception("没有指定输出文件路径!");

    try
    {
    switch (format)
    {
    case "HTML":
    {
    workBook.SaveAs(outputFile, Excel.XlFileFormat.xlHtml, missing, missing, missing, missing, Excel.XlSaveAsAccessMode.xlExclusive, missing, missing, missing, missing, missing);
    break;
    }
    case "CSV":
    {
    workBook.SaveAs(outputFile, Excel.XlFileFormat.xlCSV, missing, missing, missing, missing, Excel.XlSaveAsAccessMode.xlExclusive, missing, missing, missing, missing, missing);
    break;
    }
    case "TEXT":
    {
    workBook.SaveAs(outputFile, Excel.XlFileFormat.xlHtml, missing, missing, missing, missing, Excel.XlSaveAsAccessMode.xlExclusive, missing, missing, missing, missing, missing);
    break;
    }
    default:
    {
    workBook.SaveAs(outputFile, missing, missing, missing, missing, missing, Excel.XlSaveAsAccessMode.xlExclusive, missing, missing, missing, missing, missing);
    break;
    }
    }
    }
    catch (Exception e)
    {
    throw e;
    }
    finally
    {
    this.Quit();
    }
    }

    /// <summary>
    /// 另存文件
    /// </summary>
    /// <param name="fileName">文件名</param>
    public void SaveFile(string fileName)
    {
    try
    {
    workBook.SaveAs(fileName, missing, missing, missing, missing, missing, Excel.XlSaveAsAccessMode.xlExclusive, missing, missing, missing, missing, missing);
    }
    catch (Exception e)
    {
    throw e;
    }
    finally
    {
    this.Quit();

    }
    }

    /// <summary>
    /// 将Excel文件另存为指定格式
    /// </summary>
    /// <param name="fileName">文件名</param>
    /// <param name="format">HTML,CSV,TEXT,EXCEL,XML</param>
    public void SaveAsFile(string fileName, string format)
    {
    try
    {
    switch (format)
    {
    case "HTML":
    {
    workBook.SaveAs(fileName, Excel.XlFileFormat.xlHtml, missing, missing, missing, missing, Excel.XlSaveAsAccessMode.xlExclusive, missing, missing, missing, missing, missing);
    break;
    }
    case "CSV":
    {
    workBook.SaveAs(fileName, Excel.XlFileFormat.xlCSV, missing, missing, missing, missing, Excel.XlSaveAsAccessMode.xlExclusive, missing, missing, missing, missing, missing);
    break;
    }
    case "TEXT":
    {
    workBook.SaveAs(fileName, Excel.XlFileFormat.xlHtml, missing, missing, missing, missing, Excel.XlSaveAsAccessMode.xlExclusive, missing, missing, missing, missing, missing);
    break;
    }
    default:
    {
    workBook.SaveAs(fileName, missing, missing, missing, missing, missing, Excel.XlSaveAsAccessMode.xlExclusive, missing, missing, missing, missing, missing);
    break;
    }
    }
    }
    catch (Exception e)
    {
    throw e;
    }
    finally
    {
    this.Quit();
    }
    }
    #endregion

    #endregion

    #region 私有方法

    /// <summary>
    /// 结束Excel进程
    /// </summary>
    public void KillExcelProcess(bool bAll)
    {
    if (bAll)
    {
    Process[] myProcesses;
    myProcesses = Process.GetProcessesByName("Excel");

    //得不到Excel进程ID,暂时只能判断进程启动时间
    foreach (Process myProcess in myProcesses)
    {
    myProcess.Kill();
    continue;
    }
    }
    else
    {
    KillSpecialExcel();
    }
    }

    [DllImport("user32.dll", SetLastError = true)]
    static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);

    /// <summary>
    /// 结束Excel进程(特殊方式)
    /// </summary>
    public void KillSpecialExcel()
    {
    try
    {
    if (excelApp != null)
    {
    int lpdwProcessId = 0;
    GetWindowThreadProcessId((IntPtr)excelApp.Hwnd, out lpdwProcessId);
    //c-s方式
    if (lpdwProcessId > 0)
    {
    System.Diagnostics.Process.GetProcessById(lpdwProcessId).Kill();
    }
    else
    {
    Quit();
    }
    }
    }
    catch { }
    }

    /// <summary>
    /// 退出
    /// </summary>
    public void Quit()
    {
    if (workBook != null)
    workBook.Close(null, null, null);
    if (excelApp != null)
    {
    excelApp.Workbooks.Close();
    excelApp.Quit();
    }

    if (range != null)
    {
    System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
    range = null;
    }
    if (range1 != null)
    {
    System.Runtime.InteropServices.Marshal.ReleaseComObject(range1);
    range1 = null;
    }
    if (range2 != null)
    {
    System.Runtime.InteropServices.Marshal.ReleaseComObject(range2);
    range2 = null;
    }
    if (textBox != null)
    {
    System.Runtime.InteropServices.Marshal.ReleaseComObject(textBox);
    textBox = null;
    }
    if (workSheet != null)
    {
    System.Runtime.InteropServices.Marshal.ReleaseComObject(workSheet);
    workSheet = null;
    }
    if (workBook != null)
    {
    System.Runtime.InteropServices.Marshal.ReleaseComObject(workBook);

    workBook = null;
    }
    if (excelApp != null)
    {
    System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
    excelApp = null;
    }
    GC.Collect();
    }//end Quit
    #endregion
    }
    }
  • 相关阅读:
    生成器表达式
    列表生成式
    内置---排序(sorted)
    移动端摘要
    支付宝支付框js代码
    list-style-image不能设置位置
    vue-cli
    微信底部的菜单栏
    input在标签内设置禁止输入空格
    访问对象
  • 原文地址:https://www.cnblogs.com/ghypnus/p/2412417.html
Copyright © 2020-2023  润新知