麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > 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 | 999精品久久久 | 一区在线免费视频 | 精品一区二区亚洲 | 精品一区二区在线播放 | 国产精品久久久久久久久久久久久久久 | 99热草| 成人在线视频免费 | 国产资源在线观看视频 | 久久久久北条麻妃免费看 | 69性欧美高清影院 | 一区二区三区日韩 | 精品一区二区三区在线观看国产 | 爱福利视频 | 中文字幕1区2区 | 成年人视频免费 | 在线观看麻豆 | 欧美日韩一 | 成人福利免费在线观看 | 精品欧美一区二区精品久久 | 中文字幕在线观看视频www | 一级成人黄色片 | 日本va在线观看 | 一级做a爱视频 | www.xxx视频| 黄污网站在线观看 | 综合在线视频 | 91av亚洲| 欧美成人做爰高潮片免费视频 | 久久精品视频一区二区三区 | 亚欧在线免费观看 | 欧美日本一区二区 | 久草视频在线资源 | 人人玩人人爽 | 激情网站免费观看 | 手机在线看片国产 | 一区二区久久精品66国产精品 | 国产精品成人久久久久a级 av电影在线免费 | 毛片免费视频观看 | 欧美性生交xxxxx免费观看 | 精品一区二区在线视频 |