亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

java導出Excel文件的步驟全紀錄

2024-07-14 08:42:17
字體:
來源:轉載
供稿:網友

一、背景

當前B/S模式已成為應用開發的主流,而在企業辦公系統中,常常有客戶這樣子要求:你要把我們的報表直接用Excel打開(電信系統、銀行系統)。或者是:我們已經習慣用Excel打印。這樣在我們實際的開發中,很多時候需要實現導入、導出Excel的應用。

最近在java上做了一個EXCEL的導出功能,寫了一個通用類,在這里分享分享,該類支持多sheet,且無需手動進行復雜的類型轉換,只需提供三個參數即可:

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());  } }}

完整代碼可以到github上查看下載,這里就不列出來了。

github地址:點擊跳轉

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品国产精品乱码不99按摩| 青草热久免费精品视频| 国产精品免费久久久久久| 日韩视频免费在线| www.亚洲男人天堂| 国产精品青草久久久久福利99| 97在线视频一区| 中文字幕av一区二区| 欧美激情欧美激情在线五月| 亚洲aa中文字幕| 国产精品极品在线| 亚洲精品成人久久电影| 欧美日韩一区二区免费在线观看| 国产91成人video| 91av网站在线播放| 岛国av在线不卡| 日韩欧美大尺度| 亚洲a级在线观看| 欧美日韩高清在线观看| 成人黄色免费网站在线观看| 久久久久久久影视| 日韩中文娱乐网| 亚洲视频一区二区| 成人av.网址在线网站| 亚洲国产日韩一区| 国产成人高潮免费观看精品| 中文字幕国产精品| 91欧美精品午夜性色福利在线| 成人www视频在线观看| 青青草原成人在线视频| 日本久久久久久| 欧美黄色片免费观看| 亚洲另类激情图| 欧美诱惑福利视频| 国产成人免费av| 国产日韩亚洲欧美| 国产在线精品成人一区二区三区| 日韩在线欧美在线| 国产精品久久久久久久久久久不卡| 日韩欧美主播在线| 91欧美精品成人综合在线观看| 亚洲a在线播放| 亚洲欧美制服第一页| 日韩中文字幕视频在线| 色多多国产成人永久免费网站| 国产ts人妖一区二区三区| 91色视频在线导航| 中文日韩在线视频| 亚洲国产精品成人va在线观看| 91久久精品美女| 久久久久久久影院| 久久国产精彩视频| 日韩电影在线观看免费| 国产精品99久久久久久白浆小说| 亚洲人成自拍网站| 精品日韩中文字幕| 午夜精品一区二区三区在线视频| 久久久久久网站| 久久久久久网站| 性色av一区二区三区红粉影视| 精品久久久久久久久久久久久| 国产精品欧美风情| 欧美成人在线影院| 欧美激情精品久久久久久久变态| 国自在线精品视频| 亚洲图片在区色| 欧美国产日韩免费| 日韩国产精品一区| 国产亚洲欧美日韩美女| 成人做爰www免费看视频网站| 91sao在线观看国产| 国产福利视频一区二区| 久久男人av资源网站| 成人欧美在线视频| 欧美在线一区二区视频| 国产日韩欧美综合| 97精品在线观看| 日韩大陆毛片av| 国产97免费视| 精品视频在线导航| 中文字幕无线精品亚洲乱码一区| 亚洲性69xxxbbb| 国产不卡在线观看| 亚洲一区二区久久久久久久| 亚洲精品欧美一区二区三区| 国产成人综合精品在线| 久久五月天综合| 日韩经典一区二区三区| 日韩成人在线视频| 国产综合色香蕉精品| 亚洲欧美变态国产另类| 成人在线视频网站| 国产成人精品久久| 国产精品揄拍500视频| 欧美精品一二区| 日韩免费在线观看视频| 在线播放日韩欧美| 日韩禁在线播放| 国产精品久久久久久久av电影| 国产这里只有精品| 欧美激情久久久久| 91久久久在线| 亚洲全黄一级网站| 国产精品爽爽爽爽爽爽在线观看| 久久久亚洲福利精品午夜| 日韩免费观看网站| 国产精品69精品一区二区三区| 日韩欧美在线字幕| 欧美激情在线视频二区| 18一19gay欧美视频网站| 色婷婷av一区二区三区在线观看| 久久精品99无色码中文字幕| 日韩国产欧美区| 深夜福利国产精品| 91精品免费久久久久久久久| 欧美性xxxxx极品娇小| 欧美黑人狂野猛交老妇| 久久久免费精品视频| 精品久久久久久久久中文字幕| 国产精品jvid在线观看蜜臀| 成人欧美一区二区三区在线| 亚洲成人久久久| 精品亚洲男同gayvideo网站| 国自在线精品视频| 5252色成人免费视频| 日韩电影中文字幕| 98午夜经典影视| 国产精品女主播| 欧美激情乱人伦| 日韩欧美一区二区三区久久| 在线免费观看羞羞视频一区二区| 久久久久久国产精品三级玉女聊斋| 91色中文字幕| 亚洲国产一区二区三区在线观看| 国产精品久久久久久亚洲调教| 欧美在线中文字幕| 中文字幕免费精品一区| 97免费视频在线| 欧美日韩激情网| 色在人av网站天堂精品| 日韩国产精品一区| 一本色道久久88亚洲综合88| 美乳少妇欧美精品| 久久久av免费| 91精品国产综合久久久久久久久| 国产欧美欧洲在线观看| 国产成人自拍视频在线观看| 成人精品在线视频| 欧美精品在线视频观看| 亚洲国产美女精品久久久久∴| 伦理中文字幕亚洲| 成人在线中文字幕| 久久777国产线看观看精品| 精品久久久一区二区| 中文字幕日韩免费视频| 久久久欧美一区二区| 97在线免费观看视频| 欧美大片va欧美在线播放| 欧美另类第一页| 日韩一级黄色av| 欧美成aaa人片免费看| 精品国产网站地址| 日韩免费中文字幕| 全亚洲最色的网站在线观看|