最近有同事问到在Java程序中poi读取excel怎么做,虽然以前写过,但是最近没用到就差不多忘了,俗话说好记性不如烂笔头,趁现在有空,特此记录一下。

项目使用的是springBoot,首先添加依赖,使用的是apache的poi:

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>

这里添加了两个依赖,查了下资料,对于excel来说poi是处理excel2003版本的,而poi-ooxml是处理excel2007+版本的,为了适配不同版本的excel,添加了两个jar包。

首先需要获取到excel文件流,这里一般是两种情况:

一:通过获取传入的文件路径去读取已存在的文件,service层代码:

    public List<Object> dealFromUri(String fileUri) {if ("".equals(fileUri)) {// 文件路径为空抛出异常throw new RuntimeException("文件路径为空!");}List<Object> list = dealExcel(fileUri);list.forEach(System.out::println);return list;}

dealExcel方法代码,这个方法就是处理excel文件的,其中还包含了一个readExcel方法,一个处理不同单元格格式的getCellFormatValue方法:

   public List<Object> dealExcel(String fileUri) {List<Object> list = new ArrayList<>();Workbook workbook = readExcel(fileUri);if (workbook != null) {// 读取第一个sheet(工作簿)Sheet sheet = workbook.getSheetAt(0);// 获取最大行数int physicalNumberOfRows = sheet.getPhysicalNumberOfRows();// 读取第一行Row row = sheet.getRow(0);// 获取最大列数int physicalNumberOfCells = row.getPhysicalNumberOfCells();String[] columns = new String[1024];for (int i = 0; i < physicalNumberOfCells; i++) {columns[i] = row.getCell(i).getStringCellValue();}for (int i = 1; i <= physicalNumberOfRows; i++) {Map<String, String> map = new LinkedHashMap<String, String>();row = sheet.getRow(i);if (row != null) {for (int j = 0; j < physicalNumberOfCells; j++) {String cellData = (String) getCellFormatValue(row.getCell(j));map.put(columns[j], cellData);}list.add(map);} else {break;}}}return list;}

readExcel判断excel的版本并返回workbook:

   public Workbook readExcel(String filePath) {Workbook wb = null;if (filePath == null || "".equals(filePath)) {return null;}String extString = filePath.substring(filePath.lastIndexOf("."));try (InputStream is = new FileInputStream(filePath)) {if (".xls".equals(extString)) {return wb = new HSSFWorkbook(is);} else if (".xlsx".equals(extString)) {return wb = new XSSFWorkbook(is);} else {return wb = null;}} catch (IOException e) {e.printStackTrace();}return wb;}

处理不同类型单元格值getCellFormatValue:

    public Object getCellFormatValue(Cell cell) {Object cellValue = null;if (cell != null) {//判断cell类型switch (cell.getCellType()) {//数字case NUMERIC:cellValue = String.valueOf(cell);break;//字符串case STRING:cellValue = String.valueOf(cell.getStringCellValue());break;//Booleancase BOOLEAN:cellValue = String.valueOf(cell.getBooleanCellValue());break;//公式case FORMULA:try {cellValue = String.valueOf(cell.getNumericCellValue());} catch (IllegalStateException e) {cellValue = String.valueOf(cell.getRichStringCellValue());}break;//空值case BLANK:cellValue = "null";break;//故障case ERROR:cellValue = "非法字符";break;default:cellValue = "未知类型";break;}}return cellValue;}

二:通过读取上传过来的文件流直接解析的,service代码:

   public List<Object> dealFromFile(MultipartFile file) {if (file.isEmpty()) {throw new RuntimeException("上传的文件为空!");}List<Object> list = dealExcelWithFile(file);list.forEach(System.out::println);return list;}

不同的地方就是获取流的方式不同,一个是读取文件获取流,一个是直接获取上传过来的流:

 private List<Object> dealExcelWithFile(MultipartFile file) {List<Object> list = new ArrayList<>();Workbook workbook = readExcelWithFile(file);if (workbook != null) {// 读取第一个sheet(工作簿)Sheet sheet = workbook.getSheetAt(0);// 获取最大行数int physicalNumberOfRows = sheet.getPhysicalNumberOfRows();// 读取第一行Row row = sheet.getRow(0);// 获取最大列数int physicalNumberOfCells = row.getPhysicalNumberOfCells();String[] columns = new String[1024];for (int i = 0; i < physicalNumberOfCells; i++) {columns[i] = row.getCell(i).getStringCellValue();}for (int i = 1; i <= physicalNumberOfRows; i++) {Map<String, String> map = new LinkedHashMap<String, String>();row = sheet.getRow(i);if (row != null) {for (int j = 0; j < physicalNumberOfCells; j++) {String cellData = (String) getCellFormatValue(row.getCell(j));map.put(columns[j], cellData);}list.add(map);} else {break;}}}return list;}/*** 读取excel返回不同版本的workbook* @param file 文件流* @return Workbook*/public Workbook readExcelWithFile(MultipartFile file) {Workbook wb = null;if (file.isEmpty()) {return null;}String extString = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));try (InputStream is = file.getInputStream()) {if (".xls".equals(extString)) {return wb = new HSSFWorkbook(is);} else if (".xlsx".equals(extString)) {return wb = new XSSFWorkbook(is);} else {return wb = null;}} catch (IOException e) {e.printStackTrace();}return wb;}

测试用的excel文件:

读取后返回的List:

数字格式根据不同需求做不同的处理。

码云地址:https://gitee.com/mods_sense/blogcode/tree/master/src/main/java/org/gugy/blogcode/poiDealExcel

两种情况的不同之处就是一个的参数是String类型的文件所在路径,一个是MultipartFile类型的流文件,根据项目需求的方式采用不同的方法就行啦。有错误的地方或者有更好的想法欢迎提出哟~~~

 

以上

记录使用poi读取excel文件相关推荐

  1. 使用POI 读取 Excel 文件,读取手机号码 变成 1.3471022771E10

    使用POI 读取 Excel 文件,读取手机号码 变成 1.3471022771E10 [问题点数:40分,结帖人xieyongqiu] 不显示删除回复             显示所有回复     ...

  2. java poi读取excel文件(xlsx)

    读取excel文件的方法有许多种,这篇文章主要描述通过poi读取excel文件. 先maven导入jar包 <dependency><groupId>org.apache.po ...

  3. 利用POI读取excel文件(java)

    利用POI读取excel文件(java) 摘要:利用java读取excel文件,读取文件并获取文件中每一个sheet中的值. 一.需要提前导入的包: import java.io.File;impor ...

  4. java利用poi读取excel_java利用POI读取excel文件的方法

    摘要:利用java读取excel文件,读取文件并获取文件中每一个sheet中的值. 一.需要提前导入的包: import java.io.File; import java.io.FileInputS ...

  5. 使用POI读取Excel文件

    使用POI读取Excel文件 一.前言 用户可以通过上传excel文件,后端通过读取excel文件的内容并将内容写入数据库中以便更好的使用. 本文档使用的excel的工具类既可以读取有合并单元格的文件 ...

  6. Java使用POI读取Excel文件

    上篇文章记录了简单的POI创建Excel文件,依赖导入可参考上篇 POI读取excel中公式 @Testpublic void testRead() throws Exception {//读取文件的 ...

  7. 使用POI读取excel文件内容

    1.前言 项目中要求读取excel文件内容,并将其转化为xml格式.常见读取excel文档一般使用POI和JExcelAPI这两个工具.这里我们介绍使用POI实现读取excel文档. 2.代码实例: ...

  8. java POI 读取Excel文件 将图片、表格生成到PPT

    临时有个需求,要求通过读取EXCEL文件,然后通过文件名称去给定的文件夹内查找图片,并将图片写入PPT中,详情以表格的形式写到图片右侧,每张图片一页PPT.效果如图所示: 用到的jar包如下(mave ...

  9. ava 使用POI读取EXCEL文件并且存入任意实体Bean中

    Java 使用POI读取EXCEL(.xlsx)文件并且存入任意实体Bean中 工具类代码 示例使用代码 注意事项!!! 1.代码中未对Excel数据类型进行判断,bean中属性均为String接收( ...

最新文章

  1. UVa11389 The Bus Driver Problem(贪心)
  2. oracle 表空间维护
  3. IDEA中多行注释及取消注释的快捷键分享
  4. 计划任务如何使用 java_java – 如何计划任务以定期间隔运行?
  5. Elementui动态换肤
  6. 链接生成动态二维码图片显示在页面上
  7. java 综合练习_Java 之综合练习
  8. markdown模板(个人使用)
  9. 卸载wps后安装office图标异常的问题
  10. 基于433MHz无线网络和PMS132B SOP14照明驱动方案开发
  11. ACM-ICPC 2018 北京赛区网络预赛 Tomb Raider(暴力)
  12. 小强统一认证中心-项目工程介绍
  13. 语句摘抄——第26周
  14. 秣小白的C语言旅程——第一站
  15. 运行lidar_align进行全局优化时出现程序中断问题
  16. 一种新型免费无损图片格式FLIF
  17. 图片压缩怎么在线处理?如何压缩图片大小kb?
  18. Python的reduce
  19. 这个专门提供多角恋约会的软件,终于被谷歌封杀了
  20. 新一代信息技术在智慧旅游中的应用

热门文章

  1. 笔记本Ubuntu18.04-盒盖休眠解决办法
  2. java 静态代码块的作用_Java中什么是静态代码块,有什么作用?
  3. 644HA温变的安装与调试
  4. Win7下VC6打开文件报错导致其崩溃的解决办法
  5. Flink - CEP 实时分用户析攻击行为
  6. Python二级--命运-2
  7. WebSocket集群解决方案
  8. ABB机器人教程 (2)RobotStudio学习
  9. WPS在ArchLinux常见问题
  10. 使用ThreeJS在浏览器中展示3D物件