需添加项目引用:
1. .NET->System.Data.OracleClient.dll
2. COM->Microsoft Excel 11.0 Object Library
代码如下:
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();
}
}
}
}
}