2

Excel ファイルから列を読み取るコードを作成しました。これには Microsoft.Office.Interop.Excel を使用します。最初に Range 全体を読み取り、次に System.Array に書き込みます。その後、System.Array 値を使用していくつかの操作を行い、最後に ListBox 要素を埋めるため、それを List に変換します。これはコードです(関連する部分のみ):

private List<string> bd = new List<string>();
private static System.Array objRowAValues;

private List<string> bl = new List<string>();
private static System.Array objRowBValues;

private List<string> cm = new List<string>();
private static System.Array objRowCValues;

private List<string> pl = new List<string>();
private List<string> bdCleanList;
private static Microsoft.Office.Interop.Excel.Application appExcel;

Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
Excel.Range rngARowLast, rngBRowLast, rngCRowLast;

long lastACell, lastBCell, lastCCell, fullRow;

private void btnCargarExcel_Click(object sender, EventArgs e)
    {
        if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            if (System.IO.File.Exists(openFileDialog1.FileName))
            {
                Stopwatch stopWatch = new Stopwatch();
                stopWatch.Start();
                Thread.Sleep(10000);

                filePath.Text = openFileDialog1.FileName.ToString();

                xlApp = new Microsoft.Office.Interop.Excel.Application();
                xlWorkBook = xlApp.Workbooks.Open(openFileDialog1.FileName, 0, true, 5, "", "", true,
                                                  Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false,
                                                  false, 0, true, 1, 0);
                xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

                fullRow = xlWorkSheet.Rows.Count;
                lastACell = xlWorkSheet.Cells[fullRow, 1].End(Excel.XlDirection.xlUp).Row;
                rngARowLast = xlWorkSheet.get_Range("A1", "A" + lastACell);
                objRowAValues = (System.Array)rngARowLast.Cells.Value;

                foreach (object elem in objRowAValues)
                {
                    if (elem != "")
                    {
                        bd.Add(cleanString(elem.ToString(), 10));
                    }
                }

                nrosProcesados.Text = bd.Count().ToString();
                listBox1.DataSource = bd;

                xlWorkBook.Close(true, null, null);
                xlApp.Quit();

                releaseObject(xlWorkSheet);
                releaseObject(xlWorkBook);
                releaseObject(xlApp);

                stopWatch.Stop();

                TimeSpan ts = stopWatch.Elapsed;
                executiontime.Text =
                    String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds,
                                  ts.Milliseconds / 10).ToString();
            }
            else
            {
                MessageBox.Show("No se pudo abrir el fichero!");
                System.Runtime.InteropServices.Marshal.ReleaseComObject(appExcel);
                appExcel = null;
                System.Windows.Forms.Application.Exit();
            }
        }
    }

約 800,000 個のセルを含む Excel ファイルでテストし、2 分もかかりません。次に、EPPlus からサンプルをテストし、私のアプローチよりも高速であるため、Microsoft.Office.Interop.Excel の代わりに EPPlus を使用していると思います。今)。この例では、次のコードを使用して Excel ファイルから読み取ります。

ExcelWorksheet sheet = package.Workbook.Worksheets[1];

var query1= (from cell in sheet.Cells["d:d"] where cell.Value is double && (double)cell.Value >= 9990 && (double)cell.Value <= 10000 select cell);

もちろん、ここではLINQを使用していますが、このトピックに関する私の質問は次のとおりです。

  • あなたはどのアプローチを使用しましたか?
  • これに関するあなたの推奨事項は何ですか?
  • EPPlus または OpenXML SDK を使用して同じものを作成する方法はありますか?

私はPHPの世界から来たC#の世界の初心者で、これが私の最初のプロジェクトです

4

1 に答える 1

5

あなたはどのアプローチを使用しましたか?-EPプラス

これに関するあなたの推奨事項は何ですか?-EPPLus の方がはるかに高速であることがわかりました。私の意見では、API を使用する方が簡単でもあります。多くの理由から、1 つは COM 相互運用性の欠如です (速度と使いやすさの両方の点で)。また、特にサーバー環境に展開する場合は、要件が少なくなります。Excel ジャンクをインストールする必要はありません。

EPPlus または OpenXML SDK を使用して同じものを作成する方法はありますか? -EPPlus API はかなり単純です。これまでに試したことについて、より具体的な質問を投稿してみてください。

セルをループする別の方法:

var firstColumnRows = sheet.Cells["A2:A"];

// Loop through rows in the first column, get values based on offset
foreach (var cell in firstColumnRows)
{
    var column1CellValue = cell.GetValue<string>();
    var neighborCellValue = cell.Offset(0, 1).GetValue<string>();
}
于 2013-04-25T18:25:49.327 に答える