Java实现excel表格转成json的方法
程序员文章站
2024-02-27 18:03:33
今天有个朋友问我,有没有excel表格到处json的方法,在网上找到了好几个工具,都不太理想,于是根据自己的需求,自己写了一个工具。
功能代码
package...
今天有个朋友问我,有没有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":"总裁"}]
符合我的需求,如果需要复杂的,还需要进行整理,如果有什么意见,请提出来,我及时改进…谢谢
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。