使用NPOI编辑已有Excel文件的单元格值

5
我已经使用C#和NPOI库编写了以下代码来编辑Excel文件。虽然没有错误,但在运行代码后,如果我打开文件,则单元格的值未被编辑。我错在哪里了?
namespace Project37
{
    class Class1
    {
        public static void Main()
        {
            string pathSource = @"C:\Users\mvmurthy\Downloads\VOExportTemplate.xlsx";

            FileStream fs = new FileStream(pathSource, FileMode.Open, FileAccess.ReadWrite); 
            HSSFWorkbook templateWorkbook = new HSSFWorkbook(fs, true);
            HSSFSheet sheet = (HSSFSheet)templateWorkbook.GetSheet("ImportTemplate");
            HSSFRow dataRow = (HSSFRow)sheet.GetRow(4);

            dataRow.GetCell(1).SetCellValue("foo");

            MemoryStream ms = new MemoryStream();
            templateWorkbook.Write(ms);
        }     
    }
}
1个回答

16
你没有看到更改的主要原因是,你将工作簿写入MemoryStream而不是写回文件。你应该这样做:
  1. 使用Read模式的FileStream完全读取电子表格文件;
  2. 进行所需更改,然后
  3. 使用Write模式的FileStream写回文件(或者如果您不想销毁原始文件,可以选择写入另一个文件--这对于测试可能更好)。
此外,请注意,在使用实现IDisposable的类(所有Streams都是如此)时使用using语句是很好的习惯。这将确保关闭文件并正确清理流使用的所有资源。
我在您的代码中还看到另一个问题,那就是您似乎试图将HSSFWorkbook.xlsx文件一起使用。那行不通。 HSSFWorkbook(以及所有HSSF类)适用于.xls文件。如果您需要使用.xlsx文件,则应改为使用XSSFWorkbook和相关的XSSF类。请注意,这两种类别的类都实现了共同的接口,如IWorkbookISheetIRow等,以帮助减少代码重复,如果需要支持这两种类型的文件,则建议使用它们。但是,您可能会发现仍然需要时不时地向下转换才能访问某些接口未涵盖的特定功能。
还有一件事我应该提一下:如果特定行x在原始工作簿中不包含单元格,则GetRow(x)将返回null。同样,如果单元格y为空,则GetCell(y)将返回null。如果要能够设置单元格的值,请检查空值并相应地使用CreateRow(x)和/或CreateCell(y)确保每个实体都存在。
以下是修改后的代码:
string pathSource = @"C:\Users\mvmurthy\Downloads\VOExportTemplate.xlsx";

IWorkbook templateWorkbook;
using (FileStream fs = new FileStream(pathSource, FileMode.Open, FileAccess.Read))
{
    templateWorkbook = new XSSFWorkbook(fs);
}

string sheetName = "ImportTemplate";
ISheet sheet = templateWorkbook.GetSheet(sheetName) ?? templateWorkbook.CreateSheet(sheetName);
IRow dataRow = sheet.GetRow(4) ?? sheet.CreateRow(4);
ICell cell = dataRow.GetCell(1) ?? dataRow.CreateCell(1);
cell.SetCellValue("foo");

using (FileStream fs = new FileStream(pathSource, FileMode.Create, FileAccess.Write))
{
    templateWorkbook.Write(fs);
}

7
展示如何使用NPOI C#向现有文件写入内容的最佳示例,可在整个互联网上找到。 - Jarkid
这很棒,但如果您不知道需要修改第4行中的单元格1怎么办?如何迭代?抱歉,C#对我来说是第二语言。 - usr-bin-drinking
@usr-bin-drinking - 如果您遇到问题,应该提出一个新的问题,说明您想要实现什么,已经尝试了什么,以及在哪里卡住了。您可以包括一个链接回到这个问题 提供上下文。这样更多的人会看到它,您将有更好的机会得到帮助的答案。评论不是一个好地方来问新问题。 - Brian Rogers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接