编辑现有的Excel文件C#npoi

Hen*_*ung 8 c# npoi

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

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

输出:

"无法访问已关闭的文件."

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();
}
Run Code Online (Sandbox Code Playgroud)

我确实尝试添加以下内容但它导致了一个无法打开的空白文件.

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();
Run Code Online (Sandbox Code Playgroud)

我还尝试将hssfwb单独放在使用范围内,将filemode更改为Append/openorcreate/truncate,如果写入检查则添加没有任何结果.

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

我究竟做错了什么?任何人都可以对此有所了解吗?我徒劳地看着Npoi示例包.

And*_*yev 17

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

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

hssfwbusing范围之外使用是安全的,因为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();
}
Run Code Online (Sandbox Code Playgroud)