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. bzoj1511 [POI2006]OKR-Periods of Words kmp+乱搞

    1511: [POI2006]OKR-Periods of Words Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 351  Solved: 220[S ...

  2. POJ 3171 DP

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3563   Accepted: 1205 D ...

  3. Linux常用网络工具:批量主机服务扫描之netcat

    netcat又叫做瑞士军刀,是黑客和系统管理员常用的网络工具,最初开发的目的是文件传输,后来发展出很多强大的功能,比如也可以完成批量主机服务扫描. 之前介绍了另一个更常用的批量主机服务扫描工具:nma ...

  4. rar 解压

    三.rar命令语法 将/etc 目录压缩为etc.rar 命令为: rar a etc.rar /etc 1 将etc.rar 解压 命令为: rar x etc.rar unrar -e etc.t ...

  5. 58到家mysql数据库军规及解读分享

    一.基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 (2)必须使用UTF8字符集 解读:万国码,无需转码,无乱码风险,节省 ...

  6. [DeeplearningAI笔记]序列模型3.1基本的 Seq2Seq /image to Seq

    5.3序列模型与注意力机制 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.1基础模型 [1] Sutskever I, Vinyals O, Le Q V. Sequence to Se ...

  7. ios 虚拟机中文件下载路径

    每个人mac上的路径会有不同,你可以打印出你文件下载存放的路径,然后拷贝一下,再单击桌面空白处,最上面的导航栏上有个“前往”,然后找到“前往文件夹”,粘贴一下,就可以找到了.

  8. 分块+lazy 或者 线段树+lazy Codeforces Round #254 (Div. 2) E

    E. DZY Loves Colors time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  9. BZOJ 2083 vector的巧用+二分

    2083: [Poi2010]Intelligence test Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 469  Solved: 227[Su ...

  10. HDU 5145 分块 莫队

    给定n个数,q个询问[l,r]区间,每次询问该区间的全排列多少种. 数值都是30000规模 首先考虑计算全排列,由于有同种元素存在,相当于每次在len=r-l+1长度的空格随意放入某种元素即$\bin ...