本篇介绍 C# 中 使用 Microsoft.Office.Interop.Excel 将数据导出到Excel文件的方法。
一般少量的数据可以使用循环设置Excel单元格值的方式导出数据:
Worksheet.Cells[x, y] = value;
当数据条数很大时使用这种方式就会消耗大量时间。此时可以使用按区域设置数据源的方式进行数据导出:
Range.Value2 = data;
完整的代码如下:
using System;
using Microsoft.Office.Interop.Excel;
/// <summary>
/// 分页导出Excel
/// </summary>
/// <param name="dataTable">导出数据</param>
/// <param name="pageSize">分页数据条数</param>
/// <param name="fileName">导出文件名</param>
public static void ExportToExcel(System.Data.DataTable dataTable, int pageSize, string fileName)
{
Application app = new Application();
if (app == null) return; //Excel 启动失败
Workbook workbook = app.Workbooks.Add(Type.Missing);
Worksheet worksheet = (Worksheet)workbook.Worksheets.get_Item(1);
object missing = System.Reflection.Missing.Value;
long totalRow = dataTable.Rows.Count;
int totalPage = (int)((totalRow - 1) / pageSize) + 1;
for (int pageIndex = 1; pageIndex <= totalPage; pageIndex++)
{
if (pageIndex > 1)
{
worksheet = (Worksheet)workbook.Worksheets.Add(missing, missing, missing, missing); //添加新页
}
else
{
worksheet = (Worksheet)workbook.Worksheets[pageIndex]; //直接取第一页
}
//当前页的数据
string[,] pageData = new string[pageSize + 1, dataTable.Columns.Count + 1];
//设置表头(第一行)数据
for (int i = 0; i < dataTable.Columns.Count; i++)
{
pageData[0, i] = dataTable.Columns[i].Caption;
}
//当前页起始数据在源数据中的索引
int pageStartRowIndex = (pageIndex - 1) * pageSize;
//当前页行数索引,游标
int dataTableRowIndex = 0;
int curPageRowIndex = 0;
//当前页最后一行数据在源数据中的索引
int pageEndRowIndex;
if (pageSize * pageIndex >= dataTable.Rows.Count)
{
pageEndRowIndex = dataTable.Rows.Count;
}
else
{
pageEndRowIndex = int.Parse((pageSize * pageIndex).ToString());
}
// 当前页数据准备
for (dataTableRowIndex = pageStartRowIndex; dataTableRowIndex < pageEndRowIndex; dataTableRowIndex++)
{
curPageRowIndex = curPageRowIndex + 1;
for (int i = 0; i < dataTable.Columns.Count; i++)
{
if (dataTable.Columns[i].DataType == typeof(string) ||
dataTable.Columns[i].DataType == typeof(Decimal) ||
dataTable.Columns[i].DataType == typeof(DateTime))
{
object obj = dataTable.Rows[dataTableRowIndex][dataTable.Columns[i].ColumnName];
pageData[curPageRowIndex, i] = obj == null ? "" : obj.ToString().Trim();
}
}
}
Range range = worksheet.Range[worksheet.Cells[1, 1], worksheet.Cells[curPageRowIndex + 1, dataTable.Columns.Count]];
range.Value2 = pageData; //当前页数据填充
worksheet.Columns.EntireColumn.AutoFit(); //列宽自适应
}
if (fileName.Length > 0)
{
workbook.Saved = true;
workbook.SaveAs(fileName, XlFileFormat.xlWorkbookNormal,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
}
app.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
GC.Collect();
}
传入数据为 DataTable 格式。