91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在java項目中導出Excel文件

發布時間:2021-06-08 16:53:27 來源:億速云 閱讀:143 作者:Leah 欄目:編程語言

今天就跟大家聊聊有關如何在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文件有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

玉田县| 肇源县| 南郑县| 德格县| 军事| 延长县| 东源县| 江西省| 黄骅市| 交城县| 吉水县| 普格县| 彰化市| 洪雅县| 桃园县| 呼图壁县| 闵行区| 越西县| 巩留县| 平顺县| 南丹县| 全南县| 洛阳市| 德清县| 基隆市| 雷波县| 长寿区| 吴江市| 郓城县| 许昌县| 青海省| 黄平县| 涞水县| 汉寿县| 保定市| 西贡区| 蚌埠市| 广安市| 新巴尔虎右旗| 云龙县| 无锡市|