POI报表入门

在mymes管理系统中,人员管理,订单等操作需要报表的导入导出等逻辑。需求看是复杂,实际上就是对数据库表的基本操作,本文介绍Excel的导出,下次介绍数据的导入

POI报表的概述

需求数码

在企业应用开发中,Excel报表是一种最常见的报表需求。Excel报表开发一般有两种方式:

  • 为了方便操作,基于Excel的报表批量的上传数据
  • 通过Java代码生成Excel报表

Excel两种形式

目前Excel存在两个版本Excel2003和Excel2007以上的版本,两者之间区别:

SpringBoot实现POI报表操作

常见的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

公众号

SpringBoot实现POI报表操作

更多相关文章

  1. Java 8 Lambda 表达式和流操作如何让你的代码变慢 5 倍
  2. Java8 Lambda 表达式和流操作如何让你的代码变慢 5 倍
  3. Scala 与 Java 的交互操作
  4. 怎样用 JavaScript 操作 Cookie[每日前端夜话0xC4]
  5. jQuery的DOM操作实例(3)——创建节点&&编写一个弹窗
  6. jQuery编程基础精华02(属性、表单过滤器,元素的each,表单选择器,子元
  7. jQuery权威指南(第2版) 学习一 jQuery操作DOM
  8. 用replaceWith()对DOM结点操作时应注意的问题
  9. 如何在用户选择操作后获取当前日期和时间

随机推荐

  1. android开发学习大纲
  2. Android经典的大牛博客推荐
  3. android:使用Gon解析解析json
  4. Android(安卓)java.io.IOException异常情
  5. android初次学习(android studio安装及注
  6. Android:onTouch()和onTouchEvent()的区
  7. Android中的sqlite Cursor操作详解
  8. Android图形系统分析与移植 -- 三、内核
  9. Android多媒体播放器源码解析(stagefrigh
  10. android几种布局