我有一个 Windows 窗体应用程序,在其中将数据绑定到列表视图。现在,我必须单击导出按钮将列表视图中的数据导出到 Excel 文件。当我选择 17 天的数据(即近 5 万行)时,需要 40 到 45 分钟才能完成导出。如果可能的话,我需要它在 5 分钟内更快地处理 100k 行。
private void btnExport_Click(object sender, EventArgs e)
{
try
{
btnExport.Enabled = false;
lblExportData.Visible = true;
lblExportData.Enabled = true;
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook wb = app.Workbooks.Add(1);
Microsoft.Office.Interop.Excel.Worksheet ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets[1];
int headerIndex = 1;
foreach (ColumnHeader columnHeader in lstUserActivity.Columns)
{
if (columnHeader.Width != 0)
{
Microsoft.Office.Interop.Excel.Range headerCell = (Range)ws.Cells[1, headerIndex];
headerCell.Value = columnHeader.Text;
headerCell.Font.Bold = true;
headerIndex++;
}
}
int rowIndex = 2;
foreach (ListViewItem lvi in lstUserActivity.Items)
{
int columnIndex = 1;
foreach (ColumnHeader columnHeader in lstUserActivity.Columns)
{
// Check if the width of the corresponding column header is not zero
if (columnHeader.Width != 0)
{
// Find the corresponding subitem based on the column index
ListViewItem.ListViewSubItem lvs = lvi.SubItems[columnHeader.Index];
ws.Cells[rowIndex, columnIndex] = lvs.Text;
columnIndex++;
}
}
rowIndex++;
}
ws.Columns.AutoFit(); // Move AutoFit here
string fileName = "ElectoralUserActivity_" + DateTime.Now.ToString("dd_MM_yyyy") + ".xlsx";
using (SaveFileDialog saveFileDialog = new SaveFileDialog())
{
saveFileDialog.Filter = "Excel Workbook (*.xlsx)|*.xlsx";
saveFileDialog.FileName = fileName;
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
wb.SaveAs(saveFileDialog.FileName);
app.Visible = true;
MessageBox.Show("Exporting completed. File saved as: " + saveFileDialog.FileName, "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
btnExport.Enabled = true;
lblExportData.Visible = false;
lblExportData.Enabled = false;
}
catch (Exception ex)
{
MessageBox.Show("An error occurred: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
btnExport.Enabled = true;
lblExportData.Visible = false;
lblExportData.Enabled = false;
}
}
是的,我建议使用
ClosedXml
在项目配置文件中:
<PackageReference Include="ClosedXML" Version="0.95.4" />
类代码有
ToExcel
方法,返回 byte[] 数组,您可以通过将 MemoryStream
替换为 FileStream + StreamWriter
来保存到文件:
using ClosedXML.Excel;
using System;
using System.Linq;
using System.Collections.Generic;
using System.IO;
public class Export
{
public static byte[] ToExcel(object[][] Data)
{
using IXLWorkbook workbook = new XLWorkbook();
IXLWorksheet worksheet = workbook.Worksheets.Add();
worksheet.Name = "Sheet1";
var enumerator = Data.GetEnumerator();
for (int r = 2; enumerator.MoveNext(); r++)
{
for (int c = 1; c <= Data[r-2].Length; c++)
{
object val = enumerator.Current[c - 1];
worksheet.Cell(r, c).Value = $"'{val}";
}
}
using var stream = new MemoryStream();
workbook.SaveAs(stream);
return stream.ToArray();
}
}