一、自定义封装:

1、pom添加依赖:

 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.12</version></dependency> 

注意:高版本可能不兼容hasOOXMLHeader,这时只能通过判断名称来初始化wb:

boolean isExcel2007 = fileName.matches("^.+\\.(?i)(xlsx)$");Workbook wb = null;if (!isExcel2007) {// 当excel是2003时,创建excel2003wb = new HSSFWorkbook(inputStream);} else {// 当excel是2007时,创建excel2007wb = new XSSFWorkbook(inputStream);}

2、util:

package com.demo.util;import java.io.IOException;
import java.io.InputStream;
import java.io.PushbackInputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;import org.apache.poi.POIXMLDocument;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;import com.demo.exception.ExcelException;public class ExcelUtil {/*** @author: * @date: 2018-5-26 下午4:40:04* @Description: 解析* @param @param excelFile* @throws ExcelException * @throws IOException */public static List<Map<Integer, String>> getExcelData(MultipartFile excelFile,String datePattren,String numberPattern) throws ExcelException, IOException {//解析结果集,key表示第i列List<Map<Integer, String>> list = new ArrayList<>();// 文件类型String fileType = "";try {String fileName = excelFile.getOriginalFilename();fileType = fileName.substring(fileName.lastIndexOf(".") + 1,fileName.length());} catch (Exception e) {fileType = "";}if (!fileType.toLowerCase().equals("xls")&& !fileType.toLowerCase().equals("xlsx")) {throw new ExcelException("文件格式不支持,请上传xls或xlsx文件");}if ("xlsx".equals(fileType) || "xls".equals(fileType)) {Workbook wb = null;InputStream inp = excelFile.getInputStream();try {if (!inp.markSupported()) {inp = new PushbackInputStream(inp, 8);}if (POIFSFileSystem.hasPOIFSHeader(inp)) {wb = new HSSFWorkbook(inp);} else if (POIXMLDocument.hasOOXMLHeader(inp)) {wb = new XSSFWorkbook(OPCPackage.open(inp));}if (null == wb) {throw new ExcelException("导入失败");}Sheet data = wb.getSheetAt(0);// 第一个页脚// 解析for (int i = data.getFirstRowNum() + 1; i <= data.getLastRowNum(); i++) {// 第i行Row row = data.getRow(i);Iterator cells = row.cellIterator();HashMap<Integer, String> map = new HashMap<>();// 循环列while (cells.hasNext()) {// 设置单元格内容为字符串Cell cell = (Cell) cells.next();//cell.setCellType(Cell.CELL_TYPE_STRING);String val ="";if(cell != null){  switch (cell.getCellType()) {  case Cell.CELL_TYPE_STRING:  val = cell.getStringCellValue();  break;  case Cell.CELL_TYPE_BOOLEAN:  Boolean val1 = cell.getBooleanCellValue();  val = val1.toString();  break;  case Cell.CELL_TYPE_NUMERIC:
//                                Double val3 = cell.getNumericCellValue();
//                                val = val3.toString();  if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) {     Date theDate = cell.getDateCellValue();  SimpleDateFormat dff = new SimpleDateFormat(datePattren);  val = dff.format(theDate);}else{  DecimalFormat df = new DecimalFormat(numberPattern); val = df.format(cell.getNumericCellValue());}  break;  case Cell.CELL_TYPE_BLANK:  break;  default:  }  }  Integer key = cell.getColumnIndex();map.put(key, val);//System.out.println("内容为"+key+"  :"+val);}list.add(map);}} catch (Exception e) {throw new ExcelException("未知原因,解析失败");// ("保存Excel文件时,请不要将鼠标最终定位在Excel中的可以下拉选值的列上。");}}return list;}}

3、测试:


package com.demo.controller;import java.io.IOException;
import java.util.List;
import java.util.Map;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import com.demo.exception.ExcelException;
import com.demo.util.ExcelUtil;@Controller
public class Test {/** 使用postman测试时,必须是post请求,选择body,把默认的text改为file,选择文件,key即为controller接口的参数*/@ResponseBody@RequestMapping("/test")public void goalMonth(@RequestParam("file") MultipartFile[] files) {MultipartFile excelFile = null;if (files != null && files.length > 0) {excelFile = files[0];} // 解析的数据List<Map<Integer, String>> excelList = null;try {excelList = ExcelUtil.getExcelData(excelFile, "yyyy-MM", "0");} catch (ExcelException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}for(int i=0;i<excelList.size();i++){Map<Integer,String> excelMap = excelList.get(i);//第一列String provice = excelMap.get(0);//第二列String info = excelMap.get(1);//第三列String city = excelMap.get(2);//System.out.println("第"+(i+1)+"行:"+provice);System.out.println("//"+info);System.out.println("put(\""+provice+"\""+","+"\""+city+"\")");}}
}

postman测试,:

例如解析

中模板的数据:将金额的格式设为保留小数点后两位:List<Map<Integer, String>>   excelList = ExcelUtil.getExcelData(excelFile, "yyyy-MM-dd", "0.00");

,得到的结果集应该为:

{  {0:"哈尔滨",1:"",2:"601.00"},{0:"哈尔滨",1:"",2:"3010.00"},{0:"洛阳",1:"",2:"40000.00"},

{0:"邯郸",1:"丛台区",2:"22050.00"},{0:"洛阳",1:"",2:"6000.00"}}

(注意,此util只解析了第一个页脚:    Sheet data = wb.getSheetAt(0);// 第一个页脚。如果一个excel文件有多个页脚,可以使用wb的getNumberOfSheets获取页脚总数,然后循环页脚)。

二、常见问题:

1、poi原样读取百分比:poi读取百分比数据会读成小数,如果需要原样读取,需要单独转化下:

if (cell.getCellStyle().getDataFormatString().indexOf("%") != -1) {
System.out.println(cell.getNumericCellValue()*100+"%");
}

2、poi读取Excel表格中公式的计算值:读取Excel表格,需要保存格式为Number而读取到Excel中有公式时,会报错。

使用下面的处理方式可以解决该问题。

switch (cell.getCellType()) {case HSSFCell.CELL_TYPE_FORMULA: //公式类型// cell.getCellFormula();try {value = String.valueOf(cell.getNumericCellValue());    } catch (IllegalStateException e) {value = String.valueOf(cell.getRichStringCellValue());}break;}

三、小数精度问题:如纯数字的单元格,读取后 后面会加上 .0,1 --> 1.0;再如2.2 --> 2.1999999997,解决方法:

public class CommonUtil {private static NumberFormat numberFormat = NumberFormat.getNumberInstance();static {numberFormat.setGroupingUsed(false);}public static String getCellValue(Cell cell) {if (null == cell) {return "";}Object value;switch (cell.getCellTypeEnum()) {// 省略case NUMERIC:double d = cell.getNumericCellValue();  value = numberFormat.format(d);    // 关键在这里!//省略 }return value == null ? "" : value.toString();}
}

excel(二)解析excel相关推荐

  1. XX健康:预约管理-预约设置日历插件文件简单下载Excel文件解析Excel表数据批量导入

    1. 需求分析 前面我们已经完成了检查项管理.检查组管理.套餐管理等.接下来我们需要进行预约设置,其实就是设置每一天的体检预约最大数量.客户可以通过微信端在线预约,在线预约时需要选择体检的时间,如果客 ...

  2. java通用解析excel,java解析excel

    import java.io.File; import java.io.IOException; import jxl.Cell; import jxl.Sheet; import jxl.Workb ...

  3. java解析excel,poi和easyExcel

    做项目遇到上传excel并解析excel内容组装成结构话json,网上查了很多方法,做了poi和easyExcel两个方法的对比 两者都可以解析excel文件,但是两个也有不同: 一.poi 官方说明 ...

  4. Springboot使用Apache POI实现导入导出和解析Excel

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站 点击跳转浏览. 1准备pom文件 <?xml version="1.0" e ...

  5. Java读取和解析Excel数据:基于Apache POI(二)

    Java读取和解析Excel数据:基于Apache POI(二) 假设附录1文章中的test.xls是对员工的考勤记录表.需要根据这张excel表统计员工的加班时间,那么需要重点关注第五列的下班时候的 ...

  6. easyexcel生成excel_阿里JAVA解析Excel工具easyexcel

    java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有 ...

  7. JAVA批量上传下载Excel_如何实现批量上传----------Java解析excel

    一.引子 在web平台开发中仅经常会遇到一下需要批量的问题,通常得做法是使用excel上传,下面主要介绍一下在实际开发中到的实例. 二.准备工作 1.需要导入的jar包(主要用到poi包) (1)po ...

  8. 利用Spring-Boot解析Excel、用Java分析Excel、告别手动输入用程序读取Excel

    利用Spring-Boot解析Excel.用Java分析Excel.告别手动输入用程序读取Excel 一.资源 java读取Excel文件 二.修改 (一)中的代码中的 import service. ...

  9. python pandas读取excel-Python使用Pandas读写Excel实例解析

    这篇文章主要介绍了Python使用Pandas读写Excel实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Pandas是python的一个 ...

  10. java excel api xlsx_Java 解析Excel(xls、xlsx两种格式)

    Java 解析Excel(xls.xlsx两种格式) 一.环境 JDK 1.8 二.JAR 1.commons-collections4-4.1.jar 2.poi-3.9-20121203.jar ...

最新文章

  1. java最长类名_在java规范中类命名的字符长度是多少?
  2. 《慕客网:IOS基础入门之Foundation框架初体验》学习笔记 二 NSMutableString
  3. 从入门到精通的Java进阶学习笔记整理,不愧是大佬
  4. java todo error_java基础-异常
  5. python语言句块的标记_Python语言语句块的标记是()
  6. tf.nn.sparse_softmax_cross_entropy_with_logits()与tf.nn.softmax_cross_entropy_with_logits的差别
  7. hadoop练习处理地震数据
  8. 《Redis核心技术与实战》学习总结(2)
  9. react 组件怎么公用_用 react 做一个跟随组件的 tooltip
  10. MSDN URL 重写
  11. Linq To Sql进阶系列(三)CUD和Log
  12. 论文阅读 || 图像分类系列 —— DenseNet(很详细)
  13. spss分析qpcr数据_手把手教你使用 SPSS 分析实时荧光定量数据
  14. 不出门远程控制公司电脑,这7个工具让你不用来回跑。
  15. 管理者该如何思考团队建设
  16. 第2章 ISA防火墙策略配置
  17. 百度地图api将可视区域定位到当前所在位置
  18. 白话 RESTful,OpenApi(OAS),Swagger
  19. 背单词软件速度对比测试,手机背单词大比拼,谁才是速度之王
  20. php path separator,php DIRECTORY_SEPARATOR常量介绍

热门文章

  1. Excel之邮件合并工具
  2. 【宇麦科技】群晖NAS套件之Cloud Sync的安装与使用,跟数据丢失、误删、清零说拜拜
  3. 6.简单提取小红书app数据保存txt-2
  4. 自媒体视频素材哪里找?易撰帮你快速下载素材
  5. 计算机思维导论第二讲答案,大学计算机计算思维导论第2讲习题及解析.pdf
  6. 【经验分享】分享 MangoPapa 的论文学习经验
  7. ❤️❌ 如何用vue制作一个探探滑动组件
  8. (Oracle踩坑指南)项目建立连接的各种坑 ORA-12541: TNS: 无监听程序等等
  9. 2018校招迅雷测试岗笔试
  10. SVN合并冲突的办法