为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 C# 将大型多个 Excel 工作表中的数据读取到列表中

如何使用 C# 将大型多个 Excel 工作表中的数据读取到列表中

C#
HUX布斯 2023-08-20 14:46:13
我在一个 Excel 文件中有两个大型数据工作表(25k 行)。工作表数据采用以下格式。表1:资讯| 身份证 | 信息描述| 信息类型 | 数据类型| 费率格式25 | 25 5 | 费用| 薪资| 数字| $$$.$$250 | 250 2 | 膳食| 午餐| 数字| $$$$.$$350 | 350 25 | 25 详情 | 更多详情 | 文本375 | 375 25 | 25 测试| | 12345 | 文本表2:资讯| 身份证 | 证书编号 | 证书值25 | 5 | 2500 | 25000.00250 | 20 | 2222 | 5200.05350 | 25 | 32156 | 2500375 | 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>();            }            }我想知道如何更快地读取这些行,并使用公共属性信息和 ID 将这些工作表数据合并到一个列表中。
查看完整描述

1 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

25K 行是一个很小的行数。Excel 每张工作表最多可容纳 100 万行。

延迟是由 Excel Interop 的使用造成的,而不是数据大小造成的。互操作调用实际上是对单独进程的 COM 调用。每个这样的调用都比访问本地对象慢数百倍。该行xlSheet2WorkSheetRange.Rows.Count包含两个跨进程调用,一个用于获取对 Rows 集合的引用,另一个用于Count从中获取属性。与 相同xlSheet1Range.Cells[iRow, 3]

您可以使用ADO.NET和 Jet OLEDB 提供程序或本机 .NET 库(如ExcelDataReader )。本机 .NET 解决方案的优点是您无需在客户端计算机上安装任何内容。

您可以使用ExcelDataReader将所有数据直接读入数据集,每个工作表中的数据最终存储在单独的表中,例如:

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();


查看完整回答
反对 回复 2023-08-20
  • 1 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信