1. 概念
最近的項目有用到poi導出資料到excel,是以總結下自己對poi的一些簡單了解,poi的具體作用不用多說,主要就是利用它将代碼輸出資料導入到excel表格中,其效果有點類似于freemarker
由于poi主要是面向excel的應用(也可以用word等其他類型),是以對于不同的excel版本就有不同的生成類,我目前熟悉的是HSSFWorkbook和XSSFWorkbook兩種,可以勉強應付目前工作了,後續有時間在來深入學習
excel2003 —> HSSFWorkbook(常用)
excel2007 —> XSSFWorkbook
03和07版本的主要差別就是對資料量的支援,03版一個Sheet工作表它的行最多支援到65536行,列支援到256列,07版的這一資料可以到1048576行和65536列,是以可以自行根據資料量的大小來選擇
2. Poi的簡單應用
使用Poi導出資料主要有兩種模式,一種是自己建立表,還有一種是使用已經模闆
2.1 方式一:建立表
- 步驟:
- 建立一個excel對象
- 建立excel中的sheet
- 定位要輸出的單元格(先定位行,再定位列)
- 向指定單元格輸出資料
- 設定單元格樣式
- 儲存excel
- 代碼:
public class PoiTest {
/**
* @Description : HSSFworkbook測試
* 2018年3月4日 上午5:35:18
*/
@Test
public void HSSFTest() throws Exception {
//1. 建立excel對象
Workbook hwb = new HSSFWorkbook();
//2. 建立excel中的sheet
Sheet sheet = hwb.createSheet();
hwb.setSheetName(, "第一個工作表"); //給第一個sheet重新命名
//3. 定位要輸出的單元格(先定位行,再定位列)
Row row = sheet.createRow(); //定位第4行
Cell cell = row.createCell(); //定位第5列,即定位了第四行第五列的單元格(即E4)
//4. 向指定單元格輸出資料
cell.setCellValue("hello poi!");
//5. 設定單元格樣式,單元格的樣式太多了可以自己去寫一個工具類,簡單建立一個字型樣式
CellStyle cellStyle = hwb.createCellStyle(); //建立樣式類
Font fontStyle = hwb.createFont(); //建立字型樣式
fontStyle.setFontName("宋體"); //設定宋體
cellStyle.setFont(fontStyle); //将字型對象賦給樣式類
cell.setCellStyle(cellStyle); //将樣式類賦給單元格
//6. 儲存
OutputStream os = new FileOutputStream("E:\\hssfDemo.xls"); //儲存到E盤下,命名為hssfDemo.xls
hwb.write(os);
os.close();
}
}
輸出結果:

說明:
HSSFWorkbook和XSSFWorkbook隻是在建立Excel對象的時候有差異,其他用法都一樣
對于格式這一塊可以去查詢其他更詳細的資料,或者使用接下來更簡便的方法–模闆導出
2.2 方式二:使用模闆
模闆導出,顧名思義就是使用已經在本地建立好的excel,然後往裡面指定位置填充資料即可,格式也可以預先在excel中設定好,然後在代碼中取出指派,步驟和之前大同小異
- 步驟:
- 擷取模闆檔案
- 擷取模闆excel中的sheet
- 擷取模闆中的樣式
- 定位單元格,并設定值和樣式
- 儲存
- 模闆
Poi的簡單應用.md - 代碼:
@Test
public void testModel() throws Exception {
//1.擷取模闆檔案
Workbook xwb = new XSSFWorkbook(new FileInputStream(new File("E:\\demo.xlsx")));
//2.擷取excel中的sheet
Sheet sheet = xwb.getSheetAt(); //擷取第一個sheet
xwb.setSheetName(, "模闆"); //給sheet重命名
//3. 擷取模闆中的樣式
Cell cell = null;
Row row = sheet.getRow(); //定位第二行
cell = row.getCell();
CellStyle style_B2 = cell.getCellStyle(); //擷取B2的樣式
cell = row.getCell();
CellStyle style_C2 = cell.getCellStyle(); //擷取C2的樣式
cell = row.getCell();
CellStyle style_D2 = cell.getCellStyle(); //擷取D2的樣式
//4.定位單元格,并設定值和樣式(後面的内容就和建立表的方法一樣了)
Row createRow = sheet.createRow();
cell = createRow.createCell();
cell.setCellValue("B2格式");
cell.setCellStyle(style_B2); //将B2的格式賦給此單元格
cell = createRow.createCell();
cell.setCellValue("C2格式");
cell.setCellStyle(style_C2); //将C2的格式賦給此單元格
cell = createRow.createCell();
cell.setCellValue("D2格式");
cell.setCellStyle(style_D2); //将D2的格式賦給此單元格
//5. 儲存
OutputStream os = new FileOutputStream("E:\\demoModel.xlsx"); //使用的XSSF,命名為.xlsx字尾
xwb.write(os);
os.close();
}
- 輸出:
Poi的簡單應用.md -
說明:
當模闆是有規律的填入資料時可以使用for循環擷取格式和存入資料
3. 總結
上面兩種模式隻是我自己了解的兩種簡單的用法,實際開發時向excel中輸出的資料一般就是從資料庫取出了
web開發時可以寫一個DownloadUtil類實作下載下傳另存功能