引用:通过Com 引用 Microsoft Excel 5.0 对象程序库,引用后 bin 文件夹中会出现 Interop.Excel.dll ,Microsoft.Vbe.Interop.dll , Office.dll 三个文件。þÎ|ºe½bbs.51aspx.com@²g\³%{ø
//=====================ExcelHelper(套用模板输出Excel,并对数据进行分页)==============þÎ|ºe½bbs.51aspx.com@²g\³%{ø
using System;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
using System.IO;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
using System.Data;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
using System.Reflection;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
using System.Diagnostics;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
using cfg = System.Configuration;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
using Excel;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
namespace ExcelHelperþÎ|ºe½bbs.51aspx.com@²g\³%{ø
{þÎ|ºe½bbs.51aspx.com@²g\³%{ø
þÎ|ºe½bbs.51aspx.com@²g\³%{ø
/// <summary> þÎ|ºe½bbs.51aspx.com@²g\³%{ø
/// 功能说明:套用模板输出Excel,并对数据进行分页þÎ|ºe½bbs.51aspx.com@²g\³%{ø
/// </summary> þÎ|ºe½bbs.51aspx.com@²g\³%{ø
public class ExcelHelperþÎ|ºe½bbs.51aspx.com@²g\³%{ø
{þÎ|ºe½bbs.51aspx.com@²g\³%{ø
protected string templetFile = null;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
protected string outputFile = null;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
protected object missing = Missing.Value;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
/// <summary> þÎ|ºe½bbs.51aspx.com@²g\³%{ø
/// 构造函数,需指定模板文件和输出文件完整路径þÎ|ºe½bbs.51aspx.com@²g\³%{ø
/// </summary> þÎ|ºe½bbs.51aspx.com@²g\³%{ø
/// <param name="templetFilePath"> Excel模板文件路径 </param> þÎ|ºe½bbs.51aspx.com@²g\³%{ø
/// <param name="outputFilePath"> 输出Excel文件路径 </param> þÎ|ºe½bbs.51aspx.com@²g\³%{ø
public ExcelHelper(string templetFilePath, string outputFilePath)þÎ|ºe½bbs.51aspx.com@²g\³%{ø
{þÎ|ºe½bbs.51aspx.com@²g\³%{ø
if (templetFilePath == null)þÎ|ºe½bbs.51aspx.com@²g\³%{ø
throw new Exception(" Excel模板文件路径不能为空! ");þÎ|ºe½bbs.51aspx.com@²g\³%{ø
if (outputFilePath == null)þÎ|ºe½bbs.51aspx.com@²g\³%{ø
throw new Exception(" 输出Excel文件路径不能为空! ");þÎ|ºe½bbs.51aspx.com@²g\³%{ø
if (!File.Exists(templetFilePath))þÎ|ºe½bbs.51aspx.com@²g\³%{ø
throw new Exception(" 指定路径的Excel模板文件不存在! ");þÎ|ºe½bbs.51aspx.com@²g\³%{ø
this.templetFile = templetFilePath;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
this.outputFile = outputFilePath;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
}þÎ|ºe½bbs.51aspx.com@²g\³%{ø
/**/þÎ|ºe½bbs.51aspx.com@²g\³%{ø
/// <summary> þÎ|ºe½bbs.51aspx.com@²g\³%{ø
/// 将DataTable数据写入Excel文件(套用模板并分页)þÎ|ºe½bbs.51aspx.com@²g\³%{ø
/// </summary> þÎ|ºe½bbs.51aspx.com@²g\³%{ø
/// <param name="dt"> DataTable </param> þÎ|ºe½bbs.51aspx.com@²g\³%{ø
/// <param name="rows"> 每个WorkSheet写入多少行数据 </param> þÎ|ºe½bbs.51aspx.com@²g\³%{ø
/// <param name="top"> Excel中行索引 </param> þÎ|ºe½bbs.51aspx.com@²g\³%{ø
/// <param name="left"> Excel中列索引 </param> þÎ|ºe½bbs.51aspx.com@²g\³%{ø
/// <param name="sheetPrefixName"> WorkSheet前缀名,比如:前缀名为“Sheet”,那么WorkSheet名称依次为“Sheet-1,Sheet-2” </param> þÎ|ºe½bbs.51aspx.com@²g\³%{ø
public void DataTableToExcel(System.Data.DataTable dt, int rows, int top, int left, string sheetPrefixName)þÎ|ºe½bbs.51aspx.com@²g\³%{ø
{þÎ|ºe½bbs.51aspx.com@²g\³%{ø
int rowCount = dt.Rows.Count; // 源DataTable行数 þÎ|ºe½bbs.51aspx.com@²g\³%{ø
int colCount = dt.Columns.Count; // 源DataTable列数 þÎ|ºe½bbs.51aspx.com@²g\³%{ø
int sheetCount = this.GetSheetCount(rowCount, rows); // WorkSheet个数 þÎ|ºe½bbs.51aspx.com@²g\³%{ø
DateTime beforeTime;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
DateTime afterTime;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
if (sheetPrefixName == null || sheetPrefixName.Trim() == "")þÎ|ºe½bbs.51aspx.com@²g\³%{ø
sheetPrefixName = " Sheet ";þÎ|ºe½bbs.51aspx.com@²g\³%{ø
// 创建一个Application对象并使其可见 þÎ|ºe½bbs.51aspx.com@²g\³%{ø
beforeTime = DateTime.Now;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
Excel.Application app = new Excel.ApplicationClass();þÎ|ºe½bbs.51aspx.com@²g\³%{ø
app.Visible = true;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
afterTime = DateTime.Now;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
// 打开模板文件,得到WorkBook对象 (网上都是13个参数,现在变成14个参数了)þÎ|ºe½bbs.51aspx.com@²g\³%{ø
Excel.Workbook workBook = app.Workbooks.Open(templetFile, missing, missing, missing, missing, missing,þÎ|ºe½bbs.51aspx.com@²g\³%{ø
missing, missing, missing, missing, missing, missing, missing, missing, missing);þÎ|ºe½bbs.51aspx.com@²g\³%{ø
// 得到WorkSheet对象 þÎ|ºe½bbs.51aspx.com@²g\³%{ø
Excel.Worksheet workSheet = (Excel.Worksheet)workBook.Sheets.get_Item(1);þÎ|ºe½bbs.51aspx.com@²g\³%{ø
// 复制sheetCount-1个WorkSheet对象 þÎ|ºe½bbs.51aspx.com@²g\³%{ø
for (int i = 1; i < sheetCount; i++)þÎ|ºe½bbs.51aspx.com@²g\³%{ø
{þÎ|ºe½bbs.51aspx.com@²g\³%{ø
((Excel.Worksheet)workBook.Worksheets.get_Item(i)).Copy(missing, workBook.Worksheets);þÎ|ºe½bbs.51aspx.com@²g\³%{ø
}þÎ|ºe½bbs.51aspx.com@²g\³%{ø
þÎ|ºe½bbs.51aspx.com@²g\³%{ø
for (int i = 1; i <= sheetCount; i++)þÎ|ºe½bbs.51aspx.com@²g\³%{ø
{þÎ|ºe½bbs.51aspx.com@²g\³%{ø
int startRow = (i - 1) * rows; // 记录起始行索引 þÎ|ºe½bbs.51aspx.com@²g\³%{ø
int endRow = i * rows; // 记录结束行索引þÎ|ºe½bbs.51aspx.com@²g\³%{ø
// 若是最后一个WorkSheet,那么记录结束行索引为源DataTable行数 þÎ|ºe½bbs.51aspx.com@²g\³%{ø
if (i == sheetCount)þÎ|ºe½bbs.51aspx.com@²g\³%{ø
endRow = rowCount;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
// 获取要写入数据的WorkSheet对象,并重命名 þÎ|ºe½bbs.51aspx.com@²g\³%{ø
Excel.Worksheet sheet = (Excel.Worksheet)workBook.Worksheets.get_Item(i);þÎ|ºe½bbs.51aspx.com@²g\³%{ø
sheet.Name = sheetPrefixName + " - " + i.ToString();þÎ|ºe½bbs.51aspx.com@²g\³%{ø
// 将dt中的数据写入WorkSheet þÎ|ºe½bbs.51aspx.com@²g\³%{ø
for (int j = 0; j < endRow - startRow; j++)þÎ|ºe½bbs.51aspx.com@²g\³%{ø
{þÎ|ºe½bbs.51aspx.com@²g\³%{ø
for (int k = 0; k < colCount; k++)þÎ|ºe½bbs.51aspx.com@²g\³%{ø
{þÎ|ºe½bbs.51aspx.com@²g\³%{ø
sheet.Cells[top + j, left + k] = dt.Rows[startRow + j][k].ToString();þÎ|ºe½bbs.51aspx.com@²g\³%{ø
}þÎ|ºe½bbs.51aspx.com@²g\³%{ø
}þÎ|ºe½bbs.51aspx.com@²g\³%{ø
//// ====================写文本框数据(有错误注释掉了)============= þÎ|ºe½bbs.51aspx.com@²g\³%{ø
//Excel.TextBox txtAuthor = (Excel.TextBox)sheet.TextBoxes(" txtAuthor ");þÎ|ºe½bbs.51aspx.com@²g\³%{ø
//Excel.TextBox txtDate = (Excel.TextBox)sheet.TextBoxes(" txtDate ");þÎ|ºe½bbs.51aspx.com@²g\³%{ø
//Excel.TextBox txtVersion = (Excel.TextBox)sheet.TextBoxes(" txtVersion ");þÎ|ºe½bbs.51aspx.com@²g\³%{ø
//txtAuthor.Text = " KLY.NET的Blog ";þÎ|ºe½bbs.51aspx.com@²g\³%{ø
//txtDate.Text = DateTime.Now.ToShortDateString();þÎ|ºe½bbs.51aspx.com@²g\³%{ø
//txtVersion.Text = " 1.0.0.0 ";þÎ|ºe½bbs.51aspx.com@²g\³%{ø
þÎ|ºe½bbs.51aspx.com@²g\³%{ø
sheet.Cells[rows + 1, left + 1] = "总计:10000";þÎ|ºe½bbs.51aspx.com@²g\³%{ø
sheet.Cells[rows + 1, left + 5] = "编码:10000";þÎ|ºe½bbs.51aspx.com@²g\³%{ø
}þÎ|ºe½bbs.51aspx.com@²g\³%{ø
þÎ|ºe½bbs.51aspx.com@²g\³%{ø
// 输出Excel文件并退出 þÎ|ºe½bbs.51aspx.com@²g\³%{ø
tryþÎ|ºe½bbs.51aspx.com@²g\³%{ø
{ þÎ|ºe½bbs.51aspx.com@²g\³%{ø
//(网上是11个参数,现在是12个参数)þÎ|ºe½bbs.51aspx.com@²g\³%{ø
workBook.SaveAs(outputFile, missing, missing, missing, missing, missing, Excel.XlSaveAsAccessMode.xlExclusive, missing, missing, missing, missing, missing);þÎ|ºe½bbs.51aspx.com@²g\³%{ø
workBook.Close(null, null, null);þÎ|ºe½bbs.51aspx.com@²g\³%{ø
app.Workbooks.Close();þÎ|ºe½bbs.51aspx.com@²g\³%{ø
app.Application.Quit();þÎ|ºe½bbs.51aspx.com@²g\³%{ø
app.Quit();þÎ|ºe½bbs.51aspx.com@²g\³%{ø
System.Runtime.InteropServices.Marshal.ReleaseComObject(workSheet);þÎ|ºe½bbs.51aspx.com@²g\³%{ø
System.Runtime.InteropServices.Marshal.ReleaseComObject(workBook);þÎ|ºe½bbs.51aspx.com@²g\³%{ø
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);þÎ|ºe½bbs.51aspx.com@²g\³%{ø
workSheet = null;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
workBook = null;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
app = null;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
GC.Collect();þÎ|ºe½bbs.51aspx.com@²g\³%{ø
}þÎ|ºe½bbs.51aspx.com@²g\³%{ø
catch (Exception e)þÎ|ºe½bbs.51aspx.com@²g\³%{ø
{þÎ|ºe½bbs.51aspx.com@²g\³%{ø
throw e;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
}þÎ|ºe½bbs.51aspx.com@²g\³%{ø
finallyþÎ|ºe½bbs.51aspx.com@²g\³%{ø
{þÎ|ºe½bbs.51aspx.com@²g\³%{ø
Process[] myProcesses;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
DateTime startTime;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
myProcesses = Process.GetProcessesByName(" Excel ");þÎ|ºe½bbs.51aspx.com@²g\³%{ø
// 得不到Excel进程ID,暂时只能判断进程启动时间 þÎ|ºe½bbs.51aspx.com@²g\³%{ø
foreach (Process myProcess in myProcesses)þÎ|ºe½bbs.51aspx.com@²g\³%{ø
{þÎ|ºe½bbs.51aspx.com@²g\³%{ø
startTime = myProcess.StartTime;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
if (startTime > beforeTime && startTime < afterTime)þÎ|ºe½bbs.51aspx.com@²g\³%{ø
{þÎ|ºe½bbs.51aspx.com@²g\³%{ø
myProcess.Kill();þÎ|ºe½bbs.51aspx.com@²g\³%{ø
}þÎ|ºe½bbs.51aspx.com@²g\³%{ø
}þÎ|ºe½bbs.51aspx.com@²g\³%{ø
}þÎ|ºe½bbs.51aspx.com@²g\³%{ø
}þÎ|ºe½bbs.51aspx.com@²g\³%{ø
þÎ|ºe½bbs.51aspx.com@²g\³%{ø
/**/þÎ|ºe½bbs.51aspx.com@²g\³%{ø
/// <summary> þÎ|ºe½bbs.51aspx.com@²g\³%{ø
/// 获取WorkSheet数量þÎ|ºe½bbs.51aspx.com@²g\³%{ø
/// </summary> þÎ|ºe½bbs.51aspx.com@²g\³%{ø
/// <param name="rowCount"> 记录总行数 </param> þÎ|ºe½bbs.51aspx.com@²g\³%{ø
/// <param name="rows"> 每WorkSheet行数 </param> þÎ|ºe½bbs.51aspx.com@²g\³%{ø
private int GetSheetCount(int rowCount, int rows)þÎ|ºe½bbs.51aspx.com@²g\³%{ø
{þÎ|ºe½bbs.51aspx.com@²g\³%{ø
int n = rowCount % rows; // 余数þÎ|ºe½bbs.51aspx.com@²g\³%{ø
if (n == 0)þÎ|ºe½bbs.51aspx.com@²g\³%{ø
return rowCount / rows;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
elseþÎ|ºe½bbs.51aspx.com@²g\³%{ø
return Convert.ToInt32(rowCount / rows) + 1;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
}þÎ|ºe½bbs.51aspx.com@²g\³%{ø
}þÎ|ºe½bbs.51aspx.com@²g\³%{ø
}þÎ|ºe½bbs.51aspx.com@²g\³%{ø
þÎ|ºe½bbs.51aspx.com@²g\³%{ø
使用示例:þÎ|ºe½bbs.51aspx.com@²g\³%{ø
public partial class _Default : System.Web.UI.Page þÎ|ºe½bbs.51aspx.com@²g\³%{ø
{þÎ|ºe½bbs.51aspx.com@²g\³%{ø
þÎ|ºe½bbs.51aspx.com@²g\³%{ø
ExcelHelper.ExcelHelper excel =null;þÎ|ºe½bbs.51aspx.com@²g\³%{ø
protected void Page_Load(object sender, EventArgs e)þÎ|ºe½bbs.51aspx.com@²g\³%{ø
{þÎ|ºe½bbs.51aspx.com@²g\³%{ø
excel = new ExcelHelper.ExcelHelper(Server.MapPath("tempt/BJStock.xls"), Server.MapPath("ExcelFile/test.xls"));þÎ|ºe½bbs.51aspx.com@²g\³%{ø
}þÎ|ºe½bbs.51aspx.com@²g\³%{ø
protected void Button1_Click(object sender, EventArgs e)þÎ|ºe½bbs.51aspx.com@²g\³%{ø
{þÎ|ºe½bbs.51aspx.com@²g\³%{ø
excel.DataTableToExcel(DbHelperSQL.DbHelperSQL.GetDataTable("select * from excel"), 2, 1, 1, "Sheet");þÎ|ºe½bbs.51aspx.com@²g\³%{ø
Response.Redirect("ExcelFile/test.xls");þÎ|ºe½bbs.51aspx.com@²g\³%{ø
}þÎ|ºe½bbs.51aspx.com@²g\³%{ø
}þÎ|ºe½bbs.51aspx.com@²g\³%{ø