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();
    }
   }
  }

}
}

DataSet导出到Excel,并生成文件(C#实现,可合并行和列)的更多相关文章

  1. asp.net教程:GridView导出到Excel或Word文件

    asp.net教程:GridView导出到Excel或Word文件</ br> 在项目中我们经常会遇到要求将一些数据导出成Excel或者Word表格的情况,比如中国移动(我是中国移动用户) ...

  2. .net DataSet 导出到Excel

    public void CreateExcel(DataSet ds, string typeid, stringFileName)        {           HttpResponse r ...

  3. 【C#】Excel导出合并行和列并动态加载行与列

    简单的Excel导出比较好做,只要设置表头,循环在表格中赋值添加数据即可,但是如果表头是不固定的,并且个数是不确定的,这就需要根据查询出数据的特点来添加导出了. 导出效果图: 如上图所示,商品的个数是 ...

  4. DataSet导出到Excel文件

    public static void ExportToExcel(DataSet source, string fileName) { System.IO.StreamWriter excelDoc ...

  5. dataset导出成excel

    之前网上查找了很多关于这类的代码.要不是中文乱码,要不是就是太复杂.这个是我用过最好用的. //ds为数据源,filename为保存的文件名 publicvoidCreateExcel(DataSet ...

  6. ASP.NET用DataSet导出到Excel

    //读取临时文件    GYYW.DA.Common.Base_SqlDataBase daBZDM = new GYYW.DA.Common.Base_SqlDataBase();    DataS ...

  7. .Net 中DataSet导出为excel的方法

    依旧是留下代码防止以后忘记 protected void Export_Click(object sender, EventArgs e) { DataSet data = "" ...

  8. laravel 导出导入excel和csv文件的 使用

    在项目中用到的常用功能数据导入导出 在laravel有插件可以直接使用 方便快捷 学习源头: https://www.cnblogs.com/martianShu/p/5869270.html htt ...

  9. pandas 读写excel 操作(按索引和关键字读取行和列,写入csv文件)

    pandas读写excel和csv操作总结 按索引读取某一列的值 按关键字读取某一列的值 按关键字查询某一行的值 保存成字典并写入新的csv import pandas as pd grades=pd ...

随机推荐

  1. Object c 基础知识

    文件类型说明:.h 头文件,用于定义类.实例变量及类中的方法等定义信息(interface)..m 源文件,定义方法体,可实现objce-c和c方法(implementation)..mm c++源文 ...

  2. apache服务器配置Net的实践

    前置: 在xp系统中,打补丁之类或啥子操作引起或多或少的问题,最终导致iis不能使用: 不想装系统...忍着... 最近突发事件导致,需要摸一下apache服务器处理,好吧,那就搜索下吧..... 目 ...

  3. spring 启动流程

    AbstractApplicationContext 分析 启动流程 // Prepare this context for refreshing.prepareRefresh(); 1. // In ...

  4. PHP实现简单的监控nginx日志文件功能

    此功能是为了实现,定时监控nginx生成的日志数据,并将新增的数据提交到一个接口(比如大数据的接口,让大数据来进行分析) define("MAX_SHOW", 8192*5); / ...

  5. Django数据模型及操作

    转自:http://blog.sina.com.cn/s/blog_a73687bc0101cygy.html (一) 初始化测试运行环境 import os; import sys; sys.pat ...

  6. ORA-12170:TNS:连接超时

    本文转自 http://www.cnblogs.com/kerrycode/archive/2012/12/14/2818421.html 1:首先检查网络是否能ping通 2:检查TNS配置(TNS ...

  7. ES6 Promise 接口

    构造函数 new Promise(function(resolve, reject){}); 构造函数接受一个函数(executor)作为参数,该函数在返回 Promise 实例之前被调用.函数的两个 ...

  8. 在Visual Studio 2010中进行“项目重命名”的有效工具

    地址:http://www.cnblogs.com/dudu/archive/2011/12/11/visual_studio_2010_project_rename.html 提示:这个工具一次 r ...

  9. window xp Apache与Tomcat集群配置--转载

    转载地址:http://www.cnblogs.com/obullxl/archive/2011/06/09/apache-tomcat-cluster-config.html 一. 环境说明 Win ...

  10. Hadoop第4周练习—HDFS读写文件操作

    1    运行环境说明... 3 :编译并运行<权威指南>中的例3.2. 3 内容... 3 2.3.1   创建代码目录... 4 2.3.2   建立例子文件上传到hdfs中... 4 ...