Java实现excel表格转成json的方法
时间:2019-04-07
本文章向大家介绍Java实现excel表格转成json的方法,主要包括Java实现excel表格转成json的方法使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
今天有个朋友问我,有没有excel表格到处json的方法,在网上找到了好几个工具,都不太理想,于是根据自己的需求,自己写了一个工具。
功能代码
package org.duang.test; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.json.JSONArray; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.FormulaEvaluator; 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.ss.usermodel.WorkbookFactory; /** * excel表格转成json * @ClassName: Excel2JSONHelper * @Description:TODO(这里用一句话描述这个类的作用) * @author LiYonghui * @date 2017年1月6日 下午4:42:43 */ public class Excel2JSONHelper { //常亮,用作第一种模板类型,如下图 private static final int HEADER_VALUE_TYPE_Z=1; //第二种模板类型,如下图 private static final int HEADER_VALUE_TYPE_S=2; public static void main(String[] args) { File dir = new File("e:\\2003.xls"); Excel2JSONHelper excelHelper = getExcel2JSONHelper(); //dir文件,0代表是第一行为保存到数据库或者实体类的表头,一般为英文的字符串,2代表是第二种模板, JSONArray jsonArray = excelHelper.readExcle(dir, 0, 2); System.out.println(jsonArray.toString());; } /** * * 获取一个实例 */ private static Excel2JSONHelper getExcel2JSONHelper(){ return new Excel2JSONHelper(); } /** * 文件过滤 * @Title: fileNameFileter * @Description: TODO(这里用一句话描述这个方法的作用) * @param: * @author LiYonghui * @date 2017年1月6日 下午4:45:42 * @return: void * @throws */ private boolean fileNameFileter(File file){ boolean endsWith = false; if(file != null){ String fileName = file.getName(); endsWith = fileName.endsWith(".xls") || fileName.endsWith(".xlsx"); } return endsWith; } /** * 获取表头行 * @Title: getHeaderRow * @Description: TODO(这里用一句话描述这个方法的作用) * @param: @param sheet * @param: @param index * @param: @return * @author LiYonghui * @date 2017年1月6日 下午5:05:24 * @return: Row * @throws */ private Row getHeaderRow(Sheet sheet, int index){ Row headerRow = null; if(sheet!=null){ headerRow = sheet.getRow(index); } return headerRow; } /** * 获取表格中单元格的value * @Title: getCellValue * @Description: TODO(这里用一句话描述这个方法的作用) * @param: @param row * @param: @param cellIndex * @param: @param formula * @param: @return * @author LiYonghui * @date 2017年1月6日 下午5:40:28 * @return: Object * @throws */ private Object getCellValue(Row row,int cellIndex,FormulaEvaluator formula){ Cell cell = row.getCell(cellIndex); if(cell != null){ switch (cell.getCellType()) { //String类型 case Cell.CELL_TYPE_STRING: return cell.getRichStringCellValue().getString(); //number类型 case Cell.CELL_TYPE_NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { return cell.getDateCellValue().getTime(); } else { return cell.getNumericCellValue(); } //boolean类型 case Cell.CELL_TYPE_BOOLEAN: return cell.getBooleanCellValue(); //公式 case Cell.CELL_TYPE_FORMULA: return formula.evaluate(cell).getNumberValue(); default: return null; } } return null; } /** * 获取表头value * @Title: getHeaderCellValue * @Description: TODO(这里用一句话描述这个方法的作用) * @param: @param headerRow * @param: @param cellIndex 英文表头所在的行,从0开始计算哦 * @param: @param type 表头的类型第一种 姓名(name)英文于实体类或者数据库中的变量一致 * @param: @return * @author LiYonghui * @date 2017年1月6日 下午6:12:21 * @return: String * @throws */ private String getHeaderCellValue(Row headerRow,int cellIndex,int type){ Cell cell = headerRow.getCell(cellIndex); String headerValue = null; if(cell != null){ //第一种模板类型 if(type == HEADER_VALUE_TYPE_Z){ headerValue = cell.getRichStringCellValue().getString(); int l_bracket = headerValue.indexOf("("); int r_bracket = headerValue.indexOf(")"); if(l_bracket == -1){ l_bracket = headerValue.indexOf("("); } if(r_bracket == -1){ r_bracket = headerValue.indexOf(")"); } headerValue = headerValue.substring(l_bracket+1, r_bracket); }else if(type == HEADER_VALUE_TYPE_S){ //第二种模板类型 headerValue = cell.getRichStringCellValue().getString(); } } return headerValue; } /** * 读取excel表格 * @Title: readExcle * @Description: TODO(这里用一句话描述这个方法的作用) * @param: @param file * @param: @param headerIndex * @param: @param headType 表头的类型第一种 姓名(name)英文于实体类或者数据库中的变量一致 * @author LiYonghui * @date 2017年1月6日 下午6:13:27 * @return: void * @throws */ public JSONArray readExcle(File file,int headerIndex,int headType){ List<Map<String, Object>> lists = new ArrayList<Map<String, Object>>(); if(!fileNameFileter(file)){ return null; }else{ try { //加载excel表格 WorkbookFactory wbFactory = new WorkbookFactory(); Workbook wb = wbFactory.create(file); //读取第一个sheet页 Sheet sheet = wb.getSheetAt(0); //读取表头行 Row headerRow = getHeaderRow(sheet, headerIndex); //读取数据 FormulaEvaluator formula = wb.getCreationHelper().createFormulaEvaluator(); for(int r = headerIndex+1; r<= sheet.getLastRowNum();r++){ Row dataRow = sheet.getRow(r); Map<String, Object> map = new HashMap<String, Object>(); for(int h = 0; h<dataRow.getLastCellNum();h++){ //表头为key String key = getHeaderCellValue(headerRow,h,headType); //数据为value Object value = getCellValue(dataRow, h, formula); if(!key.equals("") && !key.equals("null") && key != null ){ map.put(key, value); } } lists.add(map); } } catch (Exception e) { e.printStackTrace(); } } JSONArray jsonArray = JSONArray.fromObject(lists); return jsonArray; } }
excel表格模板类型和调用方式
第一种 :用括号把实体类变量名称或者数据库字段名称括起来
调用方法如下:
//表格的名称为2003.xls File file= new File("e:\\2003.xls"); Excel2JSONHelper excelHelper = getExcel2JSONHelper(); //字母表头为在第1行,第1种模板类型 JSONArray jsonArray = excelHelper.readExcle(file, 1, 1);
第二种: 实体类变量名称或者数据库字段另起一行,如下两张图都行
调用方法如下:
//表格的名称为2003.xls File file= new File("e:\\2003.xls"); Excel2JSONHelper excelHelper = getExcel2JSONHelper(); //字母表头为在第1行,第2种模板类型 JSONArray jsonArray = excelHelper.readExcle(file, 1, 2);
//表格的名称为2003.xls File file= new File("e:\\2003.xls"); Excel2JSONHelper excelHelper = getExcel2JSONHelper(); //字母表头为在第2行,第2种模板类型 JSONArray jsonArray = excelHelper.readExcle(file, 2, 2);
jsonArray打印的结果
复制代码 代码如下:
[{"index":"1","name":"李逵","jobNum":"10004","dept":"开发部","job":"android工程师"}, {"index":"2","name":"宋江","jobNum":"10001","dept":"总裁办","job":"总裁"}]
符合我的需求,如果需要复杂的,还需要进行整理,如果有什么意见,请提出来,我及时改进…谢谢
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- P3386 【模板】二分图匹配
- √n求单值欧拉函数
- 模板语言
- Django 相关
- 装饰器进阶
- P2894 [USACO08FEB]酒店Hotel
- 深入理解计算机系统读书笔记之第一章:漫游
- 【实战】工控网络协议模糊测试:用peach对modbus协议进行模糊测试
- 【Django错误】OSError: raw write() returned invalid length 14 (should have been between 0 and 7)
- P2234 [HNOI2002]营业额统计
- Python 中格式化字符串 % 和 format 两种方法之间的区别
- [实战]如何在Kali Linux中进行WIFI钓鱼?
- jQuery
- P3369 【模板】普通平衡树(Treap/SBT)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【干货满满】1.5w字初中级前端面试复习总结
- 娱乐圈排行榜动态条形图绘制
- vue3.0的 v-model 为啥不好用了?
- SHELL命令分组统计
- 一行代码实现display"过渡动画"原理
- 3D星空图
- shading-jdbc 4.1.1 + tk.mybatis + pagehelper 1.3.x +spring boot 2.x 使用注意事项
- 用辗转相除法求两个正整数的最大公约数
- Js根据数组相同的值生成二维数组
- 顺序消息管道《Message Pipe》v1.0.2版本发布
- Ts安装及自动编译ts文件
- python 自动化测试(1):获取验证码图片,实现自动登录
- RocketMQ学习第一步之源码构建
- python 库学习之:openpyxl
- python 学习之:读取xml配置文件