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 方式一:创建表
- 步骤:
- 新建一个excel对象
- 创建excel中的sheet
- 定位要输出的单元格(先定位行,再定位列)
- 向指定单元格输出数据
- 设置单元格样式
- 保存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();
}
}
输出结果:

说明:
HSSFWorkbook和XSSFWorkbook只是在创建Excel对象的时候有差异,其他用法都一样
对于格式这一块可以去查询其他更详细的资料,或者使用接下来更简便的方法–模板导出
2.2 方式二:使用模板
模板导出,顾名思义就是使用已经在本地创建好的excel,然后往里面指定位置填充数据即可,格式也可以预先在excel中设置好,然后在代码中取出赋值,步骤和之前大同小异
- 步骤:
- 获取模板文件
- 获取模板excel中的sheet
- 获取模板中的样式
- 定位单元格,并设置值和样式
- 保存
- 模板
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类实现下载另存功能