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":"总裁"}]

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

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

(0)

相关推荐

  • GSON实现Java对象与JSON格式对象相互转换的完全教程

    Gson是一个Java库,用来实现Json和Java对象之间的相互转换.Gson是一个托管在https://github.com/google/gson的开源项目. Gson中主要的类是Gson,也可以使用类GsonBuilder在创建Gson对象的同时设置一些选项. Gson对象在处理Json时不会保存任何状态,所以使用者能够很轻松的对同一个Gson对象进行多次序列化.反序列化等操作. 示例:基本使用 //Serialization Gson gson = new Gson(); gson.t

  • java定义二维数组的几种写法(小结)

    如下所示: //定义二维数组写法1 class numthree { public static void main(String[] args) { float[][] numthree; //定义一个float类型的2维数组 numthree=new float[5][5]; //为它分配5行5列的空间大小 numthree[0][0]=1.1f; //通过下标索引去访问 1行1列=1.1 numthree[1][0]=1.2f; // 2行1列=1.2 numthree[2][0]=1.3

  • Java编程中二维数组的初始化和基本操作实例

    Java二维数组的声明和初始化 1.二维数组可以看成以数组为元素的数组: 2.Java中二维数组的声明和初始化应按照从高维到低维的顺序进行. 实例: 静态初始化: Array2.java: 程序代码 public class Array2 { public static void main(String args[]) { int a[][] = {{1,2},{3,4,5,6},{7,8,9}} ; for(int i=0 ; i <a.length ; i++) { for(int j=0

  • Json转化为Java对象的实例详解

    Json转化为Java对象的实例详解 问题:前后端数据交互时,经常会遇到Json串与Java对象转化的问题,有的Java对象中还包含了List对象等. 解决方案: 引入 json-lib包,Maven坐标如下: <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> &l

  • java 二维数组矩阵乘法的实现方法

    复制代码 代码如下: public interface IMatrixMultiple {     public int[][] mmltiple(int[][]a ,int [][]b); } ?public class MatrixMultiple implements IMatrixMultiple { @Override    public int[][] mmltiple(int[][] a, int[][] b) {         int [][] result = new int

  • 使用Java进行Json数据的解析(对象数组的相互嵌套)

    这段时间我们在做一个英语翻译软件的小小小APP,涉及到了对Json数据的解析,所以特地来总结一下! 假设我们要对如下数据进行解析,其实在平时,返回的Json数据是很乱的,很难分清数据的关系,这是经过相关工具美化后的结果 { "translation": [ "爱" ], "basic": { "us-phonetic": "lʌv", "phonetic": "lʌv"

  • Java二维数组简单定义与使用方法示例

    本文实例讲述了Java二维数组简单定义与使用方法.分享给大家供大家参考,具体如下: Java的二维数组是先创建一个一维数组,然后该数组的元素再引用另外一个一维数组.在使用二维数组的时候,通过两个中括号[]来访问每一层维度的引用,直到访问到最终的数据. public class MultiDimArray{ /** * @param args */ public static void main(String[] args) { int[][] arr = new int[3][]; arr[0]

  • java与JSON数据的转换实例详解

    java与JSON数据的转换实例详解 JSON与JAVA数据的转换(JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非常适合于服务器与 JavaScript 的交互.) 代码中有这么一句,是后台的封装数据. JSONObject jo = JSONObject.fromObject(map); 常见的java代码转换成json --请注意,这个方法曾经给我造成过困惑.因为,它在对Object转换的时候是按照domain类中的所有getXXX()方

  • java实现二维数组转json的方法示例

    本文实例讲述了java实现二维数组转json的方法.分享给大家供大家参考,具体如下: package Tsets; public class erweiTojson { public static void main(String[] args) { String[][] blogList = { {"2008/07/07", "NetBeans New and Cool", "Tim Boudreau"}, {"2008/07/07&

  • java旋转二维数组实例

    本文实例讲述了java旋转二维数组的操作,分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package test; /*  *     1    2    3    4    5     *    16    17    18    19    6     *    15    24    25    20    7     *    14    23    22    21    8     *    13    12    11    10    9  *  *    写一

  • java 求解二维数组列最小值

    java 求解二维数组列最小值 比较二维数组列最小值,组成一个新数组返回. 实现核心算法,不需要使用IO 输入:{{5,6,1,16},{7,3,9}} 输出:{1,3} import java.util.Arrays; public class Col { public static int[] getColMin(int a[][]) { int[] res = new int[a.length]; for (int i = 0; i < a.length; i++) { int[] s =

随机推荐