0

我正在使用 C# 从 Excel 文件中提取数据。我需要从工作表中获取文本和一些次要格式数据。我的测试表有 115 行和 10 列。表现似乎迟缓。如果我只使用下面的代码提取文本,则运行大约需要 2 秒。如果我检查字体(在 if(c.Font.Bold==null..... 行中),它​​会上升到 8 秒。如果我得到边框信息,那么它会上升到 17 秒。

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

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;
}
4

3 回答 3

3

如果您的 Excel 文件是 Excel 2007/2010 文件 (.xlsx),您可以使用ExcelPackageEPPlus组件来读取文件。他们必须比办公室互操作更快。

我使用了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;
    // ...
}
于 2013-02-04T15:30:29.610 回答
1

我对 C# 完全不熟悉,但在 VBA 中,我Application.ScreenUpdating在开始时使用属性设置为 false,并在完成时设置回 true。在一般情况下,这会显着提高速度,尤其是在宏执行任何可见工作表更新时。

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

于 2013-02-04T14:21:23.333 回答
1

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

之前

在此处输入图像描述

我设法将范围作为A1:C4变量动态存储在exRange中,并使用下面的代码给出边框

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


在此处输入图像描述

于 2016-09-10T11:26:06.027 回答