POI读取Excle模板中的数据(增强版)
修改了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模板中的数据(增强版)相关推荐
- poiexcel 读取引用列_java用poi读取Excel表格中的数据
Java读写Excel的包是Apache POI(项目地址:http://poi.apache.org/),因此需要先获取POI的jar包,本实验使用的是POI 3.9稳定版. Apache POI ...
- 使用POI读取EXCEL模板并填充数据,上传至腾讯云储存桶
读取EXCEL模板,并填充数据生成文件 前言 一.POI导入 二.具体实现 1.制作我们的模板 2.读取模板来生成新的EXCEL 3.查看生成结果 三,传到腾讯云储存桶里 1.导入COS依赖 2.写个 ...
- org.apache.poi往word模板中填充数据(word2003)
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能.通过字面意思,我们大概知道这个API是可以用来做 j ...
- poi读取Excel文件中的数据
代码是不完整的,只为自己留个备份 ,属于传入文件型 <!-- 需要用到的 Jar --> <dependency> <grou ...
- python读取excel表格-python读取excel表格中的数据
使用python语言实现Excel 表格中的数据读取,需要用到xlrd.py模块,实现程序如下: import xlrd #导入xlrd模块 class ExcelData(): def __init ...
- poi读取excel模板,并填充数据
一.POI介绍 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 基本功能: HSSF - 提供读写 ...
- POI读取Excel模板并导出大量数据
POI读取Excel模板并导出大量数据 我在使用XSSFWorkbook读取Excel模板并导出大量数据(百万级)时,发现很长时间没有响应,debugger模式发现在读取第三四十万条数据时,程序直接停 ...
- 使用POI读取Excel表格中数据
使用POI读取Excel表格中数据 已经在 使用POI读取Excel表格中数据2优化.(https://blog.csdn.net/qq_36570464/article/details/107053 ...
- 利用poi读取word模板文件生成新的word文档
利用poi读取word模板文件生成新的word文档 利用poi读取word模板文件,并回填逻辑数据,生成并导出需要的word文档源码.解决模板读取异常问题,提供wordUtils工具类(各种功能实现) ...
最新文章
- LeetCode简单题之区域和检索 - 数组不可变
- 大白话系列之C#委托与事件讲解(一)
- pyhton3 适配器模式编写
- mysql 进阶到高级_mysql的高级进阶(一)
- [C++11]initializer_lisr模板类的使用
- Java代码服务器上下载图片_Java如何从服务器中下载图片
- “考不上本科是智商有问题”,这位吴先生火了!涉事公司回应...
- C++对输入流输出流运算符的重载【案例】
- python中threading模块中的Join类
- 一个神秘 URL 酿大祸,差点让我背锅!
- linux常用软件推荐
- 拓端tecdat|R语言回归中的Hosmer-Lemeshow拟合优度检验
- php模拟登录其他网站,PHP利用Curl模拟登录并获取数据例子
- axf下不了 keil5jlink_keil无法生成axf文件之解决方法
- 扬天t4900d u盘linux,联想扬天T4900d台式电脑u盘启动设置方法
- 「Linux」- 修改鼠标滚轮的滚动方向 @20210315
- 计算机语言中str是什么意思,vb中str什么意思
- java osm pbf_OSM数据的下载和转换使用
- 直接跳转到app store指定应用页面或评论页面
- h5跳转页面很慢_【干货】小技巧实现H5跨页帧数跳转
热门文章
- 人免疫球蛋白IgG冻干粉——Equitech-Bio分离技术纯化
- AGC自动增益c语言,自动增益控制(AGC)和灵敏度时间增益控制(STC)的区别
- 基于Android的校园跑腿系统
- 聚簇索引和非聚簇索引(通俗易懂 言简意赅)
- 汇编语言个人笔记(三)mov和add指令及确定物理地址的方法
- (附源码)springboot网络微小说 毕业设计031758
- 在线购物飞涨。 这就是它不会持续的原因
- Java选择与循环语句
- GPS卫星定位车载终端原理全面介绍
- 石墨烯能带matlab,锯齿石墨烯能带matlab计算程序