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(0, "第一个工作表");      //给第一个sheet重新命名

        //3. 定位要输出的单元格(先定位行,再定位列)
        Row row = sheet.createRow(3);    //定位第4行
        Cell cell = row.createCell(4);   //定位第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对象的时候有差异,其他用法都一样

Workbook hwb = new XSSFWorkbook();

对于格式这一块可以去查询其他更详细的资料,或者使用接下来更简便的方法–模板导出

2.2 方式二:使用模板

  模板导出,顾名思义就是使用已经在本地创建好的excel,然后往里面指定位置填充数据即可,格式也可以预先在excel中设置好,然后在代码中取出赋值,步骤和之前大同小异

  • 步骤:
    1. 获取模板文件
    2. 获取模板excel中的sheet
    3. 获取模板中的样式
    4. 定位单元格,并设置值和样式
    5. 保存
  • 模板
    这里写图片描述
  • 代码:
    @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(0);        //获取第一个sheet
        xwb.setSheetName(0, "模板");          //给sheet重命名

        //3. 获取模板中的样式
        Cell cell = null;
        Row row = sheet.getRow(1);      //定位第二行

        cell = row.getCell(1);
        CellStyle style_B2 = cell.getCellStyle();   //获取B2的样式

        cell = row.getCell(2);
        CellStyle style_C2 = cell.getCellStyle();   //获取C2的样式

        cell = row.getCell(3);
        CellStyle style_D2 = cell.getCellStyle();   //获取D2的样式

        //4.定位单元格,并设置值和样式(后面的内容就和创建表的方法一样了)
        Row createRow = sheet.createRow(3);

        cell = createRow.createCell(1);
        cell.setCellValue("B2格式");
        cell.setCellStyle(style_B2);        //将B2的格式赋给此单元格

        cell = createRow.createCell(2);
        cell.setCellValue("C2格式");
        cell.setCellStyle(style_C2);        //将C2的格式赋给此单元格

        cell = createRow.createCell(3);
        cell.setCellValue("D2格式");
        cell.setCellStyle(style_D2);        //将D2的格式赋给此单元格

        //5. 保存
        OutputStream os = new FileOutputStream("E:\\demoModel.xlsx");       //使用的XSSF,命名为.xlsx后缀
        xwb.write(os);

        os.close();
    }
  • 输出:
    这里写图片描述
  • 说明:
      当模板是有规律的填入数据时可以使用for循环获取格式和存入数据

3. 总结

  上面两种模式只是我自己理解的两种简单的用法,实际开发时向excel中输出的数据一般就是从数据库取出了
  web开发时可以写一个DownloadUtil类实现下载另存功能

猜你喜欢

转载自blog.csdn.net/ht_kasi/article/details/79434330