Excel 使用 ClosedXML 时排序卡住

Excel sorting is stuck when ClosedXML is used

我有 14000 行的 xlsx。 我可以使用标准 Excel 应用程序在一秒钟内按列对其进行排序。 当我尝试在 ClosedXML 中执行相同操作时,它卡住了。我的意思是它非常慢(比如 10 分钟甚至更多),但最终它完成了操作。 假设我创建了一个文件

XLWorkbook wb = new XLWorkbook();
IXLWorksheet ws = wb.AddWorksheet("my test");
ws.Cell(1, 1).Value = "A";
ws.Cell(1, 2).Value = "B";
for (int i = 0; i < 14000; i++)
{
    ws.Cell(i + 2, 1).Value = i;
    ws.Cell(i + 2, 2).Value = i % 2;
}
wb.SaveAs("test.xlsx");

现在有几种方法可以按B列排序,例如

var tab = ws.Range(1,1,14001,2);
Stopwatch stopwatch = new Stopwatch();
Console.WriteLine("start");
stopwatch.Start();
tab.SetAutoFilter();
wb.SaveAs("test.xlsx");
ws.AutoFilter.Sort(2);
stopwatch.Stop();
Console.WriteLine("Sorted after " + (int)stopwatch.Elapsed.TotalSeconds + " seconds");
wb.SaveAs("test.xlsx");

我是否应该切换到 Microsoft.Office.Interop.Excel 以按列对 table 进行排序?或者ClosedXML有没有可用的方法?

是的,当然,Interop 在排序方面要好得多,在这种情况下它是即时的,而 ClosedXML 不可用。 这是示例代码

 var excelApp = new Microsoft.Office.Interop.Excel.Application();
 // Make the object visible.
 excelApp.Visible = true;
 excelApp.Workbooks.Open(Path.Combine( Directory.GetCurrentDirectory(), "test.xlsx"));
 Worksheet ws = (Worksheet)excelApp.ActiveSheet;

确保在上述步骤之前使用 ClosedXML 来创建电子表格(它比互操作更快在这种情况下)。

最后是排序部分

var tab = (Range)ws.Range[ws.Cells[2, 1], ws.Cells[14001, 2]];
Stopwatch stopwatch = new Stopwatch();
Console.WriteLine("start");
stopwatch.Start();
ws.Cells[1, 2].AutoFilter();
tab.Select();
tab.Sort(ws.Cells[2,2], XlSortOrder.xlAscending);
Console.WriteLine("Sorted after " + (int)stopwatch.Elapsed.TotalSeconds + " seconds");    
excelApp.ActiveWorkbook.Save();
excelApp.ActiveWorkbook.Close();
excelApp.Quit();

这将需要一秒钟,因为它应该如此。

排序助手库shared