一、问题导入
平时在开发程序的时候,我们或多或少会遇到附件上传下载的功能。就在前不久我就遇到了excel解析数据到库里,而且还是多个sheet页那种,一下子犯了难。因为之前接触过Hutool工具,就打开文档用了起来,不过文档里的介绍很精简,里面的一些用法不太清楚,在经过一些摸索后,便把解析excel的方法记录了下来。
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。
Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;
Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。
二、问题分析
-
导入Hutool的jar包
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.5.4</version> </dependency> 复制代码
2.读取Excel内容的封装,通过构造ExcelReader对象,指定被读取的Excel文件、流或工作簿,然后调用readXXX方法读取内容为指定格式。
// 1.获取上传文件file输入流并应用HUtool ExcelUtil获取ExcelReader指定输入流和sheet
ExcelReader incomeReader = ExcelUtil.getReader(file.getInputStream(),"收入");
// 2.读取第二行到最后一行数据
List<List<Object>> incomeData = incomeReader.read(1, incomeReader.getRowCount());
// 3.对数据进行解析
for (List<Object> list : incomeData) {
FinanceIncome financeIncome = new FinanceIncome();
// 年月日 String MM =list.get(1).toString(); String dd =list.get(2).toString();
if (list.get(1).toString().length()==1) {
MM = "0" +list.get(1).toString();
}
if (list.get(2).toString().length()==1) {
dd = "0" +list.get(2).toString();
}
String time = list.get(0).toString() + "-" + MM + "-" + dd;
financeIncome.setTime(LocalDate.parse(time, formatter));
// 项目编号
financeIncome.setProjectNo(list.get(3).toString());
// 单位名称
financeIncome.setName(list.get(4).toString());
// 金额
BigDecimal bd = new BigDecimal(list.get(5).toString());
financeIncome.setAmount(bd.setScale(2, RoundingMode.HALF_UP));
// 凭证号
financeIncome.setVoucher(list.get(6).toString());
// 备注
financeIncome.setRemark(list.get(7).toString());
// 批次号
financeIncome.setBatch(financeAdministrationResult.getId());
financeIncomeMapper.insert(financeIncome);
}
复制代码
3.第二步只展示了其中“收入”工作簿解析方式,其它两个工作簿的解析,不外乎把ExcelUtil.getReader方法中的"收入"换成指定的工作簿内容即可。
// 人工费用sheet
ExcelReader artificialReader = ExcelUtil.getReader(file.getInputStream(),"人工费用");
// 外部采购
sheetExcelReader externalReader = ExcelUtil.getReader(file.getInputStream(),"外部采购");
复制代码
三、总结
- 遇到问题时,可以打开源码看一下,也许会有意外惊喜。比如该方法ExcelUtil.getReader(file.getInputStream(),"收入")里默认打开了关闭流,所以我的代码里没有展示流关闭内容
- Hutool官网:www.hutool.cn/docs/#/