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 ...
随机推荐
- shell编程常用的截取字符串操作
1. 常用的字符串操作 1.1. 替换字符串:$ echo ${var/ /_}#支持正怎表达式 / /表示搜索到第一个替换,// /表示搜索到的结果全部替换. ...
- 局域网象棋游戏(C++实现,使用Socket,界面使用Win32,CodeBlocks+GCC编译)
目录 成果 运行效果图 过程 1. 首先的问题是下棋的两端应该是什么样的? 2. 接下来的问题是怎么表示,怎么存储? 3. 然后应该怎么通信呢? 代码 main.cpp chinese_chess.h ...
- python学习2
1.input()返回的是字符串, 如果想读入一个数字,应该用int()转化 2.循环的写法与C不同的地方就是,for while等写完之后在那一行后面要加上一个冒号,这是比较特殊的地方. 还有就是r ...
- android文件的写入与读取---简单的文本读写context.openFileInput() context.openFileOutput()
最终效果图,点击save会保存到文件中,点击show会从文件中读取出内容并显示. main.xml <?xml version="1.0" encoding=" ...
- 使用串口线真机调试Linux内核
一.环境 ubuntu 14.04 一台有串口的PC(编号PC1,被调试机器) 另一台PC通过USB转串口线连接PC1(编号PC2,发起调试命令的机器) 二.串口线配置及测试 安装cutecom US ...
- java 旧url 处理的解决方法
@RequestMapping(value = {"/search"}) public void errorPath(HttpServletResponse response, @ ...
- canvas arcTo()用法详解
CanvasRenderingContext2D对象的方法arcTo()的用法. arcTo(x1, y1, x2, y2, radius) arcTo()方法将利用当前端点.端点1(x1,y1)和端 ...
- Mysql完全手册(笔记二,使用数据与性能优化)
一.使用数据 1.使用变量 MySQL也可以让我们以用户自定义的变量来存储select查询的结果,以便在将来select查询中使用.它们只会在客户会话期间存在,但是它们提供一个方便有效的方法来连接查询 ...
- python学习之路 第三天
1.set集合:去掉重复字段 set.difference()找出不同并创建一个新的集合,不改变原来集合: set.difference_update() 改变原来集合,剔除掉括号内容: set.di ...
- EventBus使用
转自 http://blog.csdn.net/harvic880925/article/details/40660137