天天看點

Poi的簡單應用.md

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 方式一:建立表
  • 步驟:
    1. 建立一個excel對象
    2. 建立excel中的sheet
    3. 定位要輸出的單元格(先定位行,再定位列)
    4. 向指定單元格輸出資料
    5. 設定單元格樣式
    6. 儲存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();

    }
}
           

輸出結果:

Poi的簡單應用.md

說明:

  HSSFWorkbook和XSSFWorkbook隻是在建立Excel對象的時候有差異,其他用法都一樣

對于格式這一塊可以去查詢其他更詳細的資料,或者使用接下來更簡便的方法–模闆導出

2.2 方式二:使用模闆

  模闆導出,顧名思義就是使用已經在本地建立好的excel,然後往裡面指定位置填充資料即可,格式也可以預先在excel中設定好,然後在代碼中取出指派,步驟和之前大同小異

  • 步驟:
    1. 擷取模闆檔案
    2. 擷取模闆excel中的sheet
    3. 擷取模闆中的樣式
    4. 定位單元格,并設定值和樣式
    5. 儲存
  • 模闆
    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類實作下載下傳另存功能