• DataSet导出到Excel,并生成文件(C#实现,可合并行和列)


    using System;
    using System.IO;
    using System.Data;
    using System.Reflection;
    using System.Diagnostics;
    using System.Configuration;
    using System.Collections;
    using Excel;

    namespace thscjy
    {
     ///
     /// 套用模板输出Excel,生成xls文件和html文件
     /// Author: Liu Wen
     /// Date Created: 2006-8
     ///
     public class ExportExcel
     {
      #region variable member 成员变量
      protected string templateFile = null;
      protected string excelFile = null;
      protected string htmlFile = null;
      protected object missing = Missing.Value;
      Excel.ApplicationClass app;
      Excel.Workbook book;
      Excel.Worksheet sheet;
      Excel.Range range;
      private DateTime beforeTime;  //Excel启动之前时间
      private DateTime afterTime;  //Excel启动之后时间
      //private int processID;
      #endregion

      ///
      /// 构造函数,将一个已有Excel工作簿作为模板,并指定输出路径
      ///
      /// Excel模板文件路径
      /// Excel输出文件路径
      /// Html输出文件路径
      public ExportExcel(string templateFile, string excelFile, string htmlFile)
      {
       if (templateFile == null)
        throw new Exception("Excel模板文件路径不能为空!");

       if (excelFile == null)
        throw new Exception("Excel输出文件路径不能为空!");

       if (htmlFile == null)
        throw new Exception("Html输出文件路径不能为空!");

       if (!File.Exists(templateFile))
        throw new Exception("指定路径的Excel模板文件不存在!");

       this.templateFile = templateFile;
       this.excelFile = excelFile;
       this.htmlFile = htmlFile;

       //创建一个Application对象
       beforeTime = DateTime.Now;
       app = new ApplicationClass();
       //app.Visible = true;
       //processID = Process.GetCurrentProcess().Id;
       afterTime = DateTime.Now;

       //打开模板文件,得到WorkBook对象
       try
       {
        book = app.Workbooks.Open(templateFile,missing,missing,missing,missing,missing,
         missing,missing,missing,missing,missing,missing,missing,missing,missing);
       }
       catch (Exception e)
       {
        throw e;
       }
       //得到WorkSheet对象
       sheet = (Excel.Worksheet)book.Sheets.get_Item(1);
      }

      #region 插入报表参数
      ///
      /// 录入报表的参数(TJ统计用)
      ///
      /// 填报单位
      /// 年月
      /// 填报人
      /// 填报日期
      /// 插入数据的单元格
      public void InsertArgs(string department, string date, string accountant, string dateCreated, string cellID)
      {
       sheet.get_Range("A3", missing).Value2 = "填报单位:"+department;
       sheet.get_Range("D3", missing).Value2 = date;
       sheet.get_Range(cellID, missing).Value2 = "部门负责人:       填报人:"+accountant+" 联系电话:                 报送时间:"+dateCreated;
       //sheet.get_Range("I8", missing).Value2 = "填报日期:"+dateCreated;
      }

      ///
      /// 录入报表的参数(JH计划用)
      ///
      /// 标题
      public void InsertArgsJH(string name)
      {
       sheet.get_Range("A1", missing).Value2 = name;
      }

      ///
      /// 录入报表的参数(JH计划用)
      ///
      /// 标题
      /// 年份
      public void InsertArgsJH(string name, string year)
      {
       sheet.get_Range("A1", missing).Value2 = name;
       sheet.get_Range("D2", missing).Value2 = year;
      }

      ///
      /// 录入报表的参数(JH计划用)
      ///
      /// 标题
      /// 部门
      /// “部门”单元格ID
      /// 年份
      /// “年份”单元格ID
      public void InsertArgsJH(string name, string department, string depCellId, string year, string yearCellId)
      {
       sheet.get_Range("A1", missing).Value2 = name;
       sheet.get_Range(depCellId, missing).Value2 = department;
       sheet.get_Range(yearCellId, missing).Value2 = year;
      }

      ///
      /// 录入报表的参数(JH计划用)
      ///
      /// 标题
      /// 注水
      /// 注气
      /// 措施工作量
      public void InsertArgsJH(string name, string water, string gas, string workload)
      {
       sheet.get_Range("A1", missing).Value2 = name;
       sheet.get_Range("C2", missing).Value2 = water;
       sheet.get_Range("E2", missing).Value2 = gas;
       sheet.get_Range("G2", missing).Value2 = workload;
      }
      #endregion

      #region 导出Excel方法

      ///
      /// 将DataTable数据导出到Excel(可动态插入行)
      ///
      /// DataTable
      /// 插入行的索引
      /// 插入列的索引
      public void DataTableToExcel(System.Data.DataTable dt, int rowIndex, int colIndex)
      {
       int rowCount = dt.Rows.Count;  //DataTable行数
       int colCount = dt.Columns.Count; //DataTable列数
       int iRow;
       int iCol;

       //将数据导出到相应的单元格
       for (iRow = 0; iRow < rowCount; iRow++)
       {
        //插入新行
        this.InsertRows(sheet, iRow+rowIndex);
        //填充当前行
        for (iCol = 0; iCol < colCount; iCol++)
        {
         sheet.Cells[iRow+rowIndex, iCol+colIndex] = dt.Rows[iRow][iCol].ToString();
        }
       }
       this.DeleteRows(sheet, rowCount+rowIndex); 

       //this.OutputFile();

       //Excel.QueryTables qts = sheet.QueryTables;
       //Excel.QueryTable qt = qts.Add(,,);
       //qt.RefreshStyle = Excel.XlCellInsertionMode.xlInsertEntireRows;
       //qt.Refresh();
      }

      ///
      /// 将DataTable数据导出到Excel(可动态插入行)
      ///
      /// DataTable
      /// 插入数据的起始单元格
      public void DataTableToExcel(System.Data.DataTable dt, string cellID)
      {
       int rowIndex = sheet.get_Range(cellID, missing).Row;
       int colIndex = sheet.get_Range(cellID, missing).Column;
       int rowCount = dt.Rows.Count;  //DataTable行数
       int colCount = dt.Columns.Count; //DataTable列数
       int iRow;
       int iCol;

       //利用二维数组批量写入
       string[,] array = new string[rowCount,colCount];
       for (iRow = 0; iRow < rowCount; iRow++)
       {
        for (iCol = 0; iCol < colCount; iCol++)
        {
         array[iRow,iCol] = dt.Rows[iRow][iCol].ToString();
        }
       }

       for (iRow = 0; iRow < rowCount; iRow++)
       {
        this.InsertRows(sheet, iRow+rowIndex);
       }
       this.DeleteRows(sheet, rowCount+rowIndex);

       range  = sheet.get_Range(cellID, missing);
       range = range.get_Resize(rowCount, colCount);
       range.Value2 = array;
      }

      ///
      /// 将DataTable数据导出到Excel(固定)
      ///
      /// DataTable
      /// 插入数据的起始单元格
      public void DataTableToExcel2(System.Data.DataTable dt, string cellID)
      {
       int rowCount = dt.Rows.Count;  //DataTable行数
       int colCount = dt.Columns.Count; //DataTable列数
       int iRow;
       int iCol;

       //利用二维数组批量写入
       string[,] array = new string[rowCount,colCount];
       for (iRow = 0; iRow < rowCount; iRow++)
       {
        for (iCol = 0; iCol < colCount; iCol++)
        {
         array[iRow,iCol] = dt.Rows[iRow][iCol].ToString();
        }
       }

       range  = sheet.get_Range(cellID, missing);
       range = range.get_Resize(rowCount, colCount);
       range.Value2 = array;
      }
      #endregion

      ///
      /// 最后调用,释放相关资源,完成
      ///
      public void Finalize()
      {
       this.OutputFile();
       GC.Collect();
       //this.KillExcelProcess();
      }

      ///
      /// 输出生成的Excel, Html文件
      ///
      private void OutputFile()
      {
       //如果文件已存在,删除,重新生成
       if (File.Exists(excelFile))
       {
        File.Delete(excelFile);
       }
       if (File.Exists(htmlFile))
       {
        File.Delete(htmlFile);
       }
       try
       {
        book.SaveAs(excelFile, missing, missing, missing, missing, missing,
         Excel.XlSaveAsAccessMode.xlExclusive, missing, missing, missing, missing,missing);

        book.SaveAs(htmlFile, Excel.XlFileFormat.xlHtml, missing, missing, missing, missing,
         Excel.XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing, missing);
       }
       catch (Exception e)
       {
        throw e;
       }
       finally
       {
        this.Dispose();
       }
      }

      ///
      /// 在工作表中插入行,并调整其他行以留出空间
      ///
      /// 当前工作表
      /// 欲插入的行索引
      private void InsertRows(Excel.Worksheet sheet, int rowIndex)
      {
       range = (Excel.Range)sheet.Rows[rowIndex, missing];  
       //object Range.Insert(object shift, object copyorigin);
       //shift: Variant类型,可选。指定单元格的调整方式。可以为下列 XlInsertShiftDirection 常量之一:
       //xlShiftToRight 或 xlShiftDown。如果省略该参数,Microsoft Excel 将根据区域形状确定调整方式。
       range.Insert(Excel.XlInsertShiftDirection.xlShiftDown, missing);  
      }

      ///
      /// 在工作表中删除行
      ///
      /// 当前工作表
      /// 欲删除的行索引
      private void DeleteRows(Excel.Worksheet sheet, int rowIndex)
      {
       range = (Range)sheet.Rows[rowIndex, missing];
       range.Delete(Excel.XlDeleteShiftDirection.xlShiftUp);
      }

      ///
      /// 退出Excel,并且释放调用的COM资源
      ///
      private void Dispose()
      {
       book.Close(missing, missing, missing);
       app.Workbooks.Close();
       app.Quit();

       if (range != null)
       {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
        range = null;
       }
       if (sheet != null)
       {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
        sheet = null;
       }
       if (book != null)
       {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(book);
        book = null;
       }
       if (app != null)
       {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
        app = null;
       }

       //System.GC.Collect();
       //GC.WaitForPendingFinalizers();
       //this.KillExcelProcess();
       //Process pro = Process.GetProcessById(processID);
       //pro.Kill();
      }

      ///
      /// 结束Excel进程
      ///
      private void KillExcelProcess()
      {
       DateTime startTime;
       Process[] processes = Process.GetProcessesByName("Excel");

       //得不到Excel进程ID,暂时只能判断进程启动时间
       foreach (Process process in processes)
       {
        startTime = process.StartTime;
        if(startTime > beforeTime && startTime < afterTime)
        {
         process.Kill();
        }
       }
      }

     }
    }

  • 相关阅读:
    java 笔记(2) 接口作为引用数据类型
    linux 笔记(5)让vi或vim显示行数和不显示行数
    linux 笔记(4)Ubuntu 使用时vi编辑器时,不能使用backspace键来进行退格或者不能正常使用
    linux 笔记(3)sudo passwd 设置root用户的密码
    matlab笔记(1) 元胞结构cell2mat和num2cell
    linux 笔记(2) 目录直接强行删除rm -rf *(删除当前目录所有的内容)
    linux 笔记(1) ctrl+c,ctrl+z,ctrl+d
    C51单片机项目:红绿灯
    C51单片机项目:时钟
    java 笔记(1)在子类中,一定要访问父类的有参构造方法?
  • 原文地址:https://www.cnblogs.com/xulang/p/5506188.html
Copyright © 2020-2023  润新知