[英]C# NPOI library : xlsx file is not updated after modification
所以我有以下代码,我正在尝试修改 Excel 工作表。 在4th
行,我添加了带有test
作为字符串的额外单元格,但我的文件没有更新。 看了很多关于NPOI
库的文章,发现很少有版本不支持写xlsx
文件。 但我想我使用的是2.2.1
,它应该这样做。 请帮帮我。
enter code here
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using Excel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
namespace PantheonProject
{
public class test
{
public static void testMethod()
{
XSSFWorkbook hssfwb;
using (FileStream file = new FileStream(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx", FileMode.Open, FileAccess.Read))
{
hssfwb = new XSSFWorkbook(file);
file.Close();
}
ISheet sheet = hssfwb.GetSheetAt(0);
IRow row = sheet.GetRow(4);
//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(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx", FileMode.Open, FileAccess.Write))
{
hssfwb.Write(file);
file.Close();
}
}
}
}
也许您正在尝试从这个答案运行代码。 在您的代码中:
FileMode.Open
模式写入文件。 将其更改为FileMode.OpenOrCreate
或FileMode.CreateNew
。source.xlsx
),文件将被损坏,这可能是NPOI
的错误。 为输出文件指定一个不同的名称(例如-> source2.xlsx
)。尝试以下代码。 它对我有用。
public static void testMethod()
{
XSSFWorkbook hssfwb;
using (FileStream file = new FileStream(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx", FileMode.Open, FileAccess.Read))
{
hssfwb = new XSSFWorkbook(file);
file.Close();
}
ISheet sheet = hssfwb.GetSheetAt(0);
IRow row = sheet.GetRow(4);
//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(@"/Users/harshloomba/Documents/workspace/PantheonProject/source2.xlsx", FileMode.OpenOrCreate, FileAccess.Write))
{
hssfwb.Write(file);
file.Close();
}
}
解决方案2
如果您不想更改文件名,请删除输入文件并创建一个具有相同文件名的新文件。
public static void testMethod()
{
XSSFWorkbook hssfwb;
using (FileStream file = new FileStream(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx", FileMode.Open, FileAccess.Read))
{
hssfwb = new XSSFWorkbook(file);
file.Close();
}
ISheet sheet = hssfwb.GetSheetAt(0);
IRow row = sheet.GetRow(4);
//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));
}
File.Delete(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx");
using (FileStream file = new FileStream(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx", FileMode.OpenOrCreate, FileAccess.Write))
{
hssfwb.Write(file);
file.Close();
}
}
解决方案 3:当您不想删除和重新创建文件时(如解决方案 2 )
在这种情况下,您应该使用NPOI
创建文件,而不是手动创建 excel 文件(见下图)。
如果您使用 NPOI 创建 excel 文件,您可以编辑/修改相同的文件。 这一次它不会被破坏。 为了正确使用以下代码,我假设您已经使用NPOI
创建了source.xlsx
。
public static void testMethod()
{
XSSFWorkbook hssfwb;
using (FileStream file = new FileStream(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx", FileMode.Open, FileAccess.Read))
{
hssfwb = new XSSFWorkbook(file);
file.Close();
}
ISheet sheet = hssfwb.GetSheetAt(0);
IRow row = sheet.GetRow(4);
//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(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx", FileMode.OpenOrCreate, FileAccess.Write))
{
hssfwb.Write(file);
file.Close();
}
}
我已经修改了建议的内容,但什么也没发生,然后我使用 IKVM.net 将 Apache poi 移植到 Xamarin Studio 中,它工作得非常好。 你也可以试试
通过简单地调用带有空参数的 Write() 方法,我能够克服写入辅助文件的问题。
IWorkbook myWorkbook = new XSSFWorkbook(@"c:\temp\Report.xlsx");
ISheet mySheet = myWorkbook.GetSheet("SheetName");
//...
//modify mySheet as needed
//...
myWorkbook.Write(null);
myWorkbook.Close();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.