SpringBoot实现POI报表操作

简介: SpringBoot实现POI报表操作

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


目录
相关文章
|
4月前
|
Java BI API
SpringBoot + POI-TL:高效生成Word报表的技术盛宴
【8月更文挑战第22天】在日常的工作与学习中,文档处理特别是Word报表的自动生成,是许多项目中不可或缺的一环。传统的手工编辑Word文档不仅效率低下,还容易出错,特别是在需要批量生成包含动态数据的报告时,更是令人头疼不已。幸运的是,结合Spring Boot的简洁高效与POI-TL的强大功能,我们能够轻松实现Word报表的快速生成,既提升了工作效率,又保证了数据的准确性和报表的美观性。
499 0
|
6月前
|
Java 应用服务中间件 Maven
浅谈后端整合Springboot框架后操作基础配置
浅谈后端整合Springboot框架后操作基础配置
41 3
|
6月前
|
NoSQL Java 数据库
SpringBoot实用开发篇第三章(数据层解决方案操作)
SpringBoot实用开发篇第三章(数据层解决方案操作)
|
6月前
|
Java API Spring
集成EasyPoi(一个基于POI的Excel导入导出工具)到Spring Boot项目中
集成EasyPoi(一个基于POI的Excel导入导出工具)到Spring Boot项目中
579 1
|
6月前
|
Java 数据库连接 开发者
SpringBoot实用开发篇第一章(yml配置文件操作)
SpringBoot实用开发篇第一章(yml配置文件操作)
|
6月前
|
JSON Java 测试技术
SpringBoot实用开发篇第二章(测试操作)
SpringBoot实用开发篇第二章(测试操作)
|
7月前
|
NoSQL Java Redis
SpringBoot 操作 Redis
SpringBoot 操作 Redis
64 2
|
7月前
|
安全 Java API
SpringBoot 实现 elasticsearch 索引操作(RestHighLevelClient 的应用)
SpringBoot 实现 elasticsearch 索引操作(RestHighLevelClient 的应用)
105 1
|
7月前
|
SQL Java 数据库连接
Springboot框架整合Spring JDBC操作数据
JDBC是Java数据库连接API,用于执行SQL并访问多种关系数据库。它包括一系列Java类和接口,用于建立数据库连接、创建数据库操作对象、定义SQL语句、执行操作并处理结果集。直接使用JDBC涉及七个步骤,包括加载驱动、建立连接、创建对象、定义SQL、执行操作、处理结果和关闭资源。Spring Boot的`spring-boot-starter-jdbc`简化了这些步骤,提供了一个在Spring生态中更便捷使用JDBC的封装。集成Spring JDBC需要添加相关依赖,配置数据库连接信息,并通过JdbcTemplate进行数据库操作,如插入、更新、删除和查询。
91 0
|
7月前
|
SQL Java 数据库连接
Springboot框架整合Spring Data JPA操作数据
Spring Data JPA是Spring基于ORM和JPA规范封装的框架,简化了数据库操作,提供增删改查等接口,并可通过方法名自动生成查询。集成到Spring Boot需添加相关依赖并配置数据库连接和JPA设置。基础用法包括定义实体类和Repository接口,通过Repository接口可直接进行数据操作。此外,JPA支持关键字查询,如通过`findByAuthor`自动转换为SQL的`WHERE author=?`查询。
90 0