POI报表入门
在mymes管理系统中,人员管理,订单等操作需要报表的导入导出等逻辑。需求看是复杂,实际上就是对数据库表的基本操作,本文介绍Excel的导出,下次介绍数据的导入
POI报表的概述
需求分析
在企业应用开发中,Excel报表是一种最常见的报表需求。Excel报表开发一般有两种方式:
- 为了方便操作,基于Excel的报表批量的上传数据
- 通过Java代码生成Excel报表
Excel两种形式
目前Excel存在两个版本Excel2003和Excel2007以上的版本,两者之间区别:
Excel2003 |
Excel2007 | |
后缀 | xls | xlsx |
结构 | 二进制,核心结构是复合文档类型结构 | xml结构类型 |
单Sheet数据类型 | 行:65535,列:256 | 行:1048579;列 16384 |
特点 | 存储容量有限 | 基于XML压缩,占用空间小,操作效率高 |
常见的Excel操作工具:
Java中常见的EXCEL操作方式有两种:jxl和poi。
JXL只能对EXCEL进行操作,构架较老,只支持Excel95-2000版本,现在以及停止更新维护
POI是apache项目,可以对微软Word,EXCEL,PPT进行操作,,包括office2003和2007,poi一直在更新,所有比较主流
POI入门操作
POI环境搭建
<!--POI Excel--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>4.0.1</version> </dependency>
POI结构说明
HSSF提供读写 Excel的xls格式文档
XSSF提供读写 Excel的XLSX格式文档
HWPF提供读写 Word的doc格式文档
HSLF提供读写 Word的PPT格式文档
HDGF提供读Visio格式文档
HSMF提供读Outlook格式文档
HPBF提供读Publisher格式文档
API简介
WorkBook:EXCEL文档对象,针对不同的Excel类型分为:HSSFWorkbook(2003)和XSSFWorkbook(2007)
Sheet: Excel表单
Row:Excel行
Cell:Excel的单元格子
Font:Excel字体
CellStyle:单元格样式
基本操作
创建Excel
public class PoiTest01 { //测试创建excel文件 public static void main(String[] args) throws Exception { //1.创建workbook工作簿 Workbook wb = new XSSFWorkbook(); //2.创建表单Sheet Sheet sheet = wb.createSheet("test"); //3.文件流 FileOutputStream fos = new FileOutputStream("E:\\test.xlsx"); //4.写入文件 wb.write(fos); fos.close(); } }
创建单元格
//测试创建单元格 public static void main(String[] args) throws Exception { //1.创建workbook工作簿 Workbook wb = new XSSFWorkbook(); //2.创建表单Sheet Sheet sheet = wb.createSheet("test"); //3.创建行对象,从0开始 Row row = sheet.createRow(3); //4.创建单元格,从0开始 Cell cell = row.createCell(0); //5.单元格写入数据 cell.setCellValue("传智播客"); //6.文件流 FileOutputStream fos = new FileOutputStream("E:\\test.xlsx"); //7.写入文件 wb.write(fos); fos.close(); }
格式设置
//创建单元格样式对象 CellStyle cellStyle = wb.createCellStyle(); //设置边框 cellStyle.setBorderBottom(BorderStyle.DASH_DOT);//下边框 cellStyle.setBorderTop(BorderStyle.HAIR);//上边框 //设置字体 Font font = wb.createFont();//创建字体对象 font.setFontName("华文行楷");//设置字体 font.setFontHeightInPoints((short)28);//设置字号 cellStyle.setFont(font); //设置宽高 sheet.setColumnWidth(0, 31 * 256);//设置第一列的宽度是31个字符宽度 row.setHeightInPoints(50);//设置行的高度是50个点 //设置居中显示 cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中 cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 //设置单元格样式 cell.setCellStyle(cellStyle); //合并单元格 CellRangeAddress region =new CellRangeAddress(0, 3, 0, 2); sheet.addMergedRegion(region);
插入图片
//绘制图形 public static void main(String[] args) throws Exception { //1.创建workbook工作簿 Workbook wb = new XSSFWorkbook(); //2.创建表单Sheet Sheet sheet = wb.createSheet("test"); //读取图片流 FileInputStream stream=new FileInputStream("e:\\logo.jpg"); byte[] bytes= IOUtils.toByteArray(stream); //读取图片到二进制数组 stream.read(bytes); //向Excel添加一张图片,并返回该图片在Excel中的图片集合中的下标 int pictureIdx = wb.addPicture(bytes,Workbook.PICTURE_TYPE_JPEG); //绘图工具类 CreationHelper helper = wb.getCreationHelper(); //创建一个绘图对象 Drawing<?> patriarch = sheet.createDrawingPatriarch(); //创建锚点,设置图片坐标 ClientAnchor anchor = helper.createClientAnchor(); anchor.setCol1(0);//从0开始 anchor.setRow1(0);//从0开始 //创建图片 Picture picture = patriarch.createPicture(anchor, pictureIdx); picture.resize(); //6.文件流 FileOutputStream fos = new FileOutputStream("E:\\test.xlsx"); //7.写入文件 wb.write(fos); fos.close(); }
POI报表导出
无论是什么需求只有有报表的导出就需要一下步骤:
- 构造Excel表格数据
- 创建工作簿
- 创建sheet对象
- 创建Row对象
- 创建Cell对象
- 数据填充,设置样式
- 下载 以用户数据为示例,没有度过我文章的可以关注公众号,读取之前文章
创建FileUtil文件操作通用类
package com.cn.greemes.common.util; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.poi.excel.BigExcelWriter; import cn.hutool.poi.excel.ExcelUtil; import org.apache.poi.xssf.streaming.SXSSFSheet; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.util.List; import java.util.Map; /** * 文件操作 */ public class FileUtil { public static final String SYS_TEM_DIR =System.getProperty("java.io.tmpdir")+ File.separator; public static void downloadExcel(List<Map<String, Object>> list, HttpServletResponse response) throws IOException { String tempPath = SYS_TEM_DIR + IdUtil.fastSimpleUUID() + ".xlsx"; File file = new File(tempPath); BigExcelWriter writer = ExcelUtil.getBigWriter(file); // 一次性写出内容,使用默认样式,强制输出标题 writer.write(list, true); SXSSFSheet sheet = (SXSSFSheet)writer.getSheet(); //上面需要强转SXSSFSheet 不然没有trackAllColumnsForAutoSizing方法 sheet.trackAllColumnsForAutoSizing(); //列宽自适应 writer.autoSizeColumnAll(); //response为HttpServletResponse对象 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码 response.setHeader("Content-Disposition", "attachment;filename=file.xlsx"); ServletOutputStream out = response.getOutputStream(); // 终止后删除临时文件 file.deleteOnExit(); writer.flush(out, true); //此处记得关闭输出Servlet流 IoUtil.close(out); } }
在controller进行配置
@ApiOperation("导出用户数据") @RequestMapping(value = "/export", method = RequestMethod.GET) @ResponseBody public void export(HttpServletResponse response, @RequestParam(value = "keyword", required = false) String keyword, @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize, @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum) throws UnsupportedEncodingException, IOException { Page<MesAdmin> adminList = adminService.list(keyword, pageSize, pageNum); List<Map<String,Object>> list = new ArrayList(); for(int i=0;i<149;i++) { for (MesAdmin umsAdmin : adminList.getRecords()) { Map<String, Object> map = new LinkedHashMap<>(6); map.put("姓名", umsAdmin.getUsername()); map.put("邮箱", umsAdmin.getEmail()); map.put("昵称", umsAdmin.getNickName()); map.put("备注信息", umsAdmin.getNote()); map.put("创建时间", umsAdmin.getCreateTime()); map.put("最后登录时间", umsAdmin.getLoginTime()); list.add(map); } } fileUtil.downloadExcel(list,response); }
结束语:
此次介绍的是Excel的导出,下次介绍Excel的导入,这是我在工作时的一点总结,有什么不对的请多直接,共同进步,谢谢!
Github地址:
github地址:https://github.com/bangbangzhou/greemes/tree/master