Apache POI报表统计

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

导入Maven坐标:

xml 复制代码
	<dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>5.1.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>5.1.0</version>
    </dependency>

入门案例之写操作

java 复制代码
package PoiExcel;

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.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class POITest {
    public static void write() throws IOException {
        //在内存中创建一个Excel文件
        XSSFWorkbook excel = new XSSFWorkbook();
        //创建sheet
        XSSFSheet sheet = excel.createSheet("info");
        //是从0开始计数的
        XSSFRow row = sheet.createRow(1);
        row.createCell(1).setCellValue("姓名");
        row.createCell(2).setCellValue("年龄");

        row = sheet.createRow(2);
        row.createCell(1).setCellValue("鹏翔");
        row.createCell(2).setCellValue("18");
        //利用文件输出流将内存中的Excel写入磁盘
        FileOutputStream fileOutputStream = new FileOutputStream(new File("D:/results.xlsx"));
        excel.write(fileOutputStream);
        //关闭资源
        fileOutputStream.close();
        excel.close();


    }
    public static void main(String[] args) throws IOException {

        write();
    }
}

入门案例之Excel读取:

java 复制代码
public static void read() throws IOException {
        FileInputStream fileInputStream = new FileInputStream(new File("D:/results.xlsx"));
        //通过输入流传入读取的excel文件
        XSSFWorkbook excel= new XSSFWorkbook(fileInputStream);
        XSSFSheet sheet = excel.getSheet("info");
        int lastRowNum = sheet.getLastRowNum();
        for (int  i= 1;  i<= lastRowNum; i++) {
            XSSFRow row = sheet.getRow(i);
            String cellValue1 = row.getCell(2).getStringCellValue();
            String cellValue2 = row.getCell(1).getStringCellValue();
            System.out.println(cellValue2 + cellValue1);
        }
        fileInputStream.close();
        excel.close();
    }

了解了入门案例后,我们看看如何实现导出报表,首先我们的报表的格式要固定且统一

我们将这个设计好的模板文件读取出来,然后将数据库中查到的信息查到固定的位置,最后下载下来即可

java 复制代码
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();
        }
    }
相关推荐
pengles8 小时前
使用Apache POI操作Word文档:从入门到实战
word·apache
想躺在地上晒成地瓜干8 小时前
树莓派超全系列教程文档--(57)如何设置 Apache web 服务器
服务器·apache·树莓派·raspberrypi·树莓派教程
时序数据说20 小时前
时序数据库Apache IoTDB核心技术深度解析
大数据·数据库·开源·apache·时序数据库·iotdb
SlowFeather20 小时前
Apache 反向代理Unity服务器
服务器·unity·apache
蚂蚁数据AntData20 小时前
品牌形象全面升级|Apache Fory:破界新生,开启高性能序列化新纪元
架构·开源·apache
程序猿小D2 天前
第25节 Node.js 断言测试
后端·node.js·log4j·编辑器·vim·apache·restful
RR13353 天前
图标统计页面的设计与控件 Apache echarts
前端·apache·echarts
tcoding4 天前
《基于Apache Flink的流处理》笔记
笔记·flink·apache
ALLSectorSorft5 天前
上门服务小程序会员系统框架设计
小程序·apache
杨过姑父5 天前
部署开源版禅道,修改apache端口无效解决
bug·apache·软件工程·issue