尝试使用NPOI编辑现有Excel文件的单元格值

man*_*tha 2 c# excel npoi

我编写了以下代码来使用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);
        }     
    }
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*ers 11

您没有看到更改的主要原因是您正在编写工作簿MemoryStream而不是写回文件.你应该做的是这样的:

  1. 使用FileStreamin Read模式完全读取电子表格文件;
  2. 然后进行你想要的改变
  3. 使用FileStreamin Write模式写回文件(或者如果你不想销毁原文,可选择写入不同的文件 - 这可能更适合测试).

另请注意,在使用using实现IDisposable(全部Streams执行)的类时使用语句是一种好习惯.这将确保关闭文件并正确清理流使用的所有资源.

还有一个问题,我在你的代码中看到的,那就是你,显然是试图使用HSSFWorkbook.xlsx文件.那不行. HSSFWorkbook(和所有HSSF类)用于.xls文件.如果您需要使用.xlsx文件,那么您应该使用XSSFWorkbook相关的XSSF类.注意,两个类香精实现诸如通用接口IWorkbook,ISheet,IRow等,以帮助减少代码的重复,你应该需要支持这两种类型的文件.我建议尽可能使用它们.但是您可能会发现您仍然需要偶尔转发以访问接口未涵盖的某些功能.

我应该提到的另一件事是:如果特定行在x原始工作簿中不包含单元格,则GetRow(x)返回null.同样,GetCell(y)如果cell 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 显示如何在整个互联网上通过NPOI C#写入现有文件的最佳示例. (3认同)