解析Excel
package com.jpcar.utils; import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.jpcar.model.entity.ToolboxValue; public class ExcelUtil {
private static final char UNDERLINE = '_'; public static void main(String[] args) throws Exception {
Map<String, String> map = new HashMap<>();
map.put("toolboxId", "toolbox_id");
InputStream in = new FileInputStream(new File("F:\\test\\config\\toolbox_value.xlsx"));
List<ToolboxValue> list = parse(in, ToolboxValue.class, map);
System.out.println(list);
System.out.println("-------------------------");
System.out.println(toJsonByExcel(list, ToolboxValue.class, map));
} public static <T> List<T> parse(InputStream in, Class<T> cla) throws Exception {
return parse(in, cla, null);
} /**
*
* @param in
* @param cla
* @param mapper
* Map<FieldName, ExcelName>
* @return
* @throws IOException
*/
public static <T> List<T> parse(InputStream in, Class<T> cla, Map<String, String> mapper) throws Exception {
List<T> list = new ArrayList<>();
Field[] fs = cla.getDeclaredFields();
Map<String, Field> map = new HashMap<>();
for (Field f : fs) {
String fn = f.getName();
if (null != mapper) {
fn = mapper.get(fn);
if (null == fn)
fn = camelToUnderline(f.getName());
} else {
fn = camelToUnderline(fn);
}
map.put(fn, f);
} XSSFWorkbook xssfWorkbook = new XSSFWorkbook(in);
XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0); int rowstart = xssfSheet.getFirstRowNum();
int rowEnd = xssfSheet.getLastRowNum();
int cellSize = xssfSheet.getRow(0).getPhysicalNumberOfCells();
List<String> keys = new ArrayList<>();
for (int i = rowstart; i <= rowEnd; i++) {
if (i == 0) {
XSSFRow row = xssfSheet.getRow(0);
for (int j = 0; j < cellSize; j++) {
String key = row.getCell(j).getStringCellValue();
keys.add(key);
}
continue;
}
T t = cla.newInstance();
XSSFRow row = xssfSheet.getRow(i);
for (int j = 0; j < cellSize; j++) {
String str = keys.get(j);
Field f = map.get(str);
if (null == f)
continue;
f.setAccessible(true);
String type = f.getType().getName();
XSSFCell cell = row.getCell(j);
if (type.equals("int") || "java.lang.Integer".equals(type)) {
int val = (int) cell.getNumericCellValue();
f.set(t, val);
} else if ("double".equals(type) || "java.lang.Double".equals(type)) {
double val = cell.getNumericCellValue();
f.set(t, val);
} else if ("java.lang.String".equals(type)) {
String val = "";
if (cell.getCellType() != Cell.CELL_TYPE_STRING) {
val = (int) cell.getNumericCellValue() + "";
} else {
val = cell.getStringCellValue();
}
f.set(t, val);
} else if ("boolean".equals(type) || "java.lang.Boolean".equals(type)) {
boolean val = cell.getBooleanCellValue();
f.set(t, val);
} else if ("java.util.Date".equals(type)) {
Date val = cell.getDateCellValue();
f.set(t, val);
}
}
list.add(t);
} return list;
} public static <T> String toJsonByExcel(List<T> list, Class<T> cla) throws Exception {
return toJsonByExcel(list, cla, null);
} public static <T> String toJsonByExcel(List<T> list, Class<T> cla, Map<String, String> mapper) throws Exception {
if (null == list || list.size() == 0)
return null;
Field[] fs = cla.getDeclaredFields();
List<Map<String, Object>> l = new ArrayList<>();
for (T t : list) {
Map<String, Object> map = new HashMap<>();
for (Field f : fs) {
f.setAccessible(true);
Object obj = f.get(t);
if (null == obj) {
String type = f.getType().getName();
if (type.equals("int") || "java.lang.Integer".equals(type)) {
obj = 0;
} else if ("double".equals(type) || "java.lang.Double".equals(type)) {
obj = 0.0;
} else if ("boolean".equals(type) || "java.lang.Boolean".equals(type)) {
obj = false;
} else {
obj = "";
}
}
String key = f.getName();
if (key.equals("serialVersionUID"))
continue;
if (null != mapper) {
key = mapper.get(key);
if (null == key)
key = camelToUnderline(f.getName());
} else {
key = camelToUnderline(key);
}
map.put(key, obj);
}
l.add(map);
}
return JSON.toJSONString(l, SerializerFeature.WriteNullNumberAsZero,
SerializerFeature.WriteNonStringValueAsString);
} public static String underlineToCamel(String str) {
if (str == null || "".equals(str.trim())) {
return "";
}
int len = str.length();
StringBuilder sb = new StringBuilder(len);
for (int i = 0; i < len; i++) {
char c = str.charAt(i);
if (c == UNDERLINE) {
if (++i < len) {
sb.append(Character.toUpperCase(str.charAt(i)));
}
} else {
sb.append(c);
}
}
return sb.toString();
} public static String camelToUnderline(String param) {
if (param == null || "".equals(param.trim())) {
return "";
}
int len = param.length();
StringBuilder sb = new StringBuilder(len);
for (int i = 0; i < len; i++) {
char c = param.charAt(i);
if (Character.isUpperCase(c)) {
sb.append(UNDERLINE);
sb.append(Character.toLowerCase(c));
} else {
sb.append(c);
}
}
return sb.toString();
}
}
解析Excel的更多相关文章
- POI完美解析Excel数据到对象集合中(可用于将EXCEL数据导入到数据库)
实现思路: 1.获取WorkBook对象,在这里使用WorkbookFactory.create(is); // 这种方式解析Excel.2003/2007/2010都没问题: 2.对行数据进行解析 ...
- oracle xmltype导入并解析Excel数据--前言
通常,很多的时候,我们需要导入Excel数据到系统中,但是Excel数据需要我们去各种校验,比如身份证校验,手机号码校验等等. 校验失败的数据,提供Excel导出错误原因,提示给用户. 如此,如果校验 ...
- java POI 解析excel 2003和2007 直接转为List<Map> 返回
1.POI 官网下载jar包,3.5以上 2.项目导入jar包 3.参数:String数组--对应的excel列名对应的KEY,File excel文件,sheetNumber ---excel的s ...
- java--POI解析excel兼容性问题
近日,使用POI解析excel,发现2003版本的excel解析与2007版本的excel解析存在问题.特此总结: 1.所需jar包 : 2.java类代码(读取excel文件): public vo ...
- java 使用 poi 解析excel
背景: web应用经常需要上传文件,有时候需要解析出excel中的数据,如果excel的格式没有问题,那就可以直接解析数据入库. 工具选择: 目前jxl和poi可以解析excel,jxl很早就停止维护 ...
- 用jxl解析excel内容
需要导入jxl.jar 下方表格为excel中内容: 序号 姓名 性别 生日 地址 1 测试1 男 1990-1-1 北京朝阳区 2 测试2 女 1998-2-2 北京海淀 3 测试3 男 1999- ...
- JXL解析Excel表格内容到数据库
java中常用的解析Excel表格的工具一种是POI一种是JXL,POI功能强大,相比JXL稍嫌复杂,对表格样式的处理非常好:而JXL解析简单方便,对中文支持比较好. 工作中解析Excel内容上传到数 ...
- Java:JXL解析Excel文件
项目中,有需求要使用JXL解析Excel文件. 解析Excel文件 我们先要将文件转化为数据流inputStream. 当inputStream很大的时候 会造成Java虚拟器内存不够 抛出内存溢出 ...
- c++ 读取并解析excel文件方法
用Cocos开发模型特效工具编辑器,跨Mac和windows,当中有个需求是读取并解析excel文件,但网上的查找的例子几乎都只能是在windows下面使用,再或者是命令行脚本之类的.于是,自己写了一 ...
- Android解析Excel文档完整示例
MainActivity如下: package cc.testexcel; import java.io.File; import jxl.Cell; import jxl.CellType; imp ...
随机推荐
- Kubernetes的Endpoints
在之前的博文中,我们演示过如何通过ceph来实现kubernetes的持久存储,以使得像mysql这种有状态服务可以在kubernetes中运行并保存数据.这看起来很美妙,然而在实际的生产环境使用中, ...
- P4753 River Jumping
P4753 River Jumping 题目描述 有一条宽度为 NN 的河上,小D位于坐标为 00 的河岸上,他想到达坐标为 NN 的河岸上后再回到坐标为 00 的位置.在到达坐标为 NN 的河岸之前 ...
- 海思HI35XX之----视频处理单元各通道间的关系
最近在折腾HI3518C的芯片,应用到IPCamera上,最终获取多路不同分辨率的视频流供不同需求的预览切换.此处简单记录一下视频前处理元VPSS(Video Process Sub-System)的 ...
- Ibatis的resultMap和查询数据的对应关系
iBatis和MyBatis 中返回数据对应关系 直接进入主题,现在的项目改用MyBatis了,感觉跟iBatis还是不一样的,比如在判断空值上面,iBatis是有标签的<isNotEmpty& ...
- NOIP模拟5
期望得分:100+100+100=300 实际得分:72+12+0=84 T1 [CQOI2009]中位数图 令c[i]表示前i个数中,比d大的数与比d小的数的差,那么如果c[l]=c[r],则[l ...
- HDU 2920 分块底数优化 暴力
其实和昨天写的那道水题是一样的,注意爆LL $1<=n,k<=1e9$,$\sum\limits_{i=1}^{n}(k \mod i) = nk - \sum\limits_{i=1}^ ...
- 2015/11/2用Python写游戏,pygame入门(2):游戏中的事件和显示
pygame是一个比较大的库,以我这点弱小的实力是没办法详解的.所以我只讲我懂得那些部分,其他部分由大家慢慢查找了解. ------------------------------- 我用pygame ...
- 爬取知乎话题async使用协程
import requests import json import time from pyquery import PyQuery import pandas as pd from collect ...
- JAVA多线程基础学习三:volatile关键字
Java的volatile关键字在JDK源码中经常出现,但是对它的认识只是停留在共享变量上,今天来谈谈volatile关键字. volatile,从字面上说是易变的.不稳定的,事实上,也确实如此,这个 ...
- 在asp.net 中生成PDF的方法
近期要用asp.net 2.0生成PDF,看了下书,查了下资料,发现可以有组件帮得上忙,可以下载itextsharp(https://sourceforge.net/projects/itextsha ...