1. 程式人生 > >java中poi 生成表格報副檔名無效

java中poi 生成表格報副檔名無效

一 :簡介

開發中經常會設計到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]);
        }
    }