首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过C#导入Excel文件时的性能瓶颈

通过C#导入Excel文件时的性能瓶颈
EN

Stack Overflow用户
提问于 2020-05-13 22:11:24
回答 1查看 62关注 0票数 0

我收到一个任务,要导入一个Excel文件(xlsx),它是由第三方创建的(我们对结构、名称和内容没有影响)到数据库中。此文件包含几个具有非标准工作表名称的工作表(而不是"Sheet1“或" Data”,或其特征名称如"1 2 Data of grp 1&2 Includ. test“-仅用于结构描述的虚拟名称)。我必须从这个文件中导入一个特定的工作表,它的特点是大约4000行205列。该文件的大小约为20MB。在这205列中,只有65列(在工作表中不是顺序的)必须导入(类似于col1-4,10-16,50-100,...)。

我试图通过OleDB连接来实现这个导入,但是我收到了一个错误,指出工作表名称无效(我猜它连接到了&和。也许在名称中有空格...)。

现在,我通过Excel.WorkbookExcel.Range实现了导入,并通过xlRange.Cells[i, colId].Value2.ToString()获取了相应的单元。首先,我遍历范围内第一行的所有列,以获取列的名称。在执行此操作时,我检查列是否包含在65个必需列的列表中,如果是,则将列ID和名称添加到datatable中。在下一步中,我循环遍历工作表中的所有行,对于每个工作表,我循环遍历我的datatable,以便根据需要获取列中单元格的数据。

看起来,这不是一个好主意:我在25分钟后取消了这个过程(只是循环遍历行和列;没有数据处理/插入或其他任何东西)。此外,我注意到,在我取消进程之前,Excel hat使用的内存超过了200MB。

有没有一种更好的方法来只从所需的列中获取数据?

从数据库的角度来看,4000行并不是很多,但我猜205列可能会导致问题,导致总共820k个单元格……似乎,通过数据表进行过滤的想法并没有达到减少工作负载的预期效果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-14 18:18:19

经过长时间的反复试验,我终于在Excel表格上运行了OleDB查询。正如我在另一个线程(甚至是另一个网站)中读到的那样,如果工作表名称(或列名称)包含点,则OleDB查询将不起作用。在查询过程中,这些元素将被#替换,因此对表名为value a & b incl. test的查询将如下所示:SELECT [col1], col[2]... FROM [value a & b incl# test$]

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61776888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档