簡體   English   中英

如何使用C#將大型Excel工作表中的數據讀取到列表中

[英]How to read data from large multiple excel worksheets in to a list using C#

我在單個excel文件中有兩個大數據表(25k行)。 工作表數據采用以下格式。

工作表1

信息| ID | 信息描述| 信息類型| 數據類型 費率格式

25 | 5 | 費用| 薪金| 數值| $$$。$$

250 | 2 | 餐點 午餐 數值| $$$$。$$

350 | 25 | 細節| 更多細節| 文本

375 | 25 | 測試 | 12345 | 文本

清單2

信息| ID | 證書編號| 證書值

25 | 5 | 2500 | 25000.00

250 | 20 | 2222 | 5200.05

350 | 25 | 32156 | 2500

375 | 25 | 12564 | 25.00

我正在嘗試1)將行讀入兩個單獨的列表中,以及2)使用兩個工作表上的公共屬性(信息和ID)將數據合並到一個公共列表中。 3)檢查/驗證每行數據。 像,檢查是否有任何數據類型不正確或為空。

我試圖讀取行以分隔列表,但是要花費更長的時間才能完成對第一個工作表本身的讀取。 請提供有關如何將這兩個工作表數據有效地讀入一個列表並驗證每個列值的幫助。

Excel.Application xlApp = new Excel.Application();
            Excel.Workbook xlWorkBook;
            Excel.Worksheet xlSheet1WorkSheet;
            Excel.Worksheet xlSheet2WorkSheet;

            int iRow;

            xlApp = new Excel.Application();
            xlWorkBook = xlApp.Workbooks.Open(wsFile);
            xlSheet1WorkSheet = xlWorkBook.Worksheets["SHEET1"];
            Excel.Range xlSheet1Range = xlSheet1WorkSheet.UsedRange;
            int xlSheet1RowCount = xlSheet1Range.Rows.Count;
            int xlSheet1ColCount = xlSheet1Range.Columns.Count;


            xlSheet2WorkSheet = xlWorkBook.Worksheets["SHEET2"];
            Excel.Range xlSheet2WorkSheetRange = xlSheet2WorkSheet.UsedRange;
            int xlSheet2RowCount = xlSheet2WorkSheetRange.Rows.Count;
            int xlSheet2ColCount = xlSheet2WorkSheetRange.Columns.Count;

            List<ImportSheet1> Sheet1CombinedList = new List<ImportSheet1>();

            List<ImportSheet2> Sheet2sCombinedList = new List<ImportSheet2>();


         //   DateTime dtStart = DateTime.Now;
            for (iRow = 2; iRow <= xlSheet1RowCount; iRow++)  // START FROM THE SECOND ROW.
            {
                ImportSheet1 Sheet1Info = new ImportSheet1();
                Sheet1Info.Info = xlSheet1Range.Cells[iRow, 1] != null ? Convert.ToString(xlSheet1Range.Cells[iRow, 1].Value2) : null;
                Sheet1Info.ID = xlSheet1Range.Cells[iRow, 2] != null ? Convert.ToInt32(xlSheet1Range.Cells[iRow, 2].Value) : 0;
                Sheet1Info.InfoDesc = xlSheet1Range.Cells[iRow, 3] != null ? Convert.ToInt32(xlSheet1Range.Cells[iRow, 3].Value) : 0;
                Sheet1Info.DataType = xlSheet1Range.Cells[iRow, 4] != null ? Convert.ToString(xlSheet1Range.Cells[iRow, 4].Value2) : null;                
                Sheet1Info.RateFormat = xlSheet1Range.Cells[iRow, 4] != null ? Convert.ToString(xlSheet1Range.Cells[iRow, 4].Value2) : null;    

               Sheet1Info.InfoID = Convert.ToString(Sheet1Info.Info) + Convert.ToString(Sheet1Info.ID);
                Sheet1CombinedList.Add(Sheet1Info);

            }
//            DateTime dtEnd = DateTime.Now;

            for (iRow = 2; iRow <= xlSheet2RowCount; iRow++)  
            {
                ImportSheet2 Sheet2sInfo = new ImportSheet2();
                Sheet2sInfo.Info = xlSheet2WorkSheetRange.Cells[iRow, 1] != null ? Convert.ToString(xlSheet2WorkSheetRange.Cells[iRow, 1].Value2) : null;
                Sheet2sInfo.ID = xlSheet2WorkSheetRange.Cells[iRow, 2] != null ? Convert.ToInt32(xlSheet2WorkSheetRange.Cells[iRow, 2].Value2) : 0;
                Sheet2sInfo.CertNum = xlSheet2WorkSheetRange.Cells[iRow, 3] != null ? Convert.ToInt32(xlSheet2WorkSheetRange.Cells[iRow, 3].Value2) : 0;
                Sheet2sInfo.CertVal = xlSheet2WorkSheetRange.Cells[iRow, 4] != null ? Convert.ToInt32(xlSheet2WorkSheetRange.Cells[iRow, 4].Value2) : 0;

                Sheet2sInfo.InfoID = Convert.ToString(Sheet2sInfo.Info) + Convert.ToString(Sheet2sInfo.ID);
                Sheet2sCombinedList.Add(Sheet2sInfo);

            }

我想知道如何更快地讀取這些行,並使用公共屬性Info&ID將這兩個工作表數據合並到一個列表中。

25K行是少數行。 Excel每張紙最多可容納100萬行。

延遲是由使用Excel Interop引起的,而不是數據的大小。 互操作調用實際上是對單獨進程的COM調用。 每個此類調用都比訪問本地對象慢100倍。 xlSheet2WorkSheetRange.Rows.Count行包含兩個跨進程調用,一個用於獲取對Rows集合的引用,另一個用於從中獲取Count屬性。 xlSheet1Range.Cells[iRow, 3]

您可以使用ADO.NET和Jet OLEDB提供程序,也可以使用本機.NET庫(例如ExcelDataReader) 本機.NET解決方案的優點是您不需要在客戶端計算機上安裝任何東西。

您可以使用ExcelDataReader將所有數據直接讀取到DataSet中,每個工作表中的數據都以單獨的表結尾,例如:

using (var stream = File.Open(filePath, FileMode.Open, FileAccess.Read))
{
    using (var reader = ExcelReaderFactory.CreateReader(stream))
    {
        var result = reader.AsDataSet();

        var table1=result.Tables["Sheet1"];
        foreach(DataRow in table1.Rows)
        {
           //Do something with the row
        }
    }
}    

將這些行轉換為強類型對象的一種簡單方法是使用LINQ To Dataset

var query1 = from row in table1.AsEnumerable()
            select new ImportSheet1
            {
                Info = row.Field<string>(0),
                ID   = row.Field<int?>(1)??0,
                InfoDesc = row.Field<int?>(2)??0,
                DataType = row.Field<string>(3),
                RateFormat = row.Field<string>(4)    
            };
var Sheet1CombinedList =query.ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM