有没有更有效的方法可以更快地将数据从列表视图导出到Excel?

问题描述 投票:0回答:1

我有一个 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;
    }
}
c# .net winforms export-to-excel excel-interop
1个回答
0
投票

是的,我建议使用

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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.