netty系列之:搭建客戶端使用http1.1的方式連線http2伺服器
阿新 • • 發佈:2021-11-03
最近維護到了匯出的功能,由於這個板塊整個匯出功能都沒有開發,所以我算是從頭寫了這個功能,期間還踩了大坑,寫個部落格防止自己忘記
Java匯出Excel主要有兩種方法jxl和poi,由於jxl太老了,這裡只介紹poi的操作方法
poi簡介
poi是由Apache基金會支援的,使用Java操作微軟Office幾件套的方法,包括了word,excel,ppt還有visio。
微軟的幾件套本質上可以看成一個壓縮檔案,以excel為例,用開啟壓縮檔案的方式開啟一個excel表格就能看見這樣的資訊
裡面的工作簿,主題,還有樣式都是檔案,所以很容易可以將一個xlsx表格理解成一個物件,這和Java的萬物皆物件思想不謀而合,操作起來十分的方便。
操作方法
這裡主要介紹匯出操作
我們都知道一個excel工作簿預設有三個表格sheet,每個表格有若干行row(2003版本最多65536,07版會多很多),每個行有若干個單元格cell,單元格里面可以填值value。
所以按照這個思路,就可以新建表格,再將資料填入相應的單元格中就可以了,使用Java操作也就是把點滑鼠和敲鍵盤變成了敲程式碼
新建工作簿
Workbook workbook = new HSSFWorkbook(); // 03版本
Workbook workbook = new XSSFWorkbook(); // 07版本
如果需要匯入模板,則可以先根據字尾判斷使用哪一種
Workbook workbook = null; if (fileName.toLowerCase().endsWith("xls") { workbook = new HSSFWorkbook(in); } else if (fileName.toLowerCase().endsWith("xlsx")) { workbook = new XSSFWorkbook(in); }
獲取表格物件
工作簿新建好了之後,需要選擇我們要操作的表格
Sheet sheet = workbook.getSheetAt(0)
這裡表示獲取了第一個表格
獲取行物件
和獲取表格類似,這裡需要加一個判斷,如果行是空的話,就新建一個行
Row row = sheet.getRow(i) // 一般套在for迴圈裡,傳入的引數是行數
if (row == null) {
row = sheet.createRow(i) // 表示新建的行是第幾行
}
獲取單元格,填入資料
row.createCell(i).setCellValue("value");
完整程式碼
後續還需要寫入輸出流,選擇檔案存放位置,就不多論述,主要記錄核心思想
Workbook workbook = null;
if (fileName.toLowerCase().endsWith("xls") {
workbook = new HSSFWorkbook();
} else if (fileName.toLowerCase().endsWith("xlsx") {
workbook = new XSSFWorkbook();
}
Sheet sheet = workbook.getSheetAt(0);
for(int i = 0; i < item.length; i ++) {
Row row = sheet.getRow(i + 1); // 模板第一行有字,這裡從第二行開始
if (row == null) {
row = sheet.createRow(i + 1);
}
for(int j = 0; j < 10; j ++) { // 這裡的列數有自己需要寫入的資料決定
row.createCell(j).setCellValue("value"+j);
}
}
ByteArrayOutputStream os = new ByteArrayOutputStream();
workbook.write(os)
踩的大坑是在寫入單元格資料時需要create一個cell,但是看別人直接用的時getCell,也沒問題,而我那麼寫就會報空指標異常,沒想明白。。。