我想使用控制台应用程序 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/