ExcelDataReader插件的使用
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插件的使用的更多相关文章
- Angular杂谈系列1-如何在Angular2中使用jQuery及其插件
jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大 ...
- Jenkins 安装的HTML Publisher Plugin 插件无法展示ant生成的JunitReport报告
最近在做基于jenkins ant junit 的测试持续集成,单独ant junit生成的junitreport报告打开正常,使用Jenkins的HTML Publisher Plugin 插件无 ...
- 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)
前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...
- solr服务中集成IKAnalyzer中文分词器、集成dataimportHandler插件
昨天已经在Tomcat容器中成功的部署了solr全文检索引擎系统的服务:今天来分享一下solr服务在海量数据的网站中是如何实现数据的检索. 在solr服务中集成IKAnalyzer中文分词器的步骤: ...
- 使用Visual Studio SDK制作GLSL词法着色插件
使用Visual Studio SDK制作GLSL词法着色插件 我们在Visual Studio上开发OpenGL ES项目时,避免不了写Shader.这时在vs里直接编辑shader就会显得很方便. ...
- 工欲善其事,必先利其器 之 VS2013全攻略(安装,技巧,快捷键,插件)!
如有需要WPF工具的朋友可以移步 工欲善其事,必先利其器 之 WPF篇: 随着开发轨迹来看高效WPF开发的工具和技巧 之前一篇<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATI ...
- Jquery mobiscroll 移动设备(手机)wap日期时间选择插件以及滑动、滚动插件
Jquery Mobiscroll是一个用于触摸设备(Android phones, iPhone, iPad, Galaxy Tab)的日期和时间选择器jQuery插件.以及各种滑动插件 可以让用户 ...
- 10个最好用的HTML/CSS 工具、插件和资料库
大家在使用HTML/CSS开发项目的过程中,有使用过哪些工具,插件和库?下面介绍的10种HTML/CSS工具,插件和资料库,是国外程序员经常用到的. Firebug Lite FirebugLite ...
- 在Sublime Text 3上安装代码格式化插件CodeFormatter
1.了解CodeFormatter插件 在Sublime Text 3中编写代码,为了能让我们的代码格式变得漂亮整洁,需要一个能自动格式代码的插件.这里发现CodeFormatter插件不错,它能支持 ...
- 【解决方案】Myeclipse 10 安装 GIT 插件 集成 步骤 图解
工程开发中,往往要使用到集成GIT ,那么下面说说插件安装步骤 PS:以Myeclipse 10 为例,讲解集成安装步骤. ----------------------main------------ ...
随机推荐
- 【git】 的基本命令
1.push命令: 2.pull命令: 3.commit命令: 4.add命令: 5.checkout命令: 6.fetch/clone命令. 7.版本回退 git log 查看版本号(每次提交 ...
- 在linux环境下自动执行python脚本
有时候编辑的py文件,需要进行自动执行时,可以用以下方式进行定时 00 09 * * * /usr/local/bin/python3 /udata/ubi/uenbi_py/trade_all_da ...
- Dependencies 和 Libraries 的区别
Dependencies 和 Libraries 的区别 - 如何导入 jar 包 虽然现在的项目大多数人更愿意使用 Maven 等工具构建,但是在学习 Project Structure 这块的时候 ...
- centos7 升级gcc
#安装gcc yum install -y gcc-c++ autoconf automake #centos7 默认的 gcc 默认是4.8.5,版本小于 5.3 无法编译,需要先安装gcc新版 ...
- 07 HBase操作
1.理解HBase表模型及四维坐标:行键.列族.列限定符和时间戳. 2.启动HDFS,启动HBase,进入HBaseShell命令行. 3.列出HBase中所有的表信息list 4.创建表create ...
- JS数组创建
1.使用Array构造函数 var arr1 = new Array(); //创建一个空数组 var arr2 = new Array(10); // 创建一个包含10项的数组 var arr3 = ...
- Promise 一些注意点
Promise是一个构造函数,其身上有all.race.resolve.reject这些方法,都可以通过 Promise. 调用. 注意点1 Promise构造函数接受一个参数 => funct ...
- Java线上日志分析
1.查询关键字前后30行 cat 日志文件名.log | grep -30 '关键字' 例: cat mcs-all.log | grep -30 '2019-04-08 13:30:04,271' ...
- lambda表达式--箭头函数
箭头函数(匿名函数):输入参数+->+函数结果(只有当函数需要执行多条语句时,才需要return关键字和花括号) 什么是Lambda? 我们知道,对于一个Java变量,我们可以赋给其一个&quo ...
- v-imgerror作用:当图片链接无效的时候,显示默认图片内容
// 回顾自定义指令 // 作用: 自定义一些对DOM的操作快捷指令 // 前提: 指令就是用来操作DOM (v-if/v-show/v-for....) // 语法: Vue.directive(指 ...