Apache POI 导出Excel报表

大家好我是苏麟 , 今天聊聊Apache POI .

Apache POI

介绍

Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。 一般情况下,POI 都是用于操作 Excel 文件。

官网 : Apache POI - the Java API for Microsoft Documents

Apache POI 的应用场景:

入门案例

Apache POI既可以将数据写入Excel文件,也可以读取Excel文件中的数据。

Apache POI的maven坐标:

引入依赖

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.16</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.16</version>
</dependency>
将数据写入Excel文件
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class POITest {

    /**
     * 基于POI向Excel文件写入数据
     *
     * @throws Exception
     */
    public static void write() throws Exception {
        //在内存中创建一个Excel文件对象
        XSSFWorkbook excel = new XSSFWorkbook();
        //创建Sheet页
        XSSFSheet sheet = excel.createSheet("itcast");

        //在Sheet页中创建行,0表示第1行
        XSSFRow row1 = sheet.createRow(0);
        //创建单元格并在单元格中设置值,单元格编号也是从0开始,1表示第2个单元格
        row1.createCell(1).setCellValue("name");
        row1.createCell(2).setCellValue("city");

        XSSFRow row2 = sheet.createRow(1);
        row2.createCell(1).setCellValue("zhangsan");
        row2.createCell(2).setCellValue("beijing");

        XSSFRow row3 = sheet.createRow(2);
        row3.createCell(1).setCellValue("lisi");
        row3.createCell(2).setCellValue("sahnghai");

        XSSFRow row4 = sheet.createRow(3);
        row4.createCell(1).setCellValue("yangke");
        row4.createCell(2).setCellValue("sichuan");

        FileOutputStream out = new FileOutputStream(new File("T:\\sky-take-out\\sky-server\\src\\main\\java\\com\\sky\\poi\\test\\itcast.xlsx"));
        //通过输出流将内存中的Excel文件写入到磁盘上
        excel.write(out);

        //关闭资源
        out.flush();
        out.close();
        excel.close();
    }


    public static void main(String[] args) throws Exception {
        write();
    }
}

下面绿色的就是页的名

实现效果

读取Excel文件中的数据

Excel中数据

代码实现

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class POITest {
    /**
     * 基于POI读取Excel文件
     * @throws Exception
     */
    public static void read() throws Exception{
        FileInputStream in = new FileInputStream(new File("T:\\sky-take-out\\sky-server\\src\\main\\java\\com\\sky\\poi\\test\\itcast.xlsx"));
        //通过输入流读取指定的Excel文件
        XSSFWorkbook excel = new XSSFWorkbook(in);
        //获取Excel文件的第1个Sheet页
        XSSFSheet sheet = excel.getSheetAt(0);

        //获取Sheet页中的最后一行的行号
        int lastRowNum = sheet.getLastRowNum();

        for (int i = 0; i <= lastRowNum; i++) {
            //获取Sheet页中的行
            XSSFRow titleRow = sheet.getRow(i);
            //获取行的第2个单元格
            XSSFCell cell1 = titleRow.getCell(1);
            //获取单元格中的文本内容
            String cellValue1 = cell1.getStringCellValue();
            //获取行的第3个单元格
            XSSFCell cell2 = titleRow.getCell(2);
            //获取单元格中的文本内容
            String cellValue2 = cell2.getStringCellValue();

            System.out.println(cellValue1 + " " +cellValue2);
        }

        //关闭资源
        in.close();
        excel.close();
    }

    public static void main(String[] args) throws Exception {
        read();
    }
}

 实现效果


项目中实战

Excel模板

业务规则:

  • 导出Excel形式的报表文件

接口设计

注意:

  • 当前接口没有返回数据,因为报表导出功能本质上是文件下载,服务端会通过输出流将Excel文件下载到客户端浏览器

代码开发

Controller层

根据接口定义,在ReportController中创建export方法:

	/**
     * 导出运营数据报表
     * @param response
     */
    @GetMapping("/export")
    @ApiOperation("导出运营数据报表")
    public void export(HttpServletResponse response){
        reportService.exportBusinessData(response);
    }

Service层接口

在ReportService接口中声明导出运营数据报表的方法:

	/**
     * 导出近30天的运营数据报表
     * @param response
     **/
    void exportBusinessData(HttpServletResponse response);

Service层实现类

在ReportServiceImpl实现类中实现导出运营数据报表的方法:

提前将资料中的运营数据报表模板.xlsx拷贝到项目的resources/template目录中

    /**导出近30天的运营数据报表
     * @param response
     **/
    public void exportBusinessData(HttpServletResponse response) {
        LocalDate begin = LocalDate.now().minusDays(30);
        LocalDate end = LocalDate.now().minusDays(1);
        //查询概览运营数据,提供给Excel模板文件
        BusinessDataVO businessData = workspaceService.getBusinessData(LocalDateTime.of(begin,LocalTime.MIN), LocalDateTime.of(end, LocalTime.MAX));
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx");
        try {
            //基于提供好的模板文件创建一个新的Excel表格对象
            XSSFWorkbook excel = new XSSFWorkbook(inputStream);
            //获得Excel文件中的一个Sheet页
            XSSFSheet sheet = excel.getSheet("Sheet1");

            sheet.getRow(1).getCell(1).setCellValue(begin + "至" + end);
            //获得第4行
            XSSFRow row = sheet.getRow(3);
            //获取单元格
            row.getCell(2).setCellValue(businessData.getTurnover());
            row.getCell(4).setCellValue(businessData.getOrderCompletionRate());
            row.getCell(6).setCellValue(businessData.getNewUsers());
            row = sheet.getRow(4);
            row.getCell(2).setCellValue(businessData.getValidOrderCount());
            row.getCell(4).setCellValue(businessData.getUnitPrice());
            for (int i = 0; i < 30; i++) {
                LocalDate date = begin.plusDays(i);
               //准备明细数据
                businessData = workspaceService.getBusinessData(LocalDateTime.of(date,LocalTime.MIN), LocalDateTime.of(date, LocalTime.MAX));
                row = sheet.getRow(7 + i);
                row.getCell(1).setCellValue(date.toString());
                row.getCell(2).setCellValue(businessData.getTurnover());
                row.getCell(3).setCellValue(businessData.getValidOrderCount());
                row.getCell(4).setCellValue(businessData.getOrderCompletionRate());
                row.getCell(5).setCellValue(businessData.getUnitPrice());
                row.getCell(6).setCellValue(businessData.getNewUsers());
            }
            //通过输出流将文件下载到客户端浏览器中
            ServletOutputStream out = response.getOutputStream();
            excel.write(out);
            //关闭资源
            out.flush();
            out.close();
            excel.close();

        }catch (IOException e){
            e.printStackTrace();
        }
    }

导出效果

这期就到这里 , 下期见!

相关推荐

  1. 苍穹外卖--导出运营数据Excel报表

    2024-01-18 13:06:01       38 阅读
  2. Excel VBA ——从MySQL数据库中导出一个报表-笔记

    2024-01-18 13:06:01       37 阅读
  3. excel导入导出

    2024-01-18 13:06:01       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-18 13:06:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-18 13:06:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-18 13:06:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-18 13:06:01       20 阅读

热门阅读

  1. python list.sort方法和内置函数sorted

    2024-01-18 13:06:01       34 阅读
  2. CTF - Web 干货

    2024-01-18 13:06:01       36 阅读
  3. jquery批量执行任务实时返回状态

    2024-01-18 13:06:01       37 阅读
  4. 006 Golang-channel-practice 并发打印字符串

    2024-01-18 13:06:01       34 阅读
  5. 【Android】ObjectBox Duplicate Class 错误分析

    2024-01-18 13:06:01       35 阅读
  6. WPF中Image控件Source的多种指定方式

    2024-01-18 13:06:01       31 阅读
  7. PHP反序列化漏洞-魔术方法绕过

    2024-01-18 13:06:01       38 阅读