java中poi 生成表格報副檔名無效
阿新 • • 發佈:2018-12-09
一 :簡介
開發中經常會設計到excel的處理,如匯出Excel,匯入Excel到資料庫中,操作Excel目前有兩個框架,一個是apache 的poi, 另一個是 Java Excel
-
Apache POI 簡介是用Java編寫的免費開源的跨平臺的 Java API,Apache POI提供API給Java程式對Microsoft Office(Excel、WORD、PowerPoint、Visio等)格式檔案讀和寫的功能。POI為“Poor Obfuscation Implementation”的首字母縮寫,意為“可憐的模糊實現”。
-
Java Excel是一開放原始碼專案,通過它Java開發人員可以讀取Excel檔案的內容、建立新的Excel檔案、更新已經存在的Excel檔案。jxl 由於其小巧 易用的特點, 逐漸已經取代了 POI-excel的地位, 成為了越來越多的java開發人員生成excel檔案的首選。
由於apache poi 在專案中用的比較多,本篇部落格只講解apache poi,不講jxl
二:Apache POI常用的類
- HSSF - 提供讀寫Microsoft Excel XLS格式檔案的功能。
- XSSF - 提供讀寫Microsoft Excel OOXML XLSX格式檔案的功能。
- HWPF - 提供讀寫Microsoft Word DOC97格式檔案的功能。
- XWPF - 提供讀寫Microsoft Word DOC2003格式檔案的功能。
- HSLF - 提供讀寫Microsoft PowerPoint格式檔案的功能。
- HDGF - 提供讀Microsoft Visio格式檔案的功能。
- HPBF - 提供讀Microsoft Publisher格式檔案的功能。
- HSMF - 提供讀Microsoft Outlook格式檔案的功能。
在開發中我們經常使用HSSF用來操作Excel處理表格資料,對於其它的不經常使用。
HSSF 是Horrible SpreadSheet Format的縮寫,通過HSSF,你可以用純Java程式碼來讀取、寫入、修改Excel檔案。HSSF 為讀取操作提供了兩類API:usermodel和eventusermodel,即“使用者模型”和“事件-使用者模型”。
常用的類和方法
- HSSFWorkbook :工作簿,代表一個excel的整個文件
- HSSFWorkbook(); // 建立一個新的工作簿
- HSSFWorkbook(InputStream inputStream); // 建立一個關聯輸入流的工作簿,可以將一個excel檔案封裝成工作簿
- HSSFSheet createSheet(String sheetname); 建立一個新的Sheet
- HSSFSheet getSheet(String sheetName); 通過名稱獲取Sheet
- HSSFSheet getSheetAt(int index); // 通過索引獲取Sheet,索引從0開始
- HSSFCellStyle createCellStyle(); 建立單元格樣式
- int getNumberOfSheets(); 獲取sheet的個數
- setActiveSheet(int index); 設定預設選中的工作表
- write();
- write(File newFile);
- write(OutputStream stream);
- HSSFSheet:工作表
- HSSFRow createRow(int rownum); 建立新行,需要指定行號,行號從0開始
- HSSFRow getRow(int index); 根據索引獲取指定的行
- int addMergedRegion(CellRangeAddress region); 合併單元格
CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol); 單元格範圍, 用於合併單元格,需要指定要合併的首行、最後一行、首列、最後一列。 - autoSizeColumn(int column); 自動調整列的寬度來適應內容
- getLastRowNum(); 獲取最後的行的索引,沒有行或者只有一行的時候返回0
- setColumnWidth(int columnIndex, int width); 設定某一列的寬度,width=字元個數 * 256,例如20個字元的寬度就是20 * 256
- HSSFRow :行
- HSSFCell createCell(int column); 建立新的單元格
- HSSFCell setCell(shot index);
- HSSFCell getCell(shot index);
- setRowStyle(HSSFCellStyle style); 設定行樣式
- short getLastCellNum(); 獲取最後的單元格號,如果單元格有第一個開始算,lastCellNum就是列的個數
- setHeightInPoints(float height); 設定行的高度
- HSSFCell:單元格
- setCellValue(String value); 設定單元格的值
- setCellType(); 設定單元格型別,如 字串、數字、布林等
- setCellStyle(); 設定單元格樣式
- String getStringCellValue(); 獲取單元格中的字串值
- setCellStyle(HSSFCellStyle style); 設定單元格樣式,例如字型、加粗、格式化
- setCellFormula(String formula); 設定計算公式,計算的結果作為單元格的值,也提供了異常常用的函式,如求和”sum(A1,C1)”、日期函式、字串相關函式、CountIf和SumIf函式、隨機數函式等
- HSSFCellStyle :單元格樣式
- setFont(Font font); 為單元格設定字型樣式
- setAlignment(HorizontalAlignment align); // 設定水平對齊方式
- setVerticalAlignment(VerticalAlignment align); // 設定垂直對齊方式
- setFillPattern(FillPatternType fp);
- setFillForegroundColor(short bg); 設定前景色
- setFillBackgroundColor(short bg); 設定背景顏色
- HSSFFont:字型,
- setColor(short color); // 設定字型顏色
- setBold(boolean bold); // 設定是否粗體
- setItalic(boolean italic); 設定傾斜
- setUnderline(byte underline); 設定下劃線
- HSSFName:名稱
- HSSFDataFormat :日期格式化
- HSSFHeader : Sheet的頭部
- HSSFFooter :Sheet的尾部
- HSSFDateUtil :日期工具
- HSSFPrintSetup :列印設定
- HSSFErrorConstants:錯誤資訊表
Excel中的工作簿、工作表、行、單元格中的關係:
一個Excel檔案對應於一個workbook(HSSFWorkbook),
一個workbook可以有多個sheet(HSSFSheet)組成,
一個sheet是由多個row(HSSFRow)組成,
一個row是由多個cell(HSSFCell)組成
二 問題及處理
兩種格式:xlsx對應XSSFWorkbook,xls對應HSSFWorkbook
Workbook wb = null;
if (isxlsx) {
wb = new XSSFWorkbook();
fileName += ".xlsx";
} else {
wb = new HSSFWorkbook();
fileName += ".xls";
}
如果生成表格報副檔名錯誤,一般就是使用時沒有注意到對應關係。
匯出表格,只有欄位標題,沒有內容(可以進行擴充,然後進行插入資料)
public static void exportExcel(HttpServletResponse response, boolean isxlsx, String fileName, String[] heads)
throws Exception {
Workbook wb = null;
if (isxlsx) {
wb = new XSSFWorkbook();
fileName += ".xlsx";
} else {
wb = new HSSFWorkbook();
fileName += ".xls";
}
try {
fileName = new String(fileName.getBytes("gb2312"), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
logger.error("string encode error", e);
}
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename=" + fileName);
Sheet sheet = wb.createSheet("sheet1");
fillTitle(sheet, heads);
try {
OutputStream os = response.getOutputStream();
Workbook wb2 = wb;
wb2.write(os);
os.flush();
os.close();
} catch (IOException e) {
logger.error("export error", e);
}
}
private static void fillTitle(Sheet sheet, String[] heads) {
//建立行
Row row = sheet.createRow(0);
for (int i = 0; i < heads.length; i++) {
//建立列
Cell cell = row.createCell(i);
//設定值
cell.setCellValue(heads[i]);
}
}