C# C-如何更快地将列表导出到电子表格?

C# C-如何更快地将列表导出到电子表格?,c#,excel,C#,Excel,我有一个程序,调用下面的方法,它只是将列表导出到Excel电子表格。程序的大部分运行时用于执行此方法一次。在我上一次运行中,这个方法花了5分50秒在大小约46000的列表上执行。您能就如何改进代码以使此方法运行得更快提出建议吗?我不认为这应该需要大约6分钟的时间来执行……但唯一让我印象深刻的是,可能有一种更有效的方法可以将列表导出到电子表格列,而无需使用伪整数变量I遍历行,并将一个字符串一次复制到列中 public static string ExportListToSpreads

我有一个程序,调用下面的方法,它只是将列表导出到Excel电子表格。程序的大部分运行时用于执行此方法一次。在我上一次运行中,这个方法花了5分50秒在大小约46000的列表上执行。您能就如何改进代码以使此方法运行得更快提出建议吗?我不认为这应该需要大约6分钟的时间来执行……但唯一让我印象深刻的是,可能有一种更有效的方法可以将列表导出到电子表格列,而无需使用伪整数变量I遍历行,并将一个字符串一次复制到列中

       public static string ExportListToSpreadsheet(string xlwbk, string xlwksht, List<string> tagnamelist)
    {
        var watch = new Stopwatch();
        watch.Start();
        object misValue = Refl.Missing.Value;
        Excel.Application xlApp = new Excel.Application();
        Excel.Workbook xlWorkbook;
        xlWorkbook = xlApp.Workbooks.Add(misValue);

        Excel.Worksheet xlsheet = xlWorkbook.Sheets.Add();
        xlsheet.Name = xlwksht;
        int i = 1;

        foreach(string tagname in tagnamelist)
        {
                xlsheet.Cells[i,1].Value = tagname;
                i += 1;
        }

        string filename = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\" + xlwbk;
        xlWorkbook.SaveAs(filename, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, misValue,
        misValue, misValue, misValue, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlShared, misValue, misValue, misValue, misValue, misValue);
        xlWorkbook.Close();
        watch.Stop();
        return watch.Elapsed.ToString();

    }

感谢您的帮助。

尝试一下ClosedXML库。我将数万行的数据表放入电子表格,大约需要10秒钟

对于列表,您只需执行以下操作:

using ClosedXML.Excel;
..
var wb = new XLWorkbook();
var ws = wb.Worksheets.Add("myData");
ws.Cell(1, 1).InsertData(tagnamelist);
wb.SaveAs(@"c:\..\tagnamelist.xlsx");

尝试一下ClosedXML库。我将数万行的数据表放入电子表格,大约需要10秒钟

对于列表,您只需执行以下操作:

using ClosedXML.Excel;
..
var wb = new XLWorkbook();
var ws = wb.Worksheets.Add("myData");
ws.Cell(1, 1).InsertData(tagnamelist);
wb.SaveAs(@"c:\..\tagnamelist.xlsx");

这不是针对C语言的答案,而是针对任何脚本/自动化:一次编写一个Excel单元格效率极低,而是定义一个范围并一次性设置数据。定义与所需数据布局匹配的二维变量数组,然后在Excel中引用相同大小的范围对象,并设置数据

我之所以使用VBA示例,是因为它易于测试,而且我不熟悉C如何创建数组(可能是2D对象数组)。在VBA中,范围上的.Value是多余的,但在C中可能需要

Sub WriteBigData()
    Dim vData() As Variant

    Dim lValues As Long
    lValues = 10000

    'Create a 2D array matching the size of your data
    ReDim vData(1 To lValues, 1 To 1) As Variant
    
    'Fill this temporary array with your data 
    'Just simple numbers in this example
    For n = 1 To lValues
        vData(n, 1) = n
    Next n

    Dim rng As Range
    Set rng = Range("A1").Resize(lValues, 1)

    'This sets all the values of the range in one hit
    'with no costly iteration
    rng.Value = vData
End Sub

这不是针对C语言的答案,而是针对任何脚本/自动化:一次编写一个Excel单元格效率极低,而是定义一个范围并一次性设置数据。定义与所需数据布局匹配的二维变量数组,然后在Excel中引用相同大小的范围对象,并设置数据

我之所以使用VBA示例,是因为它易于测试,而且我不熟悉C如何创建数组(可能是2D对象数组)。在VBA中,范围上的.Value是多余的,但在C中可能需要

Sub WriteBigData()
    Dim vData() As Variant

    Dim lValues As Long
    lValues = 10000

    'Create a 2D array matching the size of your data
    ReDim vData(1 To lValues, 1 To 1) As Variant
    
    'Fill this temporary array with your data 
    'Just simple numbers in this example
    For n = 1 To lValues
        vData(n, 1) = n
    Next n

    Dim rng As Range
    Set rng = Range("A1").Resize(lValues, 1)

    'This sets all the values of the range in one hit
    'with no costly iteration
    rng.Value = vData
End Sub

我所知道的最快的方法是使用OpenXMLSDK,但要使用XMLAPI而不是对象API来处理实际的单元格数据。互联网上有关于如何做到这一点的帖子对不起,自从我这么做以来,已经5年多了,3份工作了-我还没有掌握详细信息。我知道最快的方法是使用OpenXMLSDK,但要做实际的细胞数据,请直接进入XML API而不是对象API。互联网上有关于如何做到这一点的帖子对不起,自从我这么做以来,已经有5年多的时间和3份工作了-我还没有掌握详细信息谢谢你!!执行时间从6米到1秒。是的,我喜欢那个图书馆。这太容易了。太谢谢你了!!执行时间从6米到1秒。是的,我喜欢那个图书馆。这几乎太容易了。