【问题标题】:NPOI sometimes only reading 10 lines from a spreadsheetNPOI 有时只能从电子表格中读取 10 行
【发布时间】:2022-09-30 00:21:47
【问题描述】:

问题:我遇到了故障排除问题,希望就如何检查以解决我正在处理的互联网站点遇到的问题提出建议。使用 NPOI (C#) 从电子表格中读取数据时,有时(并非总是)行读取仅在十行后停止。

很抱歉这篇文章很长,但不确定什么是/没用。在这里发帖的主要原因是我不知道向伟大的 Google 机器提问的正确问题。

我有一个 Intranet 站点,我正在读取 XLSX 文件并将其内容推送到 Oracle 表中。从主题行可以看出,我正在使用 NPOI。在大多数情况下,它只是在工作,但只是有时...

在 Oracle 中,我有一个临时表,它被截断并且应该用电子表格中的数据填充。

在我的应用程序 (ASPX) 中,用户将他们的电子表格上传到服务器(这很有效),然后应用程序调用一个 WebMethod 来截断 Oracle 临时表中的数据(这很有效),然后调用另一个应该读取的 WebMethod来自电子表格的数据并加载临时表(这有点工作)。

这是我需要帮助的“有点作品”的作品。

该电子表格有 170 个数据行。当我在 VS 中运行应用程序时,它大部分时间读取/写入所有 170 条记录,但有时它只读取 10 条记录。当我从 Web 服务器运行该应用程序时,第一次失败(无法捕获特定错误),第二次和随后的时间,它仅从电子表格中读取十条记录并成功加载所有十条记录。我检查了上传到服务器的文件,它确实有 170 条数据记录。

无论进程读取 10 条记录还是 170 条记录,都没有错误消息,也没有说明为什么它在十分钟后停止读取。 (我会在这里提到,今天的文件有 170,但明天可能有 180 或 162,所以它不是固定的)。

所以,我已经描述了它应该做什么以及它实际上在做什么。我认为是时候编写代码 sn-p 了。

        /* snowSource below is the path/filename assembled separately */
        /* SnowExcelFormat below is a class that basically maps row data with a specific data class  */

        IWorkbook workbook;
        try
        {
            using (FileStream file = new FileStream(snowSource, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                workbook = WorkbookFactory.Create(file);
            }
            var importer = new Mapper(workbook);                
            var items = importer.Take<SnowExcelFormat>(0);
            /* at this point, item should have 170 rows but sometimes it contains only 10 with no indication why */
            /* I don\'t see anything in the workbook or importer objects that sheds any light on what\'s happening. */

同样,在从 VS 运行时,这在大多数情况下都可以正常工作。这告诉我这是可行的代码。在 Web 服务器上运行它时,它在我第一次尝试该过程时失败,但随后它运行但只拾取前 10 条记录,忽略其余记录。此外,所有读取的数据(10 或 170)都已成功插入到临时表中,这告诉我 Oracle 对数据、其格式和此过程完全没问题。我只需要弄清楚为什么我的代码没有从 Excel 中读取所有数据。

我已经多次验证本地 DLL 和 webserver DLL 是相同的。我正在阅读同一个 Excel 文件。

我在这里遇到了严重的问题,并且已经没有关于如何在代码失败时排除故障的想法。我不知道是否存在限制 FileStream 对象可用内存的东西,导致它过早地停止读取文件 - 并且没有遇到任何看起来像资源限制器的东西。不知道是不是有什么东西限制了 importer.Take 方法拉取的行数。任何建议,将不胜感激。

  • 我终于设法解决了这个问题。难题的第一部分是从使用 Mapper 方法切换到手动处理每一列。我以此为灵感:shengwenbai.github.io/2017/02/18/npoi 我有两个字段导致问题。一个是数字,一个是日期。有时这些被拾取为数字其他时间字符串。我有 try/catch 将数字拉为数字,另一个 try/catch 将日期拉为字符串,但格式为 24 小时与 12 小时。一旦我整理出这两个领域,在这两个环境中一切都很好。

标签: excel oracle filestream npoi


【解决方案1】:

我在某些文件上遇到了同样的问题,在分析了问题之后,这对我有用。

importer.Take&lt;SnowExcelFormat&gt;(0) 有三个参数,其中一个是maxErrorRows。它的默认值为 10。

您的解析在前 10 行停止,因为第 10 到 20 行或更多行包含错误,然后函数停止读取。

您需要做的是设置 maxErrorRows 而不是采用默认值 10。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多