NPOI插件的弊端

刚来公司的时候公司软件导入导出操作都使用微软的office组件来实现,大家应该都知道这个组件有很大的弊端,就是运行主机上面必须安装office组件才可进行使用,不然无法进行导入导出操作,之前公司软件部门给的做法就是直接让客户安装Office就可以解决。

我接手后知道这个弊端,将插件进行了替换,使用网上比较流行的NPOI插件,基本上很少出现关于软件导入导出数据的反馈。但由于之前的软件需求基本都是少量数据的导入导出,NPOI都可以满足,现在新需求要求导入导出超过40w行的数据,NPOI插件就暴露出来弊端,在数据少的时候使用.xlsx的XFFSWorkbook类就可以实现,但是数据量超过某一个阀值,XFFSWorkbook就出现了异常,爆出内存溢出的消息,而且声明和访问时速度特别慢,感觉是组件内部在处理大数据文件时存在问题。

在网上查找发现NPOI对于大数据的处理有一个SXSSFWorkbook,它是NPOI专门来处理大数据文件的,我在使用过程中,当写入时,没问题可以使用,但是效率方面很差。可是在读取时,根本无法使用,因为它在使用过程中必须声明XFFWorkbook才可以,可是声明它的话就会遇到内存溢出问题。网上还有说直接使用xml形式来读取,但是xml格式需要自己去定义和解析,特别麻烦,故没有采用。

//声明处理.xlsx文件的方法(小文件)
IWorkbook workbook=new XSSFWorkbook(); //声明处理.xlsx文件的方法(大文件)
IWorkbook workbook=new XSSFWorkbook();
IWorkbook wb=new SXSSFWorkbook(workbook);

ExcelDataReader插件

在处理读取.xlsx文件时,在nuget中发现了ExcelDataReader插件,在做了demo后,对于40w行的读取很方便,而且速度特别快。推荐大家使用。

            FileStream fs = null;
IExcelDataReader excelReader = null;
try
{
fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
excelReader = ExcelReaderFactory.CreateOpenXmlReader(fs);
int readIndex = 0;
int rowCount = excelReader.RowCount; //所有的行
DataRow dr;
object tempValue; while (excelReader.Read())
{
dr = data.NewRow(); if (readIndex == startReadRowCount)
{
++readIndex;
continue;
} //读取Excel中的头文件信息
if (readIndex <startReadRowCount)
{
dr[0] = excelReader.GetValue(0).ToString();
tempValue = excelReader.GetValue(1);
if (tempValue==null)
{
dr[1] = DBNull.Value;
}
else
{
dr[1] = excelReader.GetValue(1).ToString();
} dr[2] = DBNull.Value;
dr[3] = DBNull.Value;
dr[4] = DBNull.Value;
dr[5] = DBNull.Value;
dr[6] = DBNull.Value;
}
else
{
dr[0] = excelReader.GetValue(0).ToString();
dr[1] = excelReader.GetValue(1).ToString();
dr[2] = Convert.ToDouble(excelReader.GetValue(2)); tempValue = excelReader.GetValue(3);
if (tempValue == null)
{
dr[3] = DBNull.Value;
}
else
{
dr[3] = Convert.ToDouble(excelReader.GetValue(3));
}
dr[4] = Convert.ToDouble(excelReader.GetValue(4));
dr[5] = Convert.ToDouble(excelReader.GetValue(5));
dr[6] = Convert.ToDouble(excelReader.GetValue(6));
}
data.Rows.Add(dr);
if (worker.CancellationPending) // 如果用户取消则跳出处理数据代码
{
e.Cancel = true;
break;
}
worker.ReportProgress(readIndex * 100 / rowCount);//加载进度条
++readIndex;
}
fs.Close();
fs.Dispose();
excelReader.Close();
excelReader.Dispose();
return data;
}
catch (Exception ex)
{
if (worker.CancellationPending) // 如果用户取消则跳出处理数据代码
{
e.Cancel = true;
} if (fs != null)
{
fs.Close();
fs.Dispose();
} if (excelReader != null)
{
excelReader.Close();
excelReader.Dispose();
}
throw new Exception("" + ex.Message);
}

插件下载地址:

https://www.nuget.org/packages/ExcelDataReader/3.0.0

ExcelDataReader插件的使用的更多相关文章

  1. Angular杂谈系列1-如何在Angular2中使用jQuery及其插件

    jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大 ...

  2. Jenkins 安装的HTML Publisher Plugin 插件无法展示ant生成的JunitReport报告

    最近在做基于jenkins ant  junit 的测试持续集成,单独ant junit生成的junitreport报告打开正常,使用Jenkins的HTML Publisher Plugin 插件无 ...

  3. 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)

    前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...

  4. solr服务中集成IKAnalyzer中文分词器、集成dataimportHandler插件

    昨天已经在Tomcat容器中成功的部署了solr全文检索引擎系统的服务:今天来分享一下solr服务在海量数据的网站中是如何实现数据的检索. 在solr服务中集成IKAnalyzer中文分词器的步骤: ...

  5. 使用Visual Studio SDK制作GLSL词法着色插件

    使用Visual Studio SDK制作GLSL词法着色插件 我们在Visual Studio上开发OpenGL ES项目时,避免不了写Shader.这时在vs里直接编辑shader就会显得很方便. ...

  6. 工欲善其事,必先利其器 之 VS2013全攻略(安装,技巧,快捷键,插件)!

    如有需要WPF工具的朋友可以移步 工欲善其事,必先利其器 之 WPF篇: 随着开发轨迹来看高效WPF开发的工具和技巧 之前一篇<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATI ...

  7. Jquery mobiscroll 移动设备(手机)wap日期时间选择插件以及滑动、滚动插件

    Jquery Mobiscroll是一个用于触摸设备(Android phones, iPhone, iPad, Galaxy Tab)的日期和时间选择器jQuery插件.以及各种滑动插件 可以让用户 ...

  8. 10个最好用的HTML/CSS 工具、插件和资料库

    大家在使用HTML/CSS开发项目的过程中,有使用过哪些工具,插件和库?下面介绍的10种HTML/CSS工具,插件和资料库,是国外程序员经常用到的. Firebug Lite FirebugLite ...

  9. 在Sublime Text 3上安装代码格式化插件CodeFormatter

    1.了解CodeFormatter插件 在Sublime Text 3中编写代码,为了能让我们的代码格式变得漂亮整洁,需要一个能自动格式代码的插件.这里发现CodeFormatter插件不错,它能支持 ...

  10. 【解决方案】Myeclipse 10 安装 GIT 插件 集成 步骤 图解

    工程开发中,往往要使用到集成GIT ,那么下面说说插件安装步骤 PS:以Myeclipse 10 为例,讲解集成安装步骤. ----------------------main------------ ...

随机推荐

  1. Flutter在iOS中一些点

    1. ios对Flutter有如下依赖 Flutter.framework:     Flutter engine等: APP.framework:业务代码, 由dart代码生成.App.framew ...

  2. xshell和xftp绿色版下载

    下载地址:https://www.xshell.com/zh/free-for-home-school/ 点击后页面如下,输入自己的姓名和邮箱然后点击下载即可.登录自己的邮箱获取下载链接.

  3. PVE设置定时关闭、启动虚拟机

    shell中输入命令: crontab -e 进入对应cron 添加命令: 例如: 00 2 * * * pvesh create /nodes/pve/qemu/102/status/stop 00 ...

  4. centos7 安装 elasticsearch 7.15

    下载 elasticsearch wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.15.2-linu ...

  5. Spring Boot 中处理跨域

    HTML 5中新增的跨域资源访问(Cross-Origin Resource Sharing)特性可以让我们在开发后端系统的时候决定资源是否允许被跨域访问.所谓跨域指的是域名不同或者端口不同或者协议不 ...

  6. java mysql截取所需数据

    mysql截取数据: 例:截取门铺名称,门铺名称长度不确定 {"进店日期":"2022-09-01","电话":"1******* ...

  7. vue-固定头部-内容可滚动

     <div class="show-box">             <div class="show-top">           ...

  8. VUE keepAlive缓存问题之动态使用exclude(会使用到VUEX)

    exclude是啥? 官方解释: 怎么用呢? 处理的问题是什么?(答:返回首页的时候清除B页面的缓存) 我遇到的问题是: 一开始状态:A(首页). B(列表).C(列表中的详情)三个页面,设置B页面的 ...

  9. python学习记录(二)-特殊函数

    闭包函数 def outer(): var = 100 def inner(): nonlocal var var += 200 print(var) return inner res = outer ...

  10. CH573 CH579 CH582程序烧录讲解

    WCH的蓝牙芯片CH57x/CH58x系类大部分是支持串口烧录.USB烧录和LINK烧录的,除了一些特殊的封装,如571K,它引脚较少,只支持串口免按键烧录. 仿真下载:ARM内核的CH579支持Jl ...