欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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表格模板类型和调用方式

第一种 :用括号把实体类变量名称或者数据库字段名称括起来

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

调用方法如下:

  //表格的名称为2003.xls
  file file= new file("e:\\2003.xls");
  excel2jsonhelper excelhelper = getexcel2jsonhelper();
  //字母表头为在第1行,第1种模板类型
  jsonarray jsonarray = excelhelper.readexcle(file, 1, 1);

第二种: 实体类变量名称或者数据库字段另起一行,如下两张图都行

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

调用方法如下:

  //表格的名称为2003.xls
  file file= new file("e:\\2003.xls");
  excel2jsonhelper excelhelper = getexcel2jsonhelper();
  //字母表头为在第1行,第2种模板类型
  jsonarray jsonarray = excelhelper.readexcle(file, 1, 2);

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

  //表格的名称为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":"总裁"}]

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

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