C# 为什么在C.NET中写入Excel范围的时间要比预期的长得多?

C# 为什么在C.NET中写入Excel范围的时间要比预期的长得多?,c#,excel,performance,save,C#,Excel,Performance,Save,我已经用C构建了一个脚本,它以CSV格式获取一个大数据文件,并以Excel2007+格式拆分成两个输出文件。我有完全可以工作的代码,可以满足所有要求,但是在一个相对较小的源文件上运行save_files方法需要大约15秒。我想知道是否有更快的方法来做我正在做的事情 第一个输出结果是将多达180列的125000个点写入excel文件。15秒的代码运行只使用了20列。output1_temp_array是一个列表,其中每个列表项都包含一个带有125k数据点的字符串数组。它被定义为二维数组,因为Exc

我已经用C构建了一个脚本,它以CSV格式获取一个大数据文件,并以Excel2007+格式拆分成两个输出文件。我有完全可以工作的代码,可以满足所有要求,但是在一个相对较小的源文件上运行save_files方法需要大约15秒。我想知道是否有更快的方法来做我正在做的事情

第一个输出结果是将多达180列的125000个点写入excel文件。15秒的代码运行只使用了20列。output1_temp_array是一个列表,其中每个列表项都包含一个带有125k数据点的字符串数组。它被定义为二维数组,因为Excel的Range.Value2需要一个二维数组,但实际上它是125k x 1项宽

第二个输出结果是以1行写入195列。数据临时数组的填充方式也是一个列表所以在深入研究OpenXML之后,我选择了一种混合解决方案,它并没有真正解决这个问题,但至少让它更快

对于第一个输出文件,我坚持原来的方法。我尝试了一下,发现没有writerow或range.setValue方法,所以写很多单元格最终都是嵌套的for循环。这证明是非常缓慢的

但是,对于第二次数据输出,SpreadsheetLight无疑缩短了时间:

    SLDocument data_file = new SLDocument(xlsData_Filename, "Aggregate Data");
    SLWorksheetStatistics data_file_info = new SLWorksheetStatistics();
    data_file_info = data_file.GetWorksheetStatistics();
    int start_row = data_file_info.NumberOfRows + 1;

    for (int i = 0; i < data_temp_array.Count(); i++)
    {
        data_file.SetCellValue(start_row, i + 1, data_temp_array[i]);
    }
}

使用此解决方案,现在生成相同的文件需要8.5秒,而不是15秒。

您是否考虑过使用OpenXML SDK而不是COM?它可能会更快,因为它不必打开excel。显然,这将意味着一次重要的重构,但如果您有性能问题,则值得考虑。我同意Greg的观点,使用Openxml是一种更好的方法。如果它不需要太多的重构,您可能希望采用openxml方式。您知道您的代码的哪一部分是瓶颈吗?它在构建数据吗?写入文件?一点分析可以帮助您缩小范围。我将研究OpenXML。我发布的代码几乎是瓶颈;构建阵列的所有代码只需不到半秒钟的时间,包括将所有15MB+的数据从CSV读取到源阵列中。即使当我注释掉output1写入时,也需要5秒钟。
private void save_files()
{
    MyExcel.Application excelApp = null;
    MyExcel.Workbook excelWorkbook = null;
    MyExcel.Worksheet worksheet = null;
    MyExcel.Range range = null;
    excelApp = new MyExcel.Application();
    excelApp.DefaultSaveFormat = XlFileFormat.xlOpenXMLWorkbook;
    excelApp.Visible = false;

    excelWorkbook = excelApp.Workbooks.Open(xlsOutput1_Filename, 1, false, 5, "", "", false, MyExcel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
    worksheet = excelWorkbook.Worksheets.get_Item("Output Data");

    for (int i = 0; i < output1_temp_array.Count(); i++)
    {
        range = worksheet.get_Range((MyExcel.Range)worksheet.Cells[1, i + 2], (MyExcel.Range)worksheet.Cells[output1_temp_array[i].Length, i + 2]);
        range.set_Value(Type.Missing, output1_temp_array[i]);
    }
    excelWorkbook.Save();
    excelWorkbook.Close();
    SLDocument data_file = new SLDocument(xlsData_Filename, "Aggregate Data");
    SLWorksheetStatistics data_file_info = new SLWorksheetStatistics();
    data_file_info = data_file.GetWorksheetStatistics();
    int start_row = data_file_info.NumberOfRows + 1;

    for (int i = 0; i < data_temp_array.Count(); i++)
    {
        data_file.SetCellValue(start_row, i + 1, data_temp_array[i]);
    }
}