去年项目有一个子模块需要解析上百张不一样的excel表格入库,当时用的NPOI,做了很久...也尝试想把代码分享到oschina,结果没坚持两篇就放弃了。
赶巧的是,昨天运营那边提出要录入一些基础数据,我想着也就几百个员工、企业的信息,自己找两个姑娘手动录入呗(为啥是姑娘?让一个大老爷们去录假数据,你去吗?反正我不去)...结果,一个同事吭哧吭哧跑来找我:
“手动录入太慢了,填一堆基本信息,还要传头像,传身份证,传营业执照什么的”
嗯哼!想让我写代码给你们录?没门!
于是忽悠道“唉,找领导多要几个人呗。你看我就算给你写代码上传,你也得先整理好excel,图片单独在文件夹存好,还得能和excel的数据匹配起来,等你做完这些,早该手动录完了...”
那同事晃悠着脑袋想了想,说“几万条数据呢,手动录得猴年马月了。再说数据格式本来就很整齐,图片也能和名字匹配上”...然后嘻嘻的望着我
窝艹,怎么感觉挖坑把自己埋了。再说,尼玛现在的运营假数据都是上万条上万条的入库了?我们这些小码农还是太呆啊...
自己挖的坑,含着泪也得填完。
这不,今天又翻出了去年那个项目的代码和资料,扑哧扑哧的干活...
先来介绍一下NPOI基本的东西:
1.下载地址:http://npoi.codeplex.com (最新版已经2.2.0.0了)
2.包里面的DLL文件:
NPOI.dll
OOXML.dll
OpenXml4Net.dll
OpenXmlFormats.dll
ICSharpCode.SharpZipLib.dll
3.NPOI 2.0以后的版本都支持OOXML(EXCEL2007及以上版本)。带XSSF的命名空间支持07及以上,HSSF支持03版本。
XSSF中XSSFWorkbook,XSSFSheet,XSSFRow,XSSFCell分别对应EXCEL中工作簿,工作表,行,列。
HSSF中同样有HSSFWorkbook,HSSFSheet,HSSFRow,HSSFCell
它们继承于同一个接口:IWorkbook(命名空间:using NPOI.SS.UserModel;)
可以用如下代码做版本判断(暂时只考虑.xls与.xlsx文件,博主没用.csv)
IWorkbook workbook = null; if(System.IO.Path.GetExtension(filePath)=="xls") { workbook = new HSSFWorkbook(ExcelFileStream); } else if(System.IO.Path.GetExtension(filePath)=="xlsx") { workbook = new XSSFWorkbook(ExcelFileStream); } else { throw new exception("文件类型错误"); }
4.常用的基本方法:
创建工作簿 IWorkbook workbook = new XSSFWorkbook();
按指定名称创建Sheet workbook.CreateSheet("SheetName");
移出Sheet workbook.RemoveSheetAt(SheetIndex);
按名称获得Sheet对象 ISheet sheet = workbook.GetSheet("SheetName ");
根据索引获得Sheet对象 ISheet sheet = workbook.GetSheetAt(SheetIndex);
获得某一个ISheet的所有IRow,通常可以用 ISheet.GetRowEnumerator()
获得某一特定行,可以直接用 ISheet.GetRow(rowIndex)
工作表中第一个有数据行的行号 ISheet.FirstRowNum
工作表中最后一个有数据行的行号 ISheet.LastRowNum
一行中第一个有数据列的列号 IRow.FirstCellNum
一行中最后一个有数据列的列号 IRow.LastCellNum
获取sheet所有合并单元格索引 ISheet.NumMergedRegions
获取某合并单元格的地址(i是合并单元格索引) ISheet.GetMergedRegion(i)
获得数据类型CellRangeAddress,含起始行号和列号
获取某单元格值 Row.GetCell(j).StringCellValue.Trim()
公式单元格如果是数字可以:Row.GetCell(j).NumericCellValue.ToString()
5.NPOI.DLL中包含的模块
NPOI.Util 基础辅助库
NPOI.POIFS OLE2格式读写库,主要负责处理DocumentInformation
NPOI.DDF Microsoft Drawing格式读写库
NPOI.SS Excel 2003和Excel 2007操作库共用的接口库以及公用模块实现,如公式计算库
NPOI.HPSF OLE2的Summary Information和Document Summary Information属性读写库
NPOI.HSSF Excel BIFF格式读写库,这是用户用的最多的命名空间
6.NPOI.OOXML.DLL中包含的模块(主要是2007版本操作方法)
NPOI.XSSF Excel 2007操作库,大部分对象都实现了NPOI.SS的接口
NPOI.XWPF Word 2007操作库
7.EXCEL单元格值基本类型
Unknown = -1, // 未知
Numeric = 0, // 数值型
String = 1, // 文本型
Formula = 2, // 公式型
Blank = 3, // 空白
Boolean = 4, // 布尔型
Error = 5, // 错误
感觉基本常用的就是这些,需要用到其它接口可以直接查API。
今天也是把NPOI再复习一遍,写了一些基本的操作代码和上传设计。明天上传方法写好再继续贴出来分享给大家....
博主的基本思想是,对每一个excel模板都做一个对应的XML配置文件,里面是规则集。然后所有模板的excel上传均通过一个方法,解析数据与规则集,最后反射到DTO,再根据业务映射到不同实体,调用不同ADD服务入库
若果大家有比较好的其他开源的操作excel的组件,也欢迎指教。很久不做这一块,不太了解行情了...
原创文章,代码都是从自己项目里贴出来的(或者自己挨条整理的)。转载请注明出处哦,亲~~~