教你轻松解析多个sheet页的Excel

·  阅读 108

一、问题导入

平时在开发程序的时候,我们或多或少会遇到附件上传下载的功能。就在前不久我就遇到了excel解析数据到库里,而且还是多个sheet页那种,一下子犯了难。因为之前接触过Hutool工具,就打开文档用了起来,不过文档里的介绍很精简,里面的一些用法不太清楚,在经过一些摸索后,便把解析excel的方法记录了下来。

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。

Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;

Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。

二、问题分析

  1. 导入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/#/
分类:
后端
标签:
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改