微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 ClosedXML 时 Excel 排序卡住

如何解决使用 ClosedXML 时 Excel 排序卡住

我有 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 以按列对表格进行排序吗?或者 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。