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

时间:2021-12-14 16:05:57

今天有个朋友问我,有没有excel表格到处json的方法,在网上找到了好几个工具,都不太理想,于是根据自己的需求,自己写了一个工具。

功能代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
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的方法

调用方法如下:

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

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

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

调用方法如下:

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

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

?
1
2
3
4
5
//表格的名称为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":"总裁"}]

 

 

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

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

原文链接:http://blog.csdn.net/allen202/article/details/54145479