修改了Excle兼容性问题,增加了 2007+版的支持
单元格中含有公式,读取公式计算后的值

package com.im.common.utils;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
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.XSSFFormulaEvaluator;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;
/*** excel读写工具类*/
public class POIUtil {private static Logger logger  = Logger.getLogger(POIUtil.class);private final static String xls = "xls";private final static String xlsx = "xlsx";/*** 读入excel文件,解析后返回* @param file* @throws IOException */public static List<String[]> readExcel(MultipartFile file) throws IOException{//检查文件//获得Workbook工作薄对象Workbook workbook = getWorkBook(file);FormulaEvaluator formulaEvaluator  = getFormulaEvaluator(file,workbook);//创建返回对象,把每行中的值作为一个数组,所有行作为一个集合返回List<String[]> list = new ArrayList<String[]>();if(workbook != null){for(int sheetNum = 0;sheetNum < 1;sheetNum++){//获得当前sheet工作表Sheet sheet = workbook.getSheetAt(sheetNum);if(sheet == null){continue;}//获得当前sheet的开始行int firstRowNum  = sheet.getFirstRowNum();//获得当前sheet的结束行int lastRowNum = sheet.getLastRowNum();//循环除了第二行的所有行for(int rowNum = firstRowNum+2;rowNum <= lastRowNum;rowNum++){//获得当前行Row row = sheet.getRow(rowNum);if(row == null){continue;}//获得当前行的开始列int firstCellNum = row.getFirstCellNum();//获得当前行的列数int lastCellNum = row.getLastCellNum();String[] cells = new String[row.getLastCellNum()];//循环当前行for(int cellNum = firstCellNum; cellNum < lastCellNum;cellNum++){Cell cell = row.getCell(cellNum);cells[cellNum] = getCellValue(cell,formulaEvaluator);}list.add(cells);}}workbook.close();}return list;}public static void checkFile(MultipartFile file) throws IOException{//判断文件是否存在if(null == file){logger.error("文件不存在!");throw new FileNotFoundException("文件不存在!");}//获得文件名String fileName = file.getOriginalFilename();//判断文件是否是excel文件if(!fileName.endsWith(xls) && !fileName.endsWith(xlsx)){logger.error(fileName + "不是excel文件");throw new IOException(fileName + "不是excel文件");}}private static FormulaEvaluator getFormulaEvaluator(MultipartFile file, Workbook workbook) {//获得文件名String fileName = file.getOriginalFilename();//创建Workbook工作薄对象,表示整个excelFormulaEvaluator f = null;//根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象if(fileName.endsWith(xls)){//2003f = new HSSFFormulaEvaluator((HSSFWorkbook) workbook);}else if(fileName.endsWith(xlsx)){//2007f = new XSSFFormulaEvaluator((XSSFWorkbook) workbook);}return f;}public static Workbook getWorkBook(MultipartFile file) {//获得文件名String fileName = file.getOriginalFilename();//创建Workbook工作薄对象,表示整个excelWorkbook workbook = null;try {//获取excel文件的io流InputStream is = file.getInputStream();//根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象if(fileName.endsWith(xls)){//2003workbook = new HSSFWorkbook(is);}else if(fileName.endsWith(xlsx)){//2007workbook = new XSSFWorkbook(is);}} catch (IOException e) {logger.info(e.getMessage());}return workbook;}public static String getCellValue(Cell cell, FormulaEvaluator formulaEvaluator){DecimalFormat df = new DecimalFormat("#.00");String cellValue = "";if(cell == null){return cellValue;}//把数字当成String来读,避免出现1读成1.0的情况if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){cell.setCellType(Cell.CELL_TYPE_STRING);}//判断数据的类型switch (cell.getCellType()){case Cell.CELL_TYPE_NUMERIC: //数字cellValue = String.valueOf(cell.getNumericCellValue());break;case Cell.CELL_TYPE_STRING: //字符串cellValue = String.valueOf(cell.getStringCellValue());break;case Cell.CELL_TYPE_BOOLEAN: //BooleancellValue = String.valueOf(cell.getBooleanCellValue());break;case Cell.CELL_TYPE_FORMULA: //公式cellValue = df.format(formulaEvaluator.evaluate(cell).getNumberValue());break;case Cell.CELL_TYPE_BLANK: //空值 cellValue = "";break;case Cell.CELL_TYPE_ERROR: //故障cellValue = "非法字符";break;default:cellValue = "未知类型";break;}return cellValue;}/*** 读入excel文件,解析后返回* @param file* @throws IOException*/public static List<String[]> readExcel(File file) throws IOException{//检查文件//获得Workbook工作薄对象Workbook workbook = getWorkBook(file);FormulaEvaluator formulaEvaluator  = getFormulaEvaluator(file,workbook);//创建返回对象,把每行中的值作为一个数组,所有行作为一个集合返回List<String[]> list = new ArrayList<String[]>();if(workbook != null){for(int sheetNum = 0;sheetNum < workbook.getNumberOfSheets();sheetNum++){//获得当前sheet工作表Sheet sheet = workbook.getSheetAt(sheetNum);if(sheet == null){continue;}//获得当前sheet的开始行int firstRowNum  = sheet.getFirstRowNum();//获得当前sheet的结束行int lastRowNum = sheet.getLastRowNum();//循环除了第一行的所有行for(int rowNum = firstRowNum+1;rowNum <= lastRowNum;rowNum++){//获得当前行Row row = sheet.getRow(rowNum);if(row == null){continue;}//获得当前行的开始列int firstCellNum = row.getFirstCellNum();//获得当前行的列数int lastCellNum = row.getPhysicalNumberOfCells();String[] cells = new String[row.getPhysicalNumberOfCells()];//循环当前行for(int cellNum = firstCellNum; cellNum < lastCellNum;cellNum++){Cell cell = row.getCell(cellNum);cells[cellNum] = getCellValue(cell,formulaEvaluator);}list.add(cells);}}// workbook.close();}return list;}public static void checkFile(File file) throws IOException{//判断文件是否存在if(null == file){logger.error("文件不存在!");throw new FileNotFoundException("文件不存在!");}//获得文件名String fileName = file.getName();//判断文件是否是excel文件if(!fileName.endsWith(xls) && !fileName.endsWith(xlsx)){logger.error(fileName + "不是excel文件");throw new IOException(fileName + "不是excel文件");}}private static FormulaEvaluator getFormulaEvaluator(File file, Workbook workbook) {//获得文件名String fileName = file.getName();//创建Workbook工作薄对象,表示整个excelFormulaEvaluator f = null;//根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象if(fileName.endsWith(xls)){//2003f = new HSSFFormulaEvaluator((HSSFWorkbook) workbook);}else if(fileName.endsWith(xlsx)){//2007 及2007以上f = new XSSFFormulaEvaluator((XSSFWorkbook) workbook);}return f;}public static Workbook getWorkBook(File file) {//获得文件名String fileName = file.getName();//创建Workbook工作薄对象,表示整个excelWorkbook workbook = null;try {//获取excel文件的io流InputStream is = new FileInputStream(file);//根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象if(fileName.endsWith(xls)){//2003workbook = new HSSFWorkbook(is);}else if(fileName.endsWith(xlsx)){//2007 及2007以上workbook = new XSSFWorkbook(is);}} catch (IOException e) {logger.info(e.getMessage());}return workbook;}
}

POI读取Excle模板中的数据(增强版)相关推荐

  1. poiexcel 读取引用列_java用poi读取Excel表格中的数据

    Java读写Excel的包是Apache POI(项目地址:http://poi.apache.org/),因此需要先获取POI的jar包,本实验使用的是POI 3.9稳定版. Apache POI ...

  2. 使用POI读取EXCEL模板并填充数据,上传至腾讯云储存桶

    读取EXCEL模板,并填充数据生成文件 前言 一.POI导入 二.具体实现 1.制作我们的模板 2.读取模板来生成新的EXCEL 3.查看生成结果 三,传到腾讯云储存桶里 1.导入COS依赖 2.写个 ...

  3. org.apache.poi往word模板中填充数据(word2003)

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能.通过字面意思,我们大概知道这个API是可以用来做 j ...

  4. poi读取Excel文件中的数据

    代码是不完整的,只为自己留个备份 ,属于传入文件型 <!-- 需要用到的 Jar   -->         <dependency>             <grou ...

  5. python读取excel表格-python读取excel表格中的数据

    使用python语言实现Excel 表格中的数据读取,需要用到xlrd.py模块,实现程序如下: import xlrd #导入xlrd模块 class ExcelData(): def __init ...

  6. poi读取excel模板,并填充数据

    一.POI介绍 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 基本功能: HSSF - 提供读写 ...

  7. POI读取Excel模板并导出大量数据

    POI读取Excel模板并导出大量数据 我在使用XSSFWorkbook读取Excel模板并导出大量数据(百万级)时,发现很长时间没有响应,debugger模式发现在读取第三四十万条数据时,程序直接停 ...

  8. 使用POI读取Excel表格中数据

    使用POI读取Excel表格中数据 已经在 使用POI读取Excel表格中数据2优化.(https://blog.csdn.net/qq_36570464/article/details/107053 ...

  9. 利用poi读取word模板文件生成新的word文档

    利用poi读取word模板文件生成新的word文档 利用poi读取word模板文件,并回填逻辑数据,生成并导出需要的word文档源码.解决模板读取异常问题,提供wordUtils工具类(各种功能实现) ...

最新文章

  1. LeetCode简单题之区域和检索 - 数组不可变
  2. 大白话系列之C#委托与事件讲解(一)
  3. pyhton3 适配器模式编写
  4. mysql 进阶到高级_mysql的高级进阶(一)
  5. [C++11]initializer_lisr模板类的使用
  6. Java代码服务器上下载图片_Java如何从服务器中下载图片
  7. “考不上本科是智商有问题”,这位吴先生火了!涉事公司回应...
  8. C++对输入流输出流运算符的重载【案例】
  9. python中threading模块中的Join类
  10. 一个神秘 URL 酿大祸,差点让我背锅!
  11. linux常用软件推荐
  12. 拓端tecdat|R语言回归中的Hosmer-Lemeshow拟合优度检验
  13. php模拟登录其他网站,PHP利用Curl模拟登录并获取数据例子
  14. axf下不了 keil5jlink_keil无法生成axf文件之解决方法
  15. 扬天t4900d u盘linux,联想扬天T4900d台式电脑u盘启动设置方法
  16. 「Linux」- 修改鼠标滚轮的滚动方向 @20210315
  17. 计算机语言中str是什么意思,vb中str什么意思
  18. java osm pbf_OSM数据的下载和转换使用
  19. 直接跳转到app store指定应用页面或评论页面
  20. h5跳转页面很慢_【干货】小技巧实现H5跨页帧数跳转

热门文章

  1. 人免疫球蛋白IgG冻干粉——Equitech-Bio分离技术纯化
  2. AGC自动增益c语言,自动增益控制(AGC)和灵敏度时间增益控制(STC)的区别
  3. 基于Android的校园跑腿系统
  4. 聚簇索引和非聚簇索引(通俗易懂 言简意赅)
  5. 汇编语言个人笔记(三)mov和add指令及确定物理地址的方法
  6. (附源码)springboot网络微小说 毕业设计031758
  7. 在线购物飞涨。 这就是它不会持续的原因
  8. Java选择与循环语句
  9. GPS卫星定位车载终端原理全面介绍
  10. 石墨烯能带matlab,锯齿石墨烯能带matlab计算程序