Excel – 获取单元格格式很慢

我正在使用C#从Excel文件中提取数据。 我需要从工作表中获取文本和一些小的格式化数据。 我的testing表有115行和10列。 performance似乎呆滞。 如果我只使用下面的代码拉出文本,则需要大约2秒的时间才能运行。 如果我检查字体(在if(c.Font.Bold == null …..行),它会上升到8秒,如果我得到的边界信息,然后上升到17秒。

问题是,我会有很多很多的工作表,我需要从中提取数据,速度将成为一个问题。 有什么build议,我可以做些什么来加快速度? 我真的很感激任何帮助。

foreach (Range c in oSheet.UsedRange.Cells) { var txt = c.Text; if (c.Font.Bold == null || c.Font.Italic == null || Convert.ToInt32(c.Font.Underline) > 0 || Convert.ToBoolean(c.Font.Bold) || Convert.ToBoolean(c.Font.Italic)) txt = ""; var borderBottom = c.Borders.Item[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeBottom].LineStyle; var borderTop = c.Borders.Item[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeTop].LineStyle; var borderLeft = c.Borders.Item[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeLeft].LineStyle; var borderRight = c.Borders.Item[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeRight].LineStyle; } 

如果您的Excel文件是Excel 2007/2010文件(.xlsx),则可以使用ExcelPackage或EPPlus组件读取该文件。 他们的办公室互动速度更快。

我使用EPPlus ,它几乎立即迭代2000多个单元格!

 ExcelPackage ep = new ExcelPackage(new FileStream(path, FileMode.Open, FileAccess.Read)); var sheet = ep.Workbook.Worksheets[1]; foreach (var cell in sheet.Cells[sheet.Dimension.Address]) { var txt = cell.Text; var font = cell.Style.Font; if (!font.Bold || font.Italic || font.UnderLine) txt = ""; var borderBottom = cell.Style.Border.Bottom.Style; var borderTop = cell.Style.Border.Top.Style; var borderLeft = cell.Style.Border.Left.Style; var borderRight = cell.Style.Border.Right.Style; // ... } 

我完全不熟悉C#,但在VBA中,我使用Application.ScreenUpdating属性设置为false开始,并在完成时设置为true。 在一般情况下,这大大提高了速度,特别是如果macros执行任何可见的纸张更新。

我很确定这样的属性也应该在C#中可用。 希望有帮助)

你可以使用下面的步骤。 这是非常快和一个行代码(不需要循环和所有)。 我正在做一个简单的excel来解释一下:

之前

在这里输入图像说明

我设法将范围以A1:C4的formsdynamic存储在exRange中,并使用下面的代码给出边界

 ((Range)excelSheet.get_Range(exRange)).Cells.Borders.LineStyle = XlLineStyle.xlContinuous; 

在这里输入图像说明