excel工具类
excel工具类
import com.iport.framework.util.ValidateUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.apache.poi.POIXMLDocument;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
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.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.IOException;
import java.io.InputStream;
import java.io.PushbackInputStream;
import java.lang.reflect.Field;
import java.sql.Time;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*; /**
* Created by admin on 2016/8/26.
*/
public class PoiUtil {
private static Logger logger = Logger.getLogger(PoiUtil.class); public static <T> List<T> getExcelData(String mapFilePath, Class<T> cla, InputStream inputStream) throws Exception{
List<T> dataList = new ArrayList<T>();
//获取配置数据
JaxbUtil jaxb = new JaxbUtil(TemplateExcelMap.class);
TemplateExcelMap template = jaxb.fromPath(mapFilePath, false);
List<ExcelMap> mapList = template.getColumnList();
Map<String,String> nameFieldMap = new HashMap<String,String>();
Map<Integer,Field> IndexFieldMap = new HashMap<Integer,Field>();
Map<Integer,ExcelMap> mapMap = new HashMap<Integer,ExcelMap>();
Map<String,ExcelMap> strMap = new HashMap<String,ExcelMap>();
for(ExcelMap m : mapList){
nameFieldMap.put(m.getColumnName().trim(), m.getFieldName());
strMap.put(m.getColumnName().trim(), m);
} Workbook book = getWorkbook(inputStream);
Sheet sheet = book.getSheetAt(0);
Row row0 = sheet.getRow(0);
int celNum = row0.getPhysicalNumberOfCells(); //头部数据获取映射
for(int i=0; i<celNum; i++){
Cell cell = row0.getCell(i);
String headDesc = cell.getStringCellValue();
if(!ValidateUtil.isEmpty(headDesc)){
if(nameFieldMap.containsKey(headDesc.trim())){
String fieldName = nameFieldMap.get(headDesc.trim());
IndexFieldMap.put(i, getField(fieldName, cla));
mapMap.put(i, strMap.get(headDesc.trim()));
}
}
}
long s = System.currentTimeMillis();
int rowNum = sheet.getPhysicalNumberOfRows();
Set<Integer> keys = IndexFieldMap.keySet();
if(keys.size() > 0){
for(int i=1;i<rowNum;i++){
Row row = sheet.getRow(i);
T vo = (T)cla.newInstance();
for(Integer columIndex : keys){
Cell cel = row.getCell(columIndex);
Field field = IndexFieldMap.get(columIndex);
ExcelMap mapping = mapMap.get(columIndex);
Object o = getCellValue(cel, field.getType(), mapping);
//try{
field.set(vo,o);
// }catch (Exception e){
// e.printStackTrace();
//} }
dataList.add(vo);
}
}
long e = System.currentTimeMillis();
logger.debug("数据导入解析耗时:"+(e-s));
return dataList;
} public static Workbook getWorkbook(InputStream inputStream) throws IOException, InvalidFormatException {
Workbook book = null;
if (!(inputStream.markSupported())) {
inputStream = new PushbackInputStream(inputStream, 8);
}
if (POIFSFileSystem.hasPOIFSHeader(inputStream)) {
book = new HSSFWorkbook(inputStream);
} else if (POIXMLDocument.hasOOXMLHeader(inputStream)) {
book = new XSSFWorkbook(OPCPackage.open(inputStream));
}
return book;
} private static Field getField(String filedName, Class cla) throws Exception{
Field field = cla.getDeclaredField(filedName);
if(field!=null){
field.setAccessible(true);
}
return field;
}; /**
* 获取单元格内容
* @param cell
* @param fieldClass
* @param mapping
* @return
* @throws Exception
*/
private static Object getCellValue(Cell cell, Class fieldClass, ExcelMap mapping) throws Exception{
if (cell == null) {
return null;
}
Object result = null;
if ("class java.util.Date".equals(fieldClass.toString()) || ("class java.sql.Time").equals(fieldClass.toString())) {
if (Cell.CELL_TYPE_NUMERIC == cell.getCellType()) {
result = cell.getDateCellValue();
} else {
cell.setCellType(Cell.CELL_TYPE_STRING);
result = getDateData(mapping, cell.getStringCellValue());
}
if ( result != null && ("class java.sql.Time").equals(fieldClass.toString())) {
result = new Time(((Date) result).getTime());
}
} else if (Cell.CELL_TYPE_NUMERIC == cell.getCellType()) {
double doubleVal = cell.getNumericCellValue();
if("class java.lang.Double".equals(fieldClass.toString())){
result = doubleVal;
}else{
long longVal = Math.round(cell.getNumericCellValue());
if(Double.parseDouble(longVal + ".0") == doubleVal){
try{
result = (int) longVal;
}catch (Exception e){
result = longVal;
}
}else {
result = doubleVal;
}
}
} else if (Cell.CELL_TYPE_BOOLEAN == cell.getCellType()) {
result = cell.getBooleanCellValue();
} else {
result = cell.getStringCellValue();
if(ValidateUtil.isEmpty((String)result)){
result = null;
}
}
return result;
} /**
* 获取日期类型数据
*
* @Author JueYue
* @date 2013年11月26日
* @param entity
* @param value
* @return
*/
private static Date getDateData(ExcelMap entity, String value) {
String formatStr = entity.getFormat();
if(!ValidateUtil.isEmpty(formatStr)){
String[] formats = formatStr.split(";");
for(int i = 0; i<formats.length; i++){
try{
Date d = formartData(formats[i], value);
if(d!=null){
return d;
}
}catch (Exception e){
logger.error(formats[i]+"日期转换"+value+"异常" + e.getMessage());
}
}
}
return null;
} private static Date formartData(String formatStr, String value){
if (StringUtils.isNotEmpty(formatStr) && StringUtils.isNotEmpty(value)) {
SimpleDateFormat format = new SimpleDateFormat(formatStr);
try {
return format.parse(value);
} catch (ParseException e) {
throw new RuntimeException("Excel 值获取失败");
}
}
return null;
} }
excel工具类的更多相关文章
- 导入导出Excel工具类ExcelUtil
前言 前段时间做的分布式集成平台项目中,许多模块都用到了导入导出Excel的功能,于是决定封装一个ExcelUtil类,专门用来处理Excel的导入和导出 本项目的持久化层用的是JPA(底层用hibe ...
- 自己封装的poi操作Excel工具类
自己封装的poi操作Excel工具类 在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完 ...
- javaEE开发之导出excel工具类
web开发中,一个系统的普通需求也包含导出excel,一般採用POI做统计报表导出excel. 导出excel工具类: import java.io.FileOutputStream; import ...
- Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类
Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类 ============================== ©Copyright 蕃薯耀 20 ...
- java 解析excel工具类
java 解析excel工具类 CreateTime--2018年3月5日16:48:08 Author:Marydon ReadExcelUtils.java import java.io.Fi ...
- Java解析Excel工具类(兼容xls和xlsx)
依赖jar <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml&l ...
- java里poi操作Excel工具类【我改】
参考原文: https://www.cnblogs.com/yizhang/p/7244917.html 我改: package test; import java.io.File; import j ...
- java操作excel 工具类
java操作excel 可参考https://blog.csdn.net/xunwei0303/article/details/53213130 直接上代码: 一.java生成excel文件: pac ...
- Python Excel工具类封装, 给excel表头搞点颜色
封装Excel工具类 我们常用的excel工具类,读有xlrd,写有xlwt.有读有写,新一代库有pandas,openpyxl等等. 大家用法都差不多,今天博主就介绍新手最爱,我也爱的xlrd和xl ...
随机推荐
- T-SQL 实现行转列
问题: 我正在寻找一种有效的方式将行转换为SQL服务器中的列 例如,通过下表如何构建出预期结果表. Id Value ColumnName 1 John FirstName 2 2 ...
- Django模板的继承
一.extend 1.extend继承模板 2.一个文件中只能继承一个模板 3.extend继承模板中的所有内容,模板的内容包括:html的head和body ,eg:
- Mac配置PHP
前言 在MacOS中已经内置了PHP和Apache,所以不需要再额外安装它们,只需要简单几步即可运行PHP. 配置Apache 查看Apache版本: $ sudo apachectl -v 终端关闭 ...
- 树莓派3B更新软件
因为软件是要不断更新的,所以半个月或者一个月要升级一下软件 升级软件非常简单 在终端或者SSH里输入 sudo apt-get update && apt-get upgrade -y ...
- linux定时任务crond export变量问题
linux定时任务crond export变量问题 1)我写了一个重启resin的脚本,由于业务原因,需要定时在某一个时间重启下resin服务器,于是就在 crontab里配置了如下内容: 50 17 ...
- 利用联合双边滤波或引导滤波进行升采样(Upsampling)技术提高一些耗时算法的速度。
这十年来,在图像处理领域提出了很多新的图像分析和处理方法,包括是自动的以及一些需要有人工参与的,典型的比如stereo depth computations.image colorization.to ...
- Which language is best, C, C++, Python or Java?什么编程语言最好
Either you fuck the life or the life fucks you. 转载自 quora 大致翻译一下,不喜勿喷,谢谢支持!以下是内容: I have used each o ...
- 2015最流行的Android组件、工具、框架大全
Android 是目前最流行的移动操作系统之一. 随着新版本的不断发布, Android的功能也日益强大, 涌现了很多流行的应用程序, 也催生了一大批的优秀的组件. 本文试图将目前流行的组件收集起来以 ...
- Hibernate 中出现表名(XXX) is not mapped 问题
今天晚上自己试着用Hibernate去搭建一个Web工程,然后去实现一个简单的登录.通过Hibernate?做查询操作的时候总是报出这样的错:users is?not?mapped. 于是乎去检查了下 ...
- Permutations II
Given a collection of numbers that might contain duplicates, return all possible unique permutations ...