poi解析excel(处理单元格公式)
基础处理类
package com.xwcloud.superins.common.util.excel.handler;import org.apache.commons.lang3.reflect.FieldUtils;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellValue;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.lang.reflect.Field;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;/*** @author yu* @Description Excel处理基类* @create 2019/1/8* @since 1.0.0*/
public class PoiHandler {private static Logger logger = LoggerFactory.getLogger(PoiHandler.class);/*** 将excel每一行的数据转换为java对象** @param obj* @param row* @return* @throws Exception*/Map<String, Object> dataObj(Object obj, Row row, FormulaEvaluator evaluator) throws Exception {Class<?> rowClazz = obj.getClass();Field[] fields = FieldUtils.getAllFields(rowClazz);if (fields == null || fields.length < 1) {return null;}// 容器Map<String, Object> map = new HashMap<>(50);// 注意excel表格字段顺序要和obj字段顺序对齐for (int j = 0; j < fields.length; j++) {map.put(fields[j].getName(), getVal(row.getCell(j), evaluator));}return map;}/*** 无公式处理val** @param cell* @return*/String getVal(Cell cell) {try {String result;switch (cell.getCellType()) {case Cell.CELL_TYPE_STRING:result = cell.getStringCellValue().trim();break;case Cell.CELL_TYPE_NUMERIC:double number = cell.getNumericCellValue();DecimalFormat df = new DecimalFormat("#.##");result = df.format(number);break;default:result = cell.getStringCellValue().trim();}return result;} catch (Exception e) {return "";}}/*** 含公式处理val** @param cell* @return*/String getVal(Cell cell, FormulaEvaluator evaluator) {try {String result;switch (cell.getCellType()) {case Cell.CELL_TYPE_STRING:result = cell.getStringCellValue().trim();break;case Cell.CELL_TYPE_NUMERIC:// 如果是数字类型的话,判断是不是日期类型/*if (HSSFDateUtil.isCellDateFormatted(cell)) {// 获取日期类型的单元格的值Date d = cell.getDateCellValue();// 进行格式转换SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");result = formatter.format(d);}else{double number = cell.getNumericCellValue();DecimalFormat df = new DecimalFormat("#.##");result = df.format(number);}*/double number = cell.getNumericCellValue();DecimalFormat df = new DecimalFormat("#.##");result = df.format(number);break;case Cell.CELL_TYPE_FORMULA:System.out.print("FORMULA:");result = getCellValue(evaluator.evaluate(cell));break;default:result = cell.getStringCellValue().trim();}return result;} catch (Exception e) {return "";}}private static String getCellValue(CellValue cell) {String cellValue = null;switch (cell.getCellType()) {case Cell.CELL_TYPE_STRING:cellValue = cell.getStringValue().trim();break;case Cell.CELL_TYPE_NUMERIC:double number = cell.getNumberValue();DecimalFormat df = new DecimalFormat("#.##");cellValue = df.format(number);break;case Cell.CELL_TYPE_FORMULA:logger.warn("FORMULA:");break;default:break;}return cellValue;}/*** 获取字段get方法名称** @param field* @return*/String getMethodName(Field field) {String first = field.getName().substring(0, 1);String other = field.getName().substring(1);return "get" + first.toUpperCase() + other;}/*** 获取excel** @return* @throws Exception*/public SXSSFWorkbook getWorkbook() throws Exception {SXSSFWorkbook wb = new SXSSFWorkbook();return wb;}
}
package com.xwcloud.superins.common.util.excel.handler;import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import com.xwcloud.superins.common.util.excel.enums.ExcelTypeEnum;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;/*** @author yu* @Description Excel处理工具类,包括excel通用导入和通用导出功能* @create 2018/8/20* @since 1.0.0*/
public class PoiImportHandler extends PoiHandler {/*** 导入服务** @param in excel文件输入流* @param obj 转换的对象,需要对应一个导入vo,字段顺序同excel表列顺序* @param excelType excel类型* @return* @throws Exception*/public List<Map<String, Object>> importExcel(InputStream in, Object obj, String excelType)throws Exception {Workbook wb;if (ExcelTypeEnum.XLSX.getType().equalsIgnoreCase(excelType)) {wb = WorkbookFactory.create(in);} else if (ExcelTypeEnum.XLS.getType().equals(excelType)) {wb = new XSSFWorkbook(in);} else {throw new Exception("无法解析excel");}// 获取表格Sheet sheet = wb.getSheetAt(0);FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();// 返回结果List<Map<String, Object>> result = new ArrayList<>();// 遍历行 从下标第一行开始(去除标题)for (int i = 1; i <= sheet.getLastRowNum(); i++) {Row row = sheet.getRow(i);if (row != null) {// 装载objresult.add(dataObj(obj, row, evaluator));}}return result;}}
main
package com.xwcloud.superins.common.util.excel.handler;import com.qccr.knife.result.CommonStateCode;
import com.qccr.knife.result.Results;
import org.apache.commons.collections4.CollectionUtils;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;/*** @author: yinwenqiang@qccr.com* @date: Created in 2019/10/28 19:00*/
public class Mian {public static void main(String[] args) throws Exception {String outFilePath = "/Users/yinwenqiang/Downloads/import.xlsx";PoiImportHandler handler = new PoiImportHandler();File file = new File(outFilePath);InputStream is = new FileInputStream(file);List<Map<String, Object>> list = handler.importExcel(is, new Object(), "xlsx");if (CollectionUtils.isEmpty(list)) {System.err.println("导入数据为空");}}}
poi解析excel(处理单元格公式)相关推荐
- ssh excel 导入 mysql_ssh poi解析excel并将数据存入数据库
做完了一个报表导入数据库 功能 遇到几个问题:一 .Poi解析excel 的两种格式 xls xlsx. 二.form表单上传使用ajax 三.excel 单元格中有公式存在普通的读取方式读到的是公式 ...
- POI解析Excel表格
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 这里实现poi解析Excel表格的例子,导入Exc ...
- poi导出excel写入公式_【java poi 写入Excel后读取公式值问题】poi导入excel
java poi 写入Excel后读取公式值问题 不用改公式,只需要用cell.getNumericCellValue()获取,读出来就是正确的值了,如果你读出来的还有问题,说明你其他的地方写的还有问 ...
- 为什么poi解析Excel慢?
我们项目用xlsx配置业务数据,每个项目中会有500~600张表,解析耗时1分多钟. 尝试改成csv后,解析耗时5~6秒. 这不禁让我陷入思考,都是文本数据,为什么poi解析Excel会这么慢? 带着 ...
- 【poi-3.8】poi解析excel插入数据库详解
文章目录 poi解析excel&插入数据库详解 说明 一.目的 二.准备工作 三.思路分析 四.流程图分析 五.核心代码 1:上传文件 2:获取输入流 3:初始化excel表 4:遍历行和列 ...
- springboot + poi 解析 excel
Apache POI 是用 Java 编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对 Microsoft Office 格式档案读和写的功能. 本文使用 s ...
- poi解析excel读取日期为数字的问题
Apache poi 版本:3.12 今天在用poi解析excel文件时,碰到一个蛋疼的问题. 在我的excel文件中有一列是日期类型,例如有以下这么一行数据(日期中月份前面的0会自动去掉): 在读取 ...
- Java面试poi中excel版本大小_java 中 poi解析Excel文件版本问题解决办法
java 中 poi解析Excel文件版本问题解决办法 发布时间:2020-10-02 03:46:15 来源:脚本之家 阅读:91 作者:程诺 poi解析Excel文件版本问题解决办法 poi解析E ...
- POI实现EXCEL单元格合并及边框样式
POI实现EXCEL单元格合并及边框样式 下面例子为创建产生一个excel,合并单元格,然后为合并后的单元格添加边框 package test;import java.io.FileOutputStr ...
- 【poi第九节】poi操作excel 单元格的换行
poi操作excel 单元格的换行 import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermo ...
最新文章
- FPGA之道(27)VHDL的操作符号
- hypercall的实现机制与硬件虚拟化
- error aborting mysql,mysql错误1067,mysql1067错误aborting
- 必须正确理解的---ng指令中的compile与link函数解析
- python #!/usr/bin/python作用
- 解决RabbitMQ消息丢失问题和保证消息可靠性
- 插值算法及matlab实现,MATLAB 插值算法实现
- 数据可视化【七】 更新模式
- C#实现Combobox自动匹配字符
- IntelliJ IDEA 详细图解最常用的配置
- 11. Swoole 与 ThinkPHP
- 那些想替代 C 的语言怎么样?Go、Rust、C++ 和 Zig 生产力对比
- 系统账号自动退出时长哪里设置
- 自媒体文章一文多发的几种方式
- print out Fibonacci reversely
- Python从入门到精通之面向对象
- java对一个课程树进行无限极递归获取其中的某一个值
- 电解电容极性识别总结
- Django入门教程(八)Form表单
- 数组传递的是referrence,而不是object
热门文章
- 构建者模式和抽象工厂模式的结合使用
- 升级mongodb时出现The data files need to be fully upgraded
- 计算机无法搜索到打印机驱动,教你一招解决电脑无法找到打印机驱动程序包要求的核心驱动的问题 - 驱动管家...
- [渝粤教育] 中国地质大学 大学语文 复习题
- Android内存和SD卡的数据存取
- 世界杯的狂欢也是黑灰产的狂欢?
- 刨根究底字符编码之—UTF-16编码方式
- adb shell网络命令nestat、ping、netcfg、ip操作实例解释
- 2D游戏知识点三、Unity生成Android手机apk程序
- SVN上传的时候没法显示文件名,只显示后缀名