POI报表应用入门

217 阅读3分钟

1 POI报表的概述

1.1 需求说明

在应用开发中,Excel报表使用中常见的报表需求。Excel报表开发一般分为两种形式:

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

1.2 Excel的两种形式

Excel 2003Excel 2007
后缀xlsxlsx
结构二进制结构,其核心结构是复合文档类型的结构XML类型结构
单sheet数据量行:65535 列:256行:1048576 列:16384
特点存储容量有限基于xml压缩,占用空间小,操作效率高

Excel2003 是一个特有的二进制格式,其核心结构是复合文档类型的结构,存储数据量较小; Excel2007 的核心结构是XML类型的结构,采用的是基于XML的压缩方式,使其占用的空间更小,操作效率更高;

1.3 常见Excel操作工具

Java 中常见的用来操作 Excel 的方式一般有2种:JXL和 POl。 JXL 只能对 Excel 进行操作,属于比较老的框架,它只支持到 Excel 95-2000 的版本。现在已经停止更新和维护; POl 是 apache 的项目,可对微软的 Word , Excel , PPT 进行操作,包括 office2003 和 2007,Excel 2003 和 2007。poi 现在 直有更新。所以现在主流使用POI。

1.4 POI的概述

Apache POl是Apache软件基金会的开源项目,由Java编写的免费开源的跨平台的Java API,Apache POI提供API给lava语言操作Microsoft Office的功能。

1.5 POl的应用场景

  1. 数据报表生成
  2. 数据备份
  3. 数据批量上传

2 POI 的入门操作

2.1 搭建环境

<dependencies>
    <!--核心坐标-->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>5.2.3</version>
    </dependency>
    <!--对2007+版本支持坐标-->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml-schemas</artifactId>
        <version>4.1.2</version>
    </dependency>
</dependencies>

2.2 POI结构说明

  1. HSSF提供读写Microsoft ExcelXLS格式档案的功能;
  2. XSSF提供读写Microsoft ExcelOOXMLXLSX格式档案的功能;
  3. HWPF提供读写Microsoft Word DOC格式档案的功能;
  4. HSLF提供读写Microsoft PowerPoint格式档案的功能;
  5. HDGF提供读Microsoft Visio格式档案的功能;
  6. HPBF提供读Microsoft Publisher格式档案的功能;
  7. HSMF提供读Microsoft Outlook格式档案的功能;

2.3 示例

2.3.1 使用 POI 创建 Excel 并创建单元格然后设置数据示例

/**
 * 使用 POI 创建 Excel 并创建单元格然后设置数据示例
 */
public class POIExcelExample2 {
    public static void main(String[] args) throws IOException {
        // 创建一个工作簿
        Workbook workbook = new XSSFWorkbook();
        // 创建一个工作表
        Sheet sheet = workbook.createSheet("sheet1");
        // 创建一个行和单元格 从0开始 第一行 第一列 A1,写入内容为 hello world
        sheet.createRow(0).createCell(0).setCellValue("hello world");
        // 文件流
        FileOutputStream fileOutputStream = new FileOutputStream("D:\test.xlsx");
        // 写入文件
        workbook.write(fileOutputStream);
        fileOutputStream.close();
    }
}

2.3.2 使用 POI 读取 Excel 并解析

/**
 * 使用 POI 读取 Excel 并解析
 */
public class POIExcelExample2 {
    public static void main(String[] args) throws IOException {
        // 创建一个工作簿,使用 try-with-resources 语句自动关闭资源
        try (Workbook workbook = new XSSFWorkbook("D:\test.xlsx")) {
            // 获取一个工作表
            Sheet sheet = workbook.getSheetAt(0);
            // 获取Sheat中的每一行和每一个单元格
            for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
                Row row = sheet.getRow(rowNum);
                // 使用 StringBuilder 代替 StringBuffer,提高性能
                StringBuilder stringBuilder = new StringBuilder();
                for (int cellNum = 0; cellNum < row.getLastCellNum(); cellNum++) {
                    Cell cell = row.getCell(cellNum);
                    Object callValue = getCallValue(cell);
                    stringBuilder.append(callValue).append(" ");
                }
                System.out.println(stringBuilder.toString());
            }
        }
    }
​
    /**
     * 根据单元格的类型获取单元格的值
     * @param cell 单元格对象
     * @return 单元格的值,可能为 String, Double, Boolean 或 String 类型
     */
    public static Object getCallValue(Cell cell) {
        Object value = null;
        switch (cell.getCellType()) {
            case STRING:
                value = cell.getStringCellValue();
                break;
            case NUMERIC:
                value = cell.getNumericCellValue();
                break;
            case BOOLEAN:
                value = cell.getBooleanCellValue();
                break;
            case FORMULA:
                value = cell.getCellFormula();
                break;
            default:
                break;
        }
        return value;
    }
}