1. 程式人生 > 其它 >netty系列之:搭建客戶端使用http1.1的方式連線http2伺服器

netty系列之:搭建客戶端使用http1.1的方式連線http2伺服器

最近維護到了匯出的功能,由於這個板塊整個匯出功能都沒有開發,所以我算是從頭寫了這個功能,期間還踩了大坑,寫個部落格防止自己忘記
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,也沒問題,而我那麼寫就會報空指標異常,沒想明白。。。