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 ...
随机推荐
- 微服务学习笔记一:Spring Cloud简介
1.Spring Cloud是一个工具集:Spring Cloud是在Spring Boot的基础上构建的,用于简化分布式系统构建的工具集:使架构师在创建和发布微服务时极为便捷和有效. Sp ...
- mysql四:数据操作
一.介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...
- html5格式样式
<b> 加粗 <b style="font-size: 100px;">大字体</b>
- Java入门到精通——调错篇之EasyUI+SpringMVC Form表单提交到Contorller中文字出现乱码
一.错误现象. 界面Post提交到Contorller的时候在Contorller中出现乱码. 二.问题解决. 在Web.xml下加入以下代码就可以解决. <filter> <fil ...
- (六)svn 服务器端使用之权限管理
权限管理(了解) 认证授权机制 在企业开发中会为每位程序员.测试人员等相关人员分配一个账号,用户通过使用svn客户端连接svn服务时需要输入账号和密码,svn服务对账号和密码进行校验,输入正确可以继续 ...
- 1.windows下GIT 服务安装
本章介绍简单在windows 安装git 服务方法.服务器端采用的是Bonobo Git Server,一款用ASP.NET MVC开发的Git源代码管理工具,界面简洁,基于Web方式配置,简单易用. ...
- 【Leetcode】【Easy】Plus One
Given a non-negative number represented as an array of digits, plus one to the number. The digits ar ...
- vue + element-ui 制作tab切换(适用于单页切换不同标记显示不同内容)
本篇文章使用vue结合element开发tab切换单页不同的标记显示不同的内容. 1.安装element-ui npm install element-ui --save 2.在main.js中引入e ...
- Orchard Core 文档翻译 (二)代码生成模板 Code Generation Templates
Code Generation Templates 翻译原文:https://www.cnblogs.com/Qbit/p/9746457.html转载请注明出处 Orchard Core Templ ...
- Android下最小化程序到后台代码
procedure TForm1.Button4Click(Sender: TObject); var Intent: JIntent; begin Intent := TJIntent. ...