Java實(shí)現(xiàn)excel表格轉(zhuǎn)成json的方法
今天有個(gè)朋友問(wèn)我,有沒(méi)有excel表格到處json的方法,在網(wǎng)上找到了好幾個(gè)工具,都不太理想,于是根據(jù)自己的需求,自己寫(xiě)了一個(gè)工具。
功能代碼
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(這里用一句話(huà)描述這個(gè)類(lèi)的作用)
* @author LiYonghui
* @date 2017年1月6日 下午4:42:43
*/
public class Excel2JSONHelper {
//常亮,用作第一種模板類(lèi)型,如下圖
private static final int HEADER_VALUE_TYPE_Z=1;
//第二種模板類(lèi)型,如下圖
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ù)庫(kù)或者實(shí)體類(lèi)的表頭,一般為英文的字符串,2代表是第二種模板,
JSONArray jsonArray = excelHelper.readExcle(dir, 0, 2);
System.out.println(jsonArray.toString());;
}
/**
*
* 獲取一個(gè)實(shí)例
*/
private static Excel2JSONHelper getExcel2JSONHelper(){
return new Excel2JSONHelper();
}
/**
* 文件過(guò)濾
* @Title: fileNameFileter
* @Description: TODO(這里用一句話(huà)描述這個(gè)方法的作用)
* @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(這里用一句話(huà)描述這個(gè)方法的作用)
* @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(這里用一句話(huà)描述這個(gè)方法的作用)
* @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類(lèi)型
case Cell.CELL_TYPE_STRING:
return cell.getRichStringCellValue().getString();
//number類(lèi)型
case Cell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
return cell.getDateCellValue().getTime();
} else {
return cell.getNumericCellValue();
}
//boolean類(lèi)型
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(這里用一句話(huà)描述這個(gè)方法的作用)
* @param: @param headerRow
* @param: @param cellIndex 英文表頭所在的行,從0開(kāi)始計(jì)算哦
* @param: @param type 表頭的類(lèi)型第一種 姓名(name)英文于實(shí)體類(lèi)或者數(shù)據(jù)庫(kù)中的變量一致
* @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){
//第一種模板類(lèi)型
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){
//第二種模板類(lèi)型
headerValue = cell.getRichStringCellValue().getString();
}
}
return headerValue;
}
/**
* 讀取excel表格
* @Title: readExcle
* @Description: TODO(這里用一句話(huà)描述這個(gè)方法的作用)
* @param: @param file
* @param: @param headerIndex
* @param: @param headType 表頭的類(lèi)型第一種 姓名(name)英文于實(shí)體類(lèi)或者數(shù)據(jù)庫(kù)中的變量一致
* @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);
//讀取第一個(gè)sheet頁(yè)
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表格模板類(lèi)型和調(diào)用方式
第一種 :用括號(hào)把實(shí)體類(lèi)變量名稱(chēng)或者數(shù)據(jù)庫(kù)字段名稱(chēng)括起來(lái)

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

調(diào)用方法如下:
//表格的名稱(chēng)為2003.xls
File file= new File("e:\\2003.xls");
Excel2JSONHelper excelHelper = getExcel2JSONHelper();
//字母表頭為在第1行,第2種模板類(lèi)型
JSONArray jsonArray = excelHelper.readExcle(file, 1, 2);

//表格的名稱(chēng)為2003.xls
File file= new File("e:\\2003.xls");
Excel2JSONHelper excelHelper = getExcel2JSONHelper();
//字母表頭為在第2行,第2種模板類(lèi)型
JSONArray jsonArray = excelHelper.readExcle(file, 2, 2);
jsonArray打印的結(jié)果
[{"index":"1","name":"李逵","jobNum":"10004","dept":"開(kāi)發(fā)部","job":"android工程師"}, {"index":"2","name":"宋江","jobNum":"10001","dept":"總裁辦","job":"總裁"}]
符合我的需求,如果需要復(fù)雜的,還需要進(jìn)行整理,如果有什么意見(jiàn),請(qǐng)?zhí)岢鰜?lái),我及時(shí)改進(jìn)…謝謝
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(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)在線(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列號(hào)數(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ù)庫(kù)的sql文件
- Java 將Excel轉(zhuǎn)為SVG的方法
相關(guān)文章
使用Springboot封裝一個(gè)自適配的數(shù)據(jù)單位轉(zhuǎn)換工具類(lèi)
我們?cè)诮邮涨芭_(tái)傳輸?shù)臄?shù)據(jù)時(shí),往往SpringBoot使用內(nèi)置的數(shù)據(jù)類(lèi)型轉(zhuǎn)換器把我們提交的數(shù)據(jù)自動(dòng)封裝成對(duì)象等類(lèi)型,下面這篇文章主要給大家介紹了關(guān)于使用Springboot封裝一個(gè)自適配的數(shù)據(jù)單位轉(zhuǎn)換工具類(lèi)的相關(guān)資料,需要的朋友可以參考下2023-03-03
spring boot中的properties參數(shù)配置詳解
這篇文章主要介紹了spring boot中的properties參數(shù)配置,需要的朋友可以參考下2017-09-09
Java如何根據(jù)實(shí)體指定字段值對(duì)其List進(jìn)行排序詳解
在Java項(xiàng)目中可能會(huì)遇到給出一些條件,將List元素按照給定條件進(jìn)行排序的情況,這篇文章主要給大家介紹了關(guān)于Java如何根據(jù)實(shí)體指定字段值對(duì)其List進(jìn)行排序的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07
Java利用ITextPdf庫(kù)生成PDF預(yù)覽文件的具體實(shí)現(xiàn)
這篇文章主要給大家介紹了Java利用ITextPdf庫(kù)生成PDF預(yù)覽文件的具體實(shí)現(xiàn),文中通過(guò)代碼示例和圖文給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-04-04
Java如何優(yōu)雅地避免空指針異常(NullPointerException)
這篇文章主要給大家介紹了關(guān)于Java如何優(yōu)雅地避免空指針異常(NullPointerException)的相關(guān)資料,空指針異常(NullPointerException)是一種常見(jiàn)的運(yùn)行時(shí)異常,它在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)兩臺(tái)服務(wù)器間文件復(fù)制的方法
這篇文章主要介紹了java實(shí)現(xiàn)兩臺(tái)服務(wù)器間文件復(fù)制的方法,是對(duì)單臺(tái)服務(wù)器上文件復(fù)制功能的升級(jí)與改進(jìn),具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01

