c# - 编辑现有的 Excel 文件 C# npoi

标签 c# npoi

我想使用控制台应用程序 C# 打开现有的 excel 文件并向其中添加内容。 NPOI 2.1.1.0

我的第一个方法是简单地为我解决的最后一个单元格数字添加一个值,它将解决我的其他问题。
这将使用新内容正确读取文件,但不会保存它。

输出:

"Cannot access a closed file.".

HSSFWorkbook hssfwb;
using (FileStream file = new FileStream(@"c:\testfile.xls", FileMode.Open, FileAccess.ReadWrite))
{
    hssfwb = new HSSFWorkbook(file);
    ISheet sheet = hssfwb.GetSheetAt(0);
    IRow row = sheet.GetRow(0);

    sheet.CreateRow(row.LastCellNum);
    ICell cell = row.CreateCell(row.LastCellNum);
    cell.SetCellValue("test");

    for (int i = 0; i < row.LastCellNum; i++)
    {
        Console.WriteLine(row.GetCell(i));
    }
    hssfwb.Write(file);
    file.Close();
}

我确实尝试添加以下内容,但结果是一个无法打开的空白文件。

MemoryStream mstream = new MemoryStream();
hssfwb.Write(mstream);

byte[] bytes = new byte[mstream.Length];
mstream.Read(bytes, 0, (int)mstream.Length);
file.Write(bytes, 0, bytes.Length);
file.Close();
mstream.Close();

我还尝试将 hssfwb 单独放在 using 范围内,将文件模式更改为 Append/openorcreate/truncate,如果写入检查没有任何结果,则添加。

然而,一种解决方案是读取文件,将其转换为数据表,创建一个新的 excel 文件并用数据填充它。

我做错了什么?任何人都可以阐明这一点吗?我徒劳地查看了 Npoi Example 包。

最佳答案

好吧,看起来 HSSFWorkbook 构造函数在读取文件流后关闭了它。

最简单直接的解决方案 - 打开文件进行读取,创建 HSSFWorkbook,在该工作簿中执行您想要的操作,然后再次打开文件进行写入并写入。

using 范围之外使用 hssfwb 是安全的,因为 HSSFWorkbook 本身不保存对从中读取的文件的引用(如只要我在 NPOI 资源中看到它。

因此您的代码可能如下所示:

HSSFWorkbook hssfwb;
using (FileStream file = new FileStream(@"c:\temp\testfile.xls", FileMode.Open, FileAccess.Read))
{
    hssfwb = new HSSFWorkbook(file);
    file.Close();
}

ISheet sheet = hssfwb.GetSheetAt(0);
IRow row = sheet.GetRow(0);

sheet.CreateRow(row.LastCellNum);
ICell cell = row.CreateCell(row.LastCellNum);
cell.SetCellValue("test");

for (int i = 0; i < row.LastCellNum; i++)
{
    Console.WriteLine(row.GetCell(i));
}

using (FileStream file = new FileStream(@"c:\temp\testfile.xls", FileMode.Open, FileAccess.Write))
{
    hssfwb.Write(file);
    file.Close();
}

关于c# - 编辑现有的 Excel 文件 C# npoi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27507412/

相关文章:

c# - 将子进程的输出(stdout、stderr)重定向到 Visual Studio 中的输出窗口

C# 将 int 转换为浮点抛出异常(在运行时)

excel - 如何在使用 NPOI 创建的 Excel 文档中将列设置为 'autosize'?

c# - 有没有办法使用 NPOI/C# 将 HTML 表转换为 xls/xlsx 文件?

c# - 使用 Action<T> 创建任务

c# - Unity3D - 是否可以通过脚本设置动画剪辑的属性?

c# - 尝试将粗体应用于整行但不断获得空引用 - NPOI

c# - 如何从 C# 中的字符串中删除非 ASCII 单词

c# - 如何在 ASP MVC 中下载 NPOI 生成的 xls 文件