1. 程式人生 > >Java實現excel表格轉成json

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

符合我的需求,如果需要複雜的,還需要進行整理,如果有什麼意見,請提出來,我及時改進…謝謝