Java實(shí)現(xiàn)excel表格轉(zhuǎn)成json的方法
今天有個朋友問我,有沒有excel表格到處json的方法,在網(wǎng)上找到了好幾個工具,都不太理想,于是根據(jù)自己的需求,自己寫了一個工具。
功能代碼
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表格轉(zhuǎn)成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代表是第一行為保存到數(shù)據(jù)庫或者實(shí)體類的表頭,一般為英文的字符串,2代表是第二種模板,
JSONArray jsonArray = excelHelper.readExcle(dir, 0, 2);
System.out.println(jsonArray.toString());;
}
/**
*
* 獲取一個實(shí)例
*/
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開始計(jì)算哦
* @param: @param type 表頭的類型第一種 姓名(name)英文于實(shí)體類或者數(shù)據(jù)庫中的變量一致
* @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)英文于實(shí)體類或者數(shù)據(jù)庫中的變量一致
* @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);
//讀取數(shù)據(jù)
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);
//數(shù)據(jù)為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表格模板類型和調(diào)用方式
第一種 :用括號把實(shí)體類變量名稱或者數(shù)據(jù)庫字段名稱括起來

調(diào)用方法如下:
//表格的名稱為2003.xls
File file= new File("e:\\2003.xls");
Excel2JSONHelper excelHelper = getExcel2JSONHelper();
//字母表頭為在第1行,第1種模板類型
JSONArray jsonArray = excelHelper.readExcle(file, 1, 1);
第二種: 實(shí)體類變量名稱或者數(shù)據(jù)庫字段另起一行,如下兩張圖都行

調(diào)用方法如下:
//表格的名稱為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打印的結(jié)果
[{"index":"1","name":"李逵","jobNum":"10004","dept":"開發(fā)部","job":"android工程師"}, {"index":"2","name":"宋江","jobNum":"10001","dept":"總裁辦","job":"總裁"}]
符合我的需求,如果需要復(fù)雜的,還需要進(jìn)行整理,如果有什么意見,請?zhí)岢鰜?,我及時改進(jìn)…謝謝
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java生成餅圖svg及JFreeChart生成svg圖表
- Java基于Spire Cloud Excel把Excel轉(zhuǎn)換成PDF
- Java實(shí)現(xiàn)Word/Excel/TXT轉(zhuǎn)PDF的方法
- java實(shí)現(xiàn)在線預(yù)覽--poi實(shí)現(xiàn)word、excel、ppt轉(zhuǎn)html的方法
- Java使用jacob將微軟office中word、excel、ppt轉(zhuǎn)成pdf
- java 讀取excel文件轉(zhuǎn)換成json格式的實(shí)例代碼
- Java實(shí)現(xiàn)的Excel列號數(shù)字與字母互相轉(zhuǎn)換功能
- java 中Excel轉(zhuǎn)shape file的實(shí)例詳解
- java實(shí)現(xiàn)excel和txt文件互轉(zhuǎn)
- java POI解析Excel 之?dāng)?shù)據(jù)轉(zhuǎn)換公用方法(推薦)
- Java實(shí)現(xiàn)把excel xls中數(shù)據(jù)轉(zhuǎn)為可直接插入數(shù)據(jù)庫的sql文件
- Java 將Excel轉(zhuǎn)為SVG的方法
相關(guān)文章
使用Springboot封裝一個自適配的數(shù)據(jù)單位轉(zhuǎn)換工具類
我們在接收前臺傳輸?shù)臄?shù)據(jù)時,往往SpringBoot使用內(nèi)置的數(shù)據(jù)類型轉(zhuǎn)換器把我們提交的數(shù)據(jù)自動封裝成對象等類型,下面這篇文章主要給大家介紹了關(guān)于使用Springboot封裝一個自適配的數(shù)據(jù)單位轉(zhuǎn)換工具類的相關(guān)資料,需要的朋友可以參考下2023-03-03
spring boot中的properties參數(shù)配置詳解
這篇文章主要介紹了spring boot中的properties參數(shù)配置,需要的朋友可以參考下2017-09-09
Java如何根據(jù)實(shí)體指定字段值對其List進(jìn)行排序詳解
在Java項(xiàng)目中可能會遇到給出一些條件,將List元素按照給定條件進(jìn)行排序的情況,這篇文章主要給大家介紹了關(guān)于Java如何根據(jù)實(shí)體指定字段值對其List進(jìn)行排序的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07
Java利用ITextPdf庫生成PDF預(yù)覽文件的具體實(shí)現(xiàn)
這篇文章主要給大家介紹了Java利用ITextPdf庫生成PDF預(yù)覽文件的具體實(shí)現(xiàn),文中通過代碼示例和圖文給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-04-04
Java如何優(yōu)雅地避免空指針異常(NullPointerException)
這篇文章主要給大家介紹了關(guān)于Java如何優(yōu)雅地避免空指針異常(NullPointerException)的相關(guān)資料,空指針異常(NullPointerException)是一種常見的運(yùn)行時異常,它在Java編程中經(jīng)常出現(xiàn),需要的朋友可以參考下2024-03-03
Java 其中翻轉(zhuǎn)字符串的實(shí)現(xiàn)方法
這篇文章主要介紹了Java 其中翻轉(zhuǎn)字符串的實(shí)現(xiàn)方法,需要的朋友可以參考下2014-02-02
java實(shí)現(xiàn)兩臺服務(wù)器間文件復(fù)制的方法
這篇文章主要介紹了java實(shí)現(xiàn)兩臺服務(wù)器間文件復(fù)制的方法,是對單臺服務(wù)器上文件復(fù)制功能的升級與改進(jìn),具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01

