当前位置: 移动技术网 > IT编程>开发语言>Java > Java实现excel表格转成json的方法

Java实现excel表格转成json的方法

2019年07月19日  | 移动技术网IT编程  | 我要评论

骚丝,吴翼男,羽天爱

今天有个朋友问我,有没有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":"总裁"}]

符合我的需求,如果需要复杂的,还需要进行整理,如果有什么意见,请提出来,我及时改进…谢谢

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网