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的更多相关文章

  1. POI完美解析Excel数据到对象集合中(可用于将EXCEL数据导入到数据库)

    实现思路: 1.获取WorkBook对象,在这里使用WorkbookFactory.create(is); // 这种方式解析Excel.2003/2007/2010都没问题: 2.对行数据进行解析 ...

  2. oracle xmltype导入并解析Excel数据--前言

    通常,很多的时候,我们需要导入Excel数据到系统中,但是Excel数据需要我们去各种校验,比如身份证校验,手机号码校验等等. 校验失败的数据,提供Excel导出错误原因,提示给用户. 如此,如果校验 ...

  3. java POI 解析excel 2003和2007 直接转为List<Map> 返回

    1.POI 官网下载jar包,3.5以上 2.项目导入jar包 3.参数:String数组--对应的excel列名对应的KEY,File  excel文件,sheetNumber ---excel的s ...

  4. java--POI解析excel兼容性问题

    近日,使用POI解析excel,发现2003版本的excel解析与2007版本的excel解析存在问题.特此总结: 1.所需jar包 : 2.java类代码(读取excel文件): public vo ...

  5. java 使用 poi 解析excel

    背景: web应用经常需要上传文件,有时候需要解析出excel中的数据,如果excel的格式没有问题,那就可以直接解析数据入库. 工具选择: 目前jxl和poi可以解析excel,jxl很早就停止维护 ...

  6. 用jxl解析excel内容

    需要导入jxl.jar 下方表格为excel中内容: 序号 姓名 性别 生日 地址 1 测试1 男 1990-1-1 北京朝阳区 2 测试2 女 1998-2-2 北京海淀 3 测试3 男 1999- ...

  7. JXL解析Excel表格内容到数据库

    java中常用的解析Excel表格的工具一种是POI一种是JXL,POI功能强大,相比JXL稍嫌复杂,对表格样式的处理非常好:而JXL解析简单方便,对中文支持比较好. 工作中解析Excel内容上传到数 ...

  8. Java:JXL解析Excel文件

    项目中,有需求要使用JXL解析Excel文件. 解析Excel文件 我们先要将文件转化为数据流inputStream. 当inputStream很大的时候 会造成Java虚拟器内存不够 抛出内存溢出 ...

  9. c++ 读取并解析excel文件方法

    用Cocos开发模型特效工具编辑器,跨Mac和windows,当中有个需求是读取并解析excel文件,但网上的查找的例子几乎都只能是在windows下面使用,再或者是命令行脚本之类的.于是,自己写了一 ...

  10. Android解析Excel文档完整示例

    MainActivity如下: package cc.testexcel; import java.io.File; import jxl.Cell; import jxl.CellType; imp ...

随机推荐

  1. libevent文档学习(一)多线程接口和使用

    参考libevent官方提供的文档: http://www.wangafu.net/~nickm/libevent-book/Ref1_libsetup.html 这一篇主要翻译libevent多线程 ...

  2. select网络模型知识总结

    select模型支持IO多路复用,select函数如下 int select ( IN int nfds, //windows下无意义,linux有意义 IN OUT fd_set* readfds, ...

  3. 平衡树【Treap】

    平衡树的板题,用Treap实现. 具体参见注释,写的很详细了,包括了原理,实现以及注意事项 蒟蒻写个注释板子写了两天,太弱了QAQ 感谢niiick指导 Code #include<iostre ...

  4. JNI实现JAVA和C++互相调用

    SDK.h #ifndef SDK_H #define SDK_H #include "AsyncProxy.h" #include "Module.h" #i ...

  5. Redhat安装配置VNC服务器

    1. 检查安装VNC服务器 # rpm -qa|grep vnc 如果返回信息中有tigervnc-server,说明已安装了VNC:如果没有: # yum install tigervnc # yu ...

  6. Fire Net(深度优先搜索)

    ZOJ Problem Set - 1002 Fire Net Time Limit: 2 Seconds      Memory Limit: 65536 KB Suppose that we ha ...

  7. 超越icon font

    很久以前,我们如何使用图标? 1.切图 2.拼合(Sprites) 原始社会啊! 后来CSSGagagrunt-css-sprite 字体图标 相见不曾相识 Emoji绘文字 iconfont.cn直 ...

  8. 【BZOJ】2243 [SDOI2011]染色

    [算法]树链剖分+线段树 [题解] 树链剖分算法:http://www.cnblogs.com/onioncyc/p/6207462.html 定义线段树结构体有l,r,lc,rc,sum,data. ...

  9. HTTP/2.0 简单总结(转载)

    HTTP/2.0 简单总结(转载于https://linjunzhu.github.io/blog/2016/03/10/http2-zongjie/) 如何使用上 HTTP/2.0 需要浏览器的支持 ...

  10. c++树,知道前序和中序求后序遍历

    经常有面试题就是知道一棵树的前序遍历和中序遍历让你写出后序遍历,这个慢慢画是能画出来的,但是要很快的弄出来还是要懂原理. 首先说一下三种遍历:所谓的前序后序和中序都是遍历时遍历根节点的顺序.子树的话依 ...