将(Oracle)数据库表导出到Excel,并生成文件,C#实现

将(Oracle)数据库表导出到Excel,并生成文件(C#实现)

关键词C#,ASP.NET,Excel

需添加项目引用:

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

}

}

}

}

}