報表輸出是數據庫應用常見需求。通用報表缺乏靈活性,用戶難以個性化編輯。Excel 作為 Windows 平台優秀電子表格工具,導出 Excel 格式可讓用戶利用其強大功能二次編輯,滿足特殊需求。Java 跨平台特性導致無法直接操作 Excel,Apache Jakarta POI 專案提供純 Java 解決方案,支持 MS Excel 97-2002 格式,已趨成熟,國內多家公司在 OA、Web 項目中應用。
https://jakarta.apache.org/site/downloads/downloads_poi.cgi → poi-bin-2.5.1-final-20040804.zip。poi-2.5.1-final-20040804.jar。classpath 或項目依賴。
| POI 對象 | 對應 Excel 概念 |
|---|---|
| HSSFWorkbook | 工作簿 |
| HSSFSheet | 工作表 |
| HSSFRow | 行 |
| HSSFCell | 單元格 |
主要包:org.apache.poi.hssf.usermodel,含樣式、格式、輔助操作類。
import org.apache.poi.hssf.usermodel.*;
import java.io.*;
public class CreateXL {
public static String xlsFile = "test.xls";
public static void main(String args[]) {
try {
// 創建工作簿、工作表
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet();
workbook.setSheetName(0, "firstSheet", HSSFWorkbook.ENCODING_UTF_16); // 支持中文
// 創建行、單元格,寫入內容
HSSFRow row = sheet.createRow((short) 0);
HSSFCell cell = row.createCell((short) 0);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setEncoding(HSSFCell.ENCODING_UTF_16); // 中文編碼
cell.setCellValue("測試成功");
// 寫入文件
FileOutputStream fOut = new FileOutputStream(xlsFile);
workbook.write(fOut);
fOut.flush(); fOut.close();
System.out.println("文件生成...");
// 讀取驗證
FileInputStream fIn = new FileInputStream(xlsFile);
HSSFWorkbook readWorkBook = new HSSFWorkbook(fIn);
HSSFSheet readSheet = readWorkBook.getSheet("firstSheet");
HSSFRow readRow = readSheet.getRow(0);
HSSFCell readCell = readRow.getCell((short) 0);
System.out.println("第一個單元格: " + readCell.getStringCellValue());
} catch (Exception e) {
System.out.println(e);
}
}
}
結合 JDBC,將 ResultSet 導出為 Excel 報表:
public static void resultSetToExcel(ResultSet rs, String xlsName, String sheetName) throws Exception {
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet();
workbook.setSheetName(0, sheetName, HSSFWorkbook.ENCODING_UTF_16);
// 寫入列名
HSSFRow row = sheet.createRow((short) 0);
ResultSetMetaData md = rs.getMetaData();
int nColumn = md.getColumnCount();
for (int i = 1; i <= nColumn; i++) {
HSSFCell cell = row.createCell((short) (i - 1));
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(md.getColumnLabel(i));
}
// 寫入數據行
int iRow = 1;
while (rs.next()) {
row = sheet.createRow((short) iRow);
for (int j = 1; j <= nColumn; j++) {
HSSFCell cell = row.createCell((short) (j - 1));
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(rs.getObject(j).toString());
}
iRow++;
}
FileOutputStream fOut = new FileOutputStream(xlsName);
workbook.write(fOut);
fOut.flush(); fOut.close();
JOptionPane.showMessageDialog(null, "導出數據成功!");
}
詳細請參考 POI 幫助文檔(解壓目錄 doc 文件夾)。
文中基於 POI 2.5.1(2004 年)。現代項目應使用 Apache POI 5.x+:
.xlsx (OOXML) 格式,突破 65536 行限制。poi (HSSF)、poi-ooxml (XSSF)、poi-ooxml-schemas。org.apache.poi:poi:5.2.3 / org.apache.poi:poi-ooxml:5.2.3。POI 功能強大,較好解決 Java 編程中的 Excel 報表問題,進一步滿足用戶靈活編輯需求。