【问题标题】:Excel multiple columns filter in c# interopc#互操作中的Excel多列过滤器
【发布时间】:2020-09-18 18:44:42
【问题描述】:

我在同一个文件中有两个 excel 表,每个表包含 5 列。我的第一个 Excel 表中的数据是独一无二的。而第二张表可以包含重复项。我正在过滤并将第一张纸中的每条记录与第二张纸中的所有记录进行比较。第一张表中的数据持续数百条记录,但第二张表中的数据非常大,比如 200k-300k。通过过滤数据进行手动比较非常耗时。

问题:我正在尝试在 c#WinForms 中自动化这个 multiple column filter excel 标准。

我尝试了什么:我认为 Jagged Arrays 可以解决问题,因此创建了两个 Jagged Arrays。每个锯齿状数组都使用 1 张数据动态填充。所以JaggedAry1 将包含来自Sheet1JaggedAry2Sheet2 的数据。如果我没记错的话,锯齿状数组可能看起来像这样:

JaggedAry1:

Row 1           Name   Jim   Bob   Joe    
Row 2           Age    25    30    35
Row 3           ID     1AB   2C    2BE
Row 4           Addr   Ad1   Ad2   Ad3
Row 5           DOB    D1    D2    D3

JaggedAry2:

Row 1           Name   Jim   Bob   Joe    Jim   Bob   Jim    Joe   Bob   Sam    
Row 2           Age    25    30    35     25    32    35     25    30    35
Row 3           ID     1AB   2C    2BE    1AB   2C    2D     AB    2W    2E
Row 4           Addr   Ad1   Ad2   Ad3    Ad1   Ad2   Ad4    Ad5   Ad6   Ad7
Row 5           DOB    D1    D2    D3     D1    D2    D3     D3    D4    D5

示例结果:如果我有两个组织的数据,Jim 可以是多个人的名字,并且可以有相同的 ID。如果在sheet1 中,我有一个员工姓名 Jim,其出生日期为 1988 年 1 月 25 日并且 ID=2,那么在sheet2 中,我想列出所有出生日期为 1988 年 1 月 25 日或之后的 Jim,其中相同的 ID,即 ID=2。地址可以相同也可以不同。

我知道我可以使用foreach 循环来做到这一点,但我认为这将需要大量临时变量来进行多重比较。所以我想是否有更简单的方法?

注意:我还尝试使用 InteropExcel 的 Range Filter 在第二张表上直接应用过滤器。但这仅适用于少量数据。包含大量数据的 Excel 文件非常耗时。

如果有人能指出我正确的方向,那就太好了。提前致谢。

【问题讨论】:

  • 反正有 200k-300k 行,我们会花时间阅读......

标签: c# excel-interop jagged-arrays


【解决方案1】:

所以 Excel 有它的限制,有 300k 行,也许迁移到 sql 数据库会很有趣。

但是,如果您不计划此解决方案并保留 Excel,我建议您使用 ExcelDataReader 来读取您的大型 excel 文件并使用 Linq/LinqToSql 来过滤您的数据。 ExcelDataReader 非常适合快速读取大文件。

在第二种方法中,要么你有内存来加载整个数据,你可以在加载后处理它。如果没有,在加载你想要保留的内容之前没有其他解决方案来测试每个项目

【讨论】:

    猜你喜欢
    • 2021-05-22
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2023-03-25
    相关资源
    最近更新 更多