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. ftp server安装与配置

    http://note.youdao.com/noteshare?id=905513cfcdba7d6a8d2fbdd0874a6259

  2. VisualSVN 5.1.4破解

    1. 备份visualSVNbin目录 2. 打开VS命令提示工具,反编译VisualSVN.Core.L.dll 运行命令 ildasam "VisualSVN安装目录\bin\Visua ...

  3. cc1: warnings being treated as errors解决办法

    安装GDB时出现cc1: warnings being treated as errors Edit the Makefile and delete this line:WERROR_CFLAGS = ...

  4. Parencodings(模拟)

    ZOJ Problem Set - 1016 Parencodings Time Limit: 2 Seconds      Memory Limit: 65536 KB Let S = s1 s2 ...

  5. 最常用的8款 PHP 调试工具,你用过吗?

    Web 开发并不是一项轻松的任务,有超级多服务端脚本语言提供给开发者,但是当前 PHP 因为具有额外的一些强大的功能而越来越流行.PHP 是最强大的服务端脚本语言之一,同时也是 Web 开发者和设计者 ...

  6. JQuery和Servlet来实现跨域请求

    在网上看到很多的JQuery跨域请求的文章,比较有意思.这里我发表一个Servlet与JQuery配置实现跨域的代码,供大家参考.不足之处请指教 原理:JavaScript的Ajax不可以跨域,但是可 ...

  7. javaScript 中的一些日常用法总结

    从今天开始把开发中常用到的js语法 一一记录下来 方便以后复习回顾用: 1:对字符串进行替换 replace 以及 replaceAll replace : var begin_date =begin ...

  8. CodeForces - 999C

    You are given a string ss consisting of nn lowercase Latin letters. Polycarp wants to remove exactly ...

  9. 2017ACM暑期多校联合训练 - Team 2 1009 HDU 60563 TrickGCD (容斥公式)

    题目链接 Problem Description You are given an array A , and Zhu wants to know there are how many differe ...

  10. 简谈CSS 中的 em,rem,px,%

    在实际工作中,可能我们用的比较多的是‘%’ 和 px,但是我们也经常看到很多网站和css框架里用的是em 或rem.而‘%’ 和px已经都是比较常见或者说是常用.但是em 和rem 却鲜有使用,一直以 ...