Java實現(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ù)庫或者實體類的表頭,一般為英文的字符串,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)英文于實體類或者數(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ù)據(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ù)據(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ù)據(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實現(xiàn)Word/Excel/TXT轉(zhuǎn)PDF的方法
- java實現(xiàn)在線預(yù)覽--poi實現(xiàn)word、excel、ppt轉(zhuǎn)html的方法
- Java使用jacob將微軟office中word、excel、ppt轉(zhuǎn)成pdf
- java 讀取excel文件轉(zhuǎn)換成json格式的實例代碼
- Java實現(xiàn)的Excel列號數(shù)字與字母互相轉(zhuǎn)換功能
- java 中Excel轉(zhuǎn)shape file的實例詳解
- java實現(xiàn)excel和txt文件互轉(zhuǎn)
- java POI解析Excel 之?dāng)?shù)據(jù)轉(zhuǎn)換公用方法(推薦)
- Java實現(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-03spring boot中的properties參數(shù)配置詳解
這篇文章主要介紹了spring boot中的properties參數(shù)配置,需要的朋友可以參考下2017-09-09Java如何根據(jù)實體指定字段值對其List進(jìn)行排序詳解
在Java項目中可能會遇到給出一些條件,將List元素按照給定條件進(jìn)行排序的情況,這篇文章主要給大家介紹了關(guān)于Java如何根據(jù)實體指定字段值對其List進(jìn)行排序的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07Java利用ITextPdf庫生成PDF預(yù)覽文件的具體實現(xiàn)
這篇文章主要給大家介紹了Java利用ITextPdf庫生成PDF預(yù)覽文件的具體實現(xiàn),文中通過代碼示例和圖文給大家介紹的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下2024-04-04Java如何優(yōu)雅地避免空指針異常(NullPointerException)
這篇文章主要給大家介紹了關(guān)于Java如何優(yōu)雅地避免空指針異常(NullPointerException)的相關(guān)資料,空指針異常(NullPointerException)是一種常見的運行時異常,它在Java編程中經(jīng)常出現(xiàn),需要的朋友可以參考下2024-03-03Java 其中翻轉(zhuǎn)字符串的實現(xiàn)方法
這篇文章主要介紹了Java 其中翻轉(zhuǎn)字符串的實現(xiàn)方法,需要的朋友可以參考下2014-02-02java實現(xiàn)兩臺服務(wù)器間文件復(fù)制的方法
這篇文章主要介紹了java實現(xiàn)兩臺服務(wù)器間文件復(fù)制的方法,是對單臺服務(wù)器上文件復(fù)制功能的升級與改進(jìn),具有一定參考借鑒價值,需要的朋友可以參考下2015-01-01