您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關如何在java項目中導出Excel文件,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
1、fileName
excel文件名
2、HasMap<String,List<?>> data
具體的數據,每個List代表一張表的數據,?表示可為任意的自定義對象
3、LinkedHashMap<String,String[][]> headers
Stirng代表sheet名。每個String[][]代表一個sheet的定義,舉個例子如下:
String[][] header = { {"field1","參數1"} ,{"field2","參數2"} ,{"field3","參數3"} }
其中的field1,field2,field3為對象中的屬性名,參數1,參數2,參數3為列名,實際上這個指定了列的名稱和這個列用到數據對象的哪個屬性。
二、怎么用
以一個例子來說明怎么用,假設有兩個類A和B定義如下:
public class A{ private String name; private String address; } public class B{ private int id; private double sum; private String cat; }
現在我們通過查詢數據庫獲得了A和B的兩個列表:
List<A> dataA = .....;
List<B> dataB = .....;
我們將這兩個導出到excel中,首先需要定義sheet:
String[][] sheetA = { {"name","姓名"} ,{"address","住址"} } String[][] sheetB = { {"id","ID"} ,{"sum","余額"} ,{"cat","貓的名字"} }
然后將數據匯總構造一個ExcelUtil:
String fileName = "測試Excel"; HashMap<String,List<?>> data = new HashMap<>(); //ASheet為表名,后面headers里的key要跟這里一致 data.put("ASheet",dataA); data.put("BSheet",dataB); LinkedHashMap<String,String[][]> headers = new LinkedHashMap<>(); headers.put("ASheet",sheetA); headers.put("BSheet",sheetB); ExcelUtil excelUtil = new ExcelUtil(fileName,data,headers); //獲取表格對象 HSSFWorkbook workbook = excelUtil.createExcel(); //這里內置了一個寫到response的方法(判斷瀏覽器類型設置合適的參數),如果想寫到文件也是類似的 workbook.writeToResponse(workbook,request,response);
當然通常數據是通過數據庫查詢的,這里為了演示方便沒有從數據庫查找。
三、實現原理
這里簡單說明下實現過程,從調用createExcel()這里開始
1、遍歷headers創建sheet
public HSSFWorkbook createExcel() throws Exception { try { HSSFWorkbook workbook = new HSSFWorkbook(); //遍歷headers創建表格 for (String key : headers.keySet()) { this.createSheet(workbook, key, headers.get(key), this.data.get(key)); } return workbook; } catch (Exception e) { log.error("創建表格失敗:{}", e.getMessage()); throw e; } }
將workbook,sheet名,表頭數據,行數據傳入crateSheet方法中創建sheet。
2、創建表頭
表頭也就是一個表格的第一行,通常用來對列進行說明
HSSFSheet sheet = workbook.createSheet(sheetName); // 列數 int cellNum = header.length; // 單元行,單元格 HSSFRow row; HSSFCell cell; // 表頭單元格樣式 HSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook); // 設置表頭 row = sheet.createRow(0); for (int i = 0; i < cellNum; i++) { cell = row.createCell(i); cell.setCellStyle(columnTopStyle); String str = header[i][1]; cell.setCellValue(str); // 設置列寬為表頭的文字寬度+6個半角符號寬度 sheet.setColumnWidth(i, (str.getBytes("utf-8").length + 6) * 256); }
3、插入行數據
這里是最重要的部分,首先通過數據的類對象獲取它的反射屬性Field類,然后將屬性名和Field做一個hash映射,避免循環查找,提高插入速度,接著通過一個switch語句,根據屬性類別設值,主要代碼如下:
/** * 設置單元格,根據fieldName獲取對應的Field類,使用反射得到值 * * @param cell 單元格實例 * @param obj 存有屬性的對象實例 * @param fieldMap 屬性名與Field的映射 * @param fieldName 屬性名 */ private void setCell(HSSFCell cell, Object obj, Map<String, Field> fieldMap, String fieldName) throws Exception { //獲取該屬性的Field對象 Field field = fieldMap.get(fieldName); //通過反射獲取屬性的值,由于不能確定該值的類型,用下面的判斷語句進行合適的轉型 Object value = field.get(obj); if (value == null) { cell.setCellValue(""); } else { switch (field.getGenericType().getTypeName()) { case "java.lang.String": cell.setCellValue((String) value); break; case "java.lang.Integer": case "int": cell.setCellValue((int) value); break; case "java.lang.Double": case "double": cell.setCellValue((double) value); break; case "java.util.Date": cell.setCellValue(this.dateFormat.format((Date) value)); break; default: cell.setCellValue(obj.toString()); } } }
看完上述內容,你們對如何在java項目中導出Excel文件有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。