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) の場合、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;
    // ...
}
于 2013-02-04T15:30:29.610 に答える
1

私は C# にはまったく詳しくありませんが、VBA ではApplication.ScreenUpdating、開始時に false に設定されたプロパティを使用し、終了時に true に戻します。一般に、特にマクロが表示されているシートの更新を実行する場合、これにより速度が劇的に向上します。

そのようなプロパティはC#でも利用できるはずです。お役に立てば幸いです)

于 2013-02-04T14:21:23.333 に答える