NPOI追加内容到xlsx报错,用Epplus往excle xlsx追加数据
问题的现象就是,只要不修改xlsx,一直写入或者再次写入xlsx,追加内容都是不会有问题的。但是只要你修改了xlsx,用excle2010或者2007修改了xlsx的内容里面的列宽,或者行高,或者进行其他的操作。再次用NPOI往这个xlsx里面追加内容的时候,就会损坏这个xlsx文件。也就是说,NPOI在读取xlsx,如果这个xlsx不是由xlsx原始生成的,或者是原本是NPOI生成的,但是用户中途进行了修改,哪怕是改动了一丁点儿,比如列宽,行高,那么再次写入的时候xlsx就被写坏了,无法用EXCLE打开,打开会提示当前文件含有格式不正确的数据。
总结一句话:读写高级版本的xlsx不要使用NPOI, 而要使用EPPLUS。血的教训。被坑了半天时间。
如果是网站生成数据格式,供用户下载,用下面代码,NPOI没有问题,如果是反复读写的场景,甚至还有用户修改这个excle文件的话,比如电脑端NPOI对这个文件读写,用户在手机端修改同一个文件,建议用EPPLUS.下面是NPOI追加数据的代码。
public static IWorkbook LoadWorkbook(string filePath)
{
IWorkbook workbook;
using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) //读入excel模板
{
if (filePath.EndsWith("xlsx"))
{
return workbook = new XSSFWorkbook(fileStream);
}
else
{
return workbook = new HSSFWorkbook(fileStream);
} }
}
private void SaveToExcle()
{
try
{
string currentPath = Environment.CurrentDirectory;
IWorkbook workbook = LoadWorkbook(currentPath + "\\1.xlsx"); ISheet sheet = workbook.GetSheetAt(); //获取工作表
IRow row = sheet.GetRow(); //得到表头 using (FileStream fout = new FileStream(currentPath + "\\1.xlsx", FileMode.Open, FileAccess.Write, FileShare.ReadWrite))
{
row = sheet.CreateRow((sheet.LastRowNum + )); //在工作表中添加一行
ICell cell1 = row.CreateCell();
cell1.SetCellValue(label_enghlis.Text); //赋值 ICell cell2 = row.CreateCell();
cell2.SetCellValue(textBox1.Text); //赋值 ICell cell3 = row.CreateCell();
cell3.SetCellValue(label_Rank.Text); //赋值
fout.Flush();
workbook.Write(fout); } workbook = null;
textBox1.Text = string.Empty;
}
catch (Exception e)
{
MessageBox.Show(e.Message);
} }
以上只要你用excle2007或者excle2010修改excle就问题。
下面是用的EPPLUS,初始化,创建一个xlsx文件,并且初始化,给sheet名字,表头标题赋值。

winform初始化,在根目录创建xlsx文件。需要Nuget引入Epplus。using OfficeOpenXml;
下面是winform初始化,用Epplus组件在根目录建立xlsx文件。
if (!File.Exists(currentPath + "\\1.xlsx")) //不存在则创建
{
FileInfo newFile = new FileInfo(currentPath + @"\1.xlsx");
using (ExcelPackage package = new ExcelPackage(newFile))
{
// add a new worksheet to the empty workbook
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("单词本");
//Add the headers
worksheet.Cells[1, 1].Value = "单词";
worksheet.Cells[1, 2].Value = "词义";
worksheet.Cells[1, 3].Value = "词频";
package.Save();
}
}
下面是Epplus追加数据到xlsx的代码:
private void SaveToXlsX()
{
try
{
string currentPath = Environment.CurrentDirectory;
// ok, we can run the real code of the sample now
if (File.Exists(currentPath + "\\1.xlsx")) //如果存在则直接打开
{
FileInfo newFile = new FileInfo(currentPath + @"\1.xlsx");
using (ExcelPackage package = new ExcelPackage(newFile))
{
// add a new worksheet to the empty workbook
ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
//获得最后一行,这里其实获取的是总行数,追加数据的话,需要+1
int lastRow = worksheet.Dimension.End.Row;
worksheet.Cells[lastRow+1, 1].Value = label_enghlis.Text;
worksheet.Cells[lastRow+1, 2].Value = textBox1.Text;
worksheet.Cells[lastRow+1, 3].Value = label_Rank.Text;
package.Save();
}
}
textBox1.Text = string.Empty;
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
真正往xlsx追加数据。


excel07以上的版本支持最大行数104 8576行 ,百万行数据。如果是用追加的方式可能会更好。
NPOI追加内容到xlsx报错,用Epplus往excle xlsx追加数据的更多相关文章
- 【poi xlsx报错】使用POI创建xlsx无法打开
如果使用的XSSFWorkbook创建的xls,打开的时候会有这样的提示: 这样 XSSFWorkbook 和HSSFWorkbook的区别. HSSF - 提供读写Microsoft Excel X ...
- jQuery Post 提交内容中有标签报错
Post编辑一点内容要传后台数据库: var html = editor2.html() console.log(encodeURIComponent(html)); //console.log(&q ...
- svn提交代码时不要提交bulid里的内容,会报错
- 【docker】 追加端口映射时 报错 WARNING: IPv4 forwarding is disabled. Networking will not work.
解决办法: vi /etc/sysctl.conf 添加如下代码: net.ipv4.ip_forward= 重启network服务 systemctl restart network 查看: sys ...
- 在用EF新增对象存贮至数据库时汪报错,但数据库里没有新增数据
大致的问题是这样的: 原来一直用存贮数据的方法是用的是:DBContext.AddToXXXX(),这个方法.在写代码的时候看到VS提示这个方法已失效,推荐使用DBContext.XXXX.AddOb ...
- phpexcel导入xlsx文件报错xlsx is not recognised as an OLE file 怎么办
最初的做法 代码如下 1 include 'classes/PHPExcel/IOFactory.php'; 2 $inputFileName = $target; 3 $objReader = n ...
- 夺命雷公狗---DEDECMS----4快速入门之栏目页报错之快速解决
我们dedecms是分3级或者3层的,如下图所示: 点击“玄幻小说”后发现出了错,如下图所示: 我们的dedecms是分3层的,他们分别是: 网站首页 网站的栏目页面(多级)--->栏目页面是需 ...
- masterha_check_repl报错汇总
[root@DBMysql ~]#masterha_check_repl --conf=/etc/masterha/app1.cnf 导致如下报错的原因主要有两类: 1.mysql的安装时用源码安装, ...
- redis 写入的时候报错
redis 写入报错 1)报错内容 Exception in thread "main" redis.clients.jedis.exceptions.JedisDataExcep ...
随机推荐
- BZOJ5249: [2018多省省队联测]IIIDX(线段树 贪心)
题意 题目链接 Sol 不难发现题目给出的是一个树,其中\(\frac{i}{K}\)是\(i\)的父亲节点 首先,当\(d_i\)互不相同时,一个显然的贪心策略就是优先给编号小的分配较大的权值.可以 ...
- HDU 5215 Cycle(dfs判环)
题意 题目链接 \(T\)组数据,给出\(n\)个点\(m\)条边的无向图,问是否存在一个奇环/偶环 Sol 奇环比较好判断吧,直接判是否是二分图就行了.. 偶环看起来很显然就是如果dfs到一个和他颜 ...
- 软件项目技术点(2)——Canvas之坐标系转换
AxeSlide软件项目梳理 canvas绘图系列知识点整理 默认坐标系与当前坐标系 canvas中的坐标是从左上角开始的,x轴沿着水平方向(按像素)向右延伸,y轴沿垂直方向向下延伸.左上角坐标为 ...
- CSS深入理解学习笔记之border
1.border-width border-width为何不支持百分比:语义和使用场景决定的,现实中各种边框本身的概念就不存在百分比的使用方法. border-width支持关键字:thin.medi ...
- ArcEngine开发鹰眼实现问题
在网上百度一下有关AE鹰眼实现的代码,基本是一样的,可问题是好多代码自己运行起来鹰眼却总是加不进地图.住视图axMapControl1.OnMapReplaced(),axMapControl1.On ...
- Multidex (方法数超过限制的处理)
报错 : Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536 ...
- C++异步编程资料汇集贴
C++异步编程 http://www.cnblogs.com/zjjcy/archive/2012/03/18/2404214.htmlhttp://www.cnblogs.com/zjjcy/arc ...
- SqlServer存储过程示例
/* 步骤1 删除本地及海关单证待分派表.报关单表中的数据 delete from W_DOCUMENTS; delete from W_DOCUMENTS_TEST; delete from W_D ...
- 【Leetcode】【Easy】Remove Nth Node From End of List
Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...
- IOS HTML+CSS+JS 总结
一.HTML + CSS 1.能看到标签的结构* 父子关系<p> <span>123</span></p> * 属性<img src=&qu ...