【问题标题】:Trying to edit cell value of existing Excel file using NPOI尝试使用 NPOI 编辑现有 Excel 文件的单元格值
【发布时间】:2016-08-17 09:16:40
【问题描述】:

我编写了以下代码来使用 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);
        }     
    }
}

【问题讨论】:

    标签: c# excel npoi


    【解决方案1】:

    您没有看到更改的主要原因是您正在将工作簿写入MemoryStream,而不是写回文件。你应该做的是:

    1. Read模式下使用FileStream完整读取电子表格文件;
    2. 进行您想要的更改,然后
    3. Write 模式下使用FileStream 回写文件(如果您不想破坏原始文件,也可以选择写入其他文件——这可能更适合测试)。

    还请注意,在处理实现 IDisposable 的类时,最好使用 using 语句(所有 Streams 都可以)。这将确保关闭文件并正确清理流使用的所有资源。

    我在您的代码中看到了另一个问题,那就是您显然试图将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);
    }
    

    【讨论】:

    • 展示如何在整个互联网上通过 NPOI C# 写入现有文件的最佳示例。
    • 这很好,但是如果您不知道需要修改第 4 行中的单元格 1 怎么办?如何迭代?抱歉,C# 对我来说是第二语言。
    • @usr-bin-drinking - 如果您遇到问题,您应该open a new question 解释您正在尝试完成什么,您尝试过什么,以及您遇到问题的地方。您可以包含 link back to this question 以提供上下文。这样,更多的人会看到它,您将有更好的机会获得对您有帮助的答案。评论不是提出新问题的好地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多