首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >NPOI损坏的文件

NPOI损坏的文件
EN

Stack Overflow用户
提问于 2019-09-17 20:36:41
回答 1查看 349关注 0票数 2

我做了一个程序,把一个单元格分成两个单元格,然后把它们写在不同的工作表上,但是运行它之后,excel文件就被破坏了。

代码语言:javascript
复制
IWorkbook workbook;
            using(FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
                workbook = new XSSFWorkbook(stream);
            }
            IWorkbook newWorkbook = new XSSFWorkbook();

            ISheet sheet = workbook.GetSheetAt(0);
            ISheet oneWordSheet = newWorkbook.CreateSheet();
            ISheet moreWordsSheet = newWorkbook.CreateSheet();
            IRow tmpRow;
            for(int i = 5; i < 100/*sheet.LastRowNum*/ + 1; i++)
            {
                tmpRow = sheet.GetRow(i);
                string[] strings = tmpRow.GetCell(2).StringCellValue.Split(' ');
                string companyName = strings[0];
                bool parseFailed = true;
                for(int j = 1; parseFailed && j < strings.Length; j++)
                {
                    try
                    {
                        int.Parse(strings[j]);
                        parseFailed = false;
                    }
                    catch (FormatException)
                    {
                        companyName += strings[j];
                        j++;
                    }
                }
                tmpRow.CreateCell(4).SetCellValue(companyName);
                if(companyName.Trim().Split(' ').Length < 2)
                {
                    copyRowToSheet(tmpRow, oneWordSheet);
                }
                else
                {
                    copyRowToSheet(tmpRow, moreWordsSheet);
                }
            }
            using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Write))
            {
                newWorkbook.Write(stream);
            }

我创建了一个copyRowToSheet方法,如下所示。它应该是正确的

代码语言:javascript
复制
private static void copyRowToSheet(IRow row, ISheet sheet)
        {
            IRow newRow = sheet.CreateRow(sheet.LastRowNum + 1);
            newRow.CreateCell(0).SetCellValue(row.GetCell(0).NumericCellValue);
            newRow.CreateCell(1).SetCellValue(row.GetCell(1).StringCellValue);
            newRow.CreateCell(2).SetCellValue(row.GetCell(4).StringCellValue);
            newRow.CreateCell(3).SetCellValue(row.GetCell(2).StringCellValue);
            newRow.CreateCell(4).SetCellValue(row.GetCell(3).StringCellValue);
        }

我尝试从工作簿而不是newWorkbook中写入,但它仍然会损坏文件,我还尝试删除copyRowToSheet方法(只保留if和else两个用例为空,但结果不变……

编辑:我试着删除整个程序,只留下以下内容:

代码语言:javascript
复制
IWorkbook workbook;
            using(FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
                workbook = new XSSFWorkbook(stream);
                stream.Close();
            }
            IWorkbook newWorkbook = new XSSFWorkbook();


            using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Write))
            {
                workbook.Write(stream);
                stream.Close();
            }

如果我没记错的话,它应该只读取文件,然后将其保存回来,而不编辑任何内容,但它仍然会损坏文件

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-23 04:12:31

几周前,当我刚开始使用npoi时,我也遇到了同样的问题。这是一个很难诊断的问题,因为你使用的代码在教程和博客中一次又一次地重复。

当您创建第二个FileStream以将电子表格写回磁盘时,会出现问题。您正在写入的文件与之前读取的文件相同。

在写入现有文件时,FileMode.Open的行为是将数据附加到文件的末尾。这会导致您在一个文件中有两个excel电子表格,当您打开该文件时,它会被声明为已损坏。

另一方面,FileMode.Create将覆盖现有的文件,因此这更有可能是您需要的。

代码语言:javascript
复制
using (FileStream stream = new FileStream(path, FileMode.Create, FileAccess.Write))
{
     workbook.Write(stream);
     stream.Close();
}

这里是文档文件FileMode,因为您可能更喜欢创建一些备选文件。

Doc for FileMode

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

https://stackoverflow.com/questions/57974361

复制
相关文章

相似问题

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