问题的现象就是,只要不修改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追加数据的更多相关文章

  1. 【poi xlsx报错】使用POI创建xlsx无法打开

    如果使用的XSSFWorkbook创建的xls,打开的时候会有这样的提示: 这样 XSSFWorkbook 和HSSFWorkbook的区别. HSSF - 提供读写Microsoft Excel X ...

  2. jQuery Post 提交内容中有标签报错

    Post编辑一点内容要传后台数据库: var html = editor2.html() console.log(encodeURIComponent(html)); //console.log(&q ...

  3. svn提交代码时不要提交bulid里的内容,会报错

  4. 【docker】 追加端口映射时 报错 WARNING: IPv4 forwarding is disabled. Networking will not work.

    解决办法: vi /etc/sysctl.conf 添加如下代码: net.ipv4.ip_forward= 重启network服务 systemctl restart network 查看: sys ...

  5. 在用EF新增对象存贮至数据库时汪报错,但数据库里没有新增数据

    大致的问题是这样的: 原来一直用存贮数据的方法是用的是:DBContext.AddToXXXX(),这个方法.在写代码的时候看到VS提示这个方法已失效,推荐使用DBContext.XXXX.AddOb ...

  6. phpexcel导入xlsx文件报错xlsx is not recognised as an OLE file 怎么办

    最初的做法  代码如下 1 include 'classes/PHPExcel/IOFactory.php'; 2 $inputFileName = $target; 3 $objReader = n ...

  7. 夺命雷公狗---DEDECMS----4快速入门之栏目页报错之快速解决

    我们dedecms是分3级或者3层的,如下图所示: 点击“玄幻小说”后发现出了错,如下图所示: 我们的dedecms是分3层的,他们分别是: 网站首页 网站的栏目页面(多级)--->栏目页面是需 ...

  8. masterha_check_repl报错汇总

    [root@DBMysql ~]#masterha_check_repl --conf=/etc/masterha/app1.cnf 导致如下报错的原因主要有两类: 1.mysql的安装时用源码安装, ...

  9. redis 写入的时候报错

    redis 写入报错 1)报错内容 Exception in thread "main" redis.clients.jedis.exceptions.JedisDataExcep ...

随机推荐

  1. 【数据库】1.0 MySQL入门学习(一)——常识性知识

    1.0 什么是MySQL(官方发音 My Ess Que Ell)? 是一个快速.多线程.多用户和强壮的SQL数据库服务器,SQL是世界上最流行的标准化数据库语言. 名字来源:共同创办人Monty W ...

  2. 【起航计划ObjC 003】印第安老斑鸠ObjC的幻想 ---- ObjC经典问题

    1.Objective-C的类可以多重继承么?可以采用多个协议么? 答:不可以多重继承,可以采用多个协议. 2.#import和#include的区别是什么?#import<> 跟 #im ...

  3. geth访问公有链

    同步以太坊,配置rpc地址 mkdir /opt/blockchain nohup geth --syncmode "fast" --cache=1024 --maxpeers 3 ...

  4. Python装饰器AOP 不定长参数 鸭子类型 重载(三)

    1 可变长参数与关键字参数 *args代表任意长度可变参数 **kwargs代表关键字参数 用*args和**kwargs只是为了方便并没有强制使用它们. 缺省参数即是调用该函数时,缺省参数的值若未被 ...

  5. 【Leetcode】【Easy】Merge Sorted Array

    Given two sorted integer arrays A and B, merge B into A as one sorted array. Note:You may assume tha ...

  6. Docker 容器中相关软件安装

    Docker 容器中相关软件安装 1.介绍 我们从docker hub下载的centos镜像是只有很少的命令,需要单独安装我们所需的相关软件. 2.安装软件 安装yum-utils软件包 该软件包是辅 ...

  7. 再学UML-UML用例建模解析(一)

    UML(统一建模语言)是当前软件开发中使用最为广泛的建模技术之一,通过使用UML可以构造软件系统的需求模型(用例模型).静态模型.动态模型和架构模型.UML通过图形和文字符号来描述一个系统,它是绘制软 ...

  8. WAKE-WIN10-SOFT-CMAKE

    1,CMAKE 官网:https://cmake.org/ 下载:https://cmake.org/download/ BING:https://www.bing.com/search?q=cmak ...

  9. php之Apache压力测试

    1,测试本机是否已经安装好Apache ①进入自己的Apache目录下面的bin目录,然后执行ab -V.如果返回Apache版本则表示已经装好 2,执行压力测试命令,ab -n 1000(请求总数) ...

  10. 一张图看懂微软Power BI系列组件

    一.Power BI简介 Power BI是微软最新的商业智能(BI)概念,它包含了一系列的组件和工具.话不多说,直接上图吧: Power BI的核心理念就是让我们用户不需要强大的技术背景,只需要掌握 ...