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
我有 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