POI报表导出(一)入门

一. 简介

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

二. POI的应用场景

  • 数据报表生成
  • 数据备份
  • 数据批量上传
     

三. 环境搭建

1. 导入依赖

<dependencies>
    <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>
</dependencies>

2. POI结构说明

    HSSF提供读写Microsoft Excel XLS格式档案的功能。
    XSSF提供读写Microsoft Excel OOXML XLSX格式档案的功能。

    HWPF提供读写Microsoft Word DOC格式档案的功能。
    HSLF提供读写Microsoft PowerPoint格式档案的功能。
    HDGF提供读Microsoft Visio格式档案的功能。
    HPBF提供读Microsoft Publisher格式档案的功能。
    HSMF提供读Microsoft Outlook格式档案的功能。

3. 相关api

API名称 介绍
Workbook Excel的文档对象,针对不同的Excel类型分为:HSSFWorkbook(2003)和
XSSFWorkbool(2007)
Sheet Excel的表单
Row Excel的行
Cell Excel的格子单元
Font Excel字体
CellStyle 格子单元样式

四. 基本操作

  • 创建一个新的module
  • 导入依赖
  • 编写java代码

1.   创建Excel文件

        代码执行成功后,在D盘下生成了一个excel文件。

import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;

public class POITest01 {
    //测试创建excel文件
    public static void main(String[] args) throws Exception {
        //1. 创建workbook工作簿
        Workbook workbook = new XSSFWorkbook();
        //2. 创建表单Sheet
        Sheet sheet = workbook.createSheet("test");
        //3. 文件流
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\test.xlsx");
        //4. 写入文件
        workbook.write(fileOutputStream);
        workbook.close();
    }
}

2.  创建单元格

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;

public class POITest02 {
    //测试创建excel文件
    public static void main(String[] args) throws Exception {
        //1. 创建workbook工作簿
        Workbook workbook = new XSSFWorkbook();
        //2. 创建表单Sheet
        Sheet sheet = workbook.createSheet("test");
        //3. 创建行对象,从0开始
        Row row = sheet.createRow(3);
        //4. 创建单元格,从0开始
        Cell cell = row.createCell(0);
        //5. 单元格写入数据
        cell.setCellValue("POI报表导出");
        //6. 文件流
        FileOutputStream fos = new FileOutputStream("D:\\test.xlsx");
        //7. 写入文件
        workbook.write(fos);
        workbook.close();
    }
}

执行结果如下图所示:

       从0开始的第四行第一列出现了我们填入的数据。 

3.  绘制图形

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

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

public class POITest03 {
    //测试创建excel文件
    public static void main(String[] args) throws Exception {
        //1. 创建workbook工作簿
        Workbook workbook = new XSSFWorkbook();
        //2. 创建表单Sheet
        Sheet sheet = workbook.createSheet("test");
        //读取图片流
        FileInputStream fis = new FileInputStream("D:\\logo.jpg");
        byte[] bytes = IOUtils.toByteArray(fis);
        //读取图片到二进制数组
        fis.read(bytes);
        //向Excel添加一张图片,并返回该图片在Excel中的图片集合中的下标
        int pictureIdx = workbook.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG);
        //绘图工具类
        CreationHelper helper = workbook.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("D:\\test.xlsx");
        //7. 写入文件
        workbook.write(fos);
        workbook.close();
    }
}

打开excel文件后,图片就显示在文档的左上角了。

4.  加载Excel文件

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

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

public class POITest04 {
    //测试创建excel文件
    public static void main(String[] args) throws Exception {
        //1. 创建workbook工作簿
        Workbook workbook = new XSSFWorkbook("D:\\demo.xlsx");
        //2. 创建表单Sheet
        Sheet sheet = workbook.getSheetAt(0);

        //获取文件的行数
        int lastRowNum = sheet.getLastRowNum();

        Row row = null;
        Cell cell = null;

        //循环遍历所有的行
        for (int rowNum = 3; rowNum < sheet.getLastRowNum(); rowNum++) {
            row = sheet.getRow(rowNum);
            StringBuilder builder = new StringBuilder();
            for (int cellNum = 2; cellNum < sheet.getLastRowNum(); cellNum++) {
                cell = row.getCell(cellNum);
                builder.append(getValue(cell)).append("-");
            }
            System.out.println(builder.toString());
        }

        //6. 文件流
        FileOutputStream fos = new FileOutputStream("D:\\test.xlsx");
        //7. 写入文件
        workbook.write(fos);
        workbook.close();
    }

    //获取数据
    private static Object getValue(Cell cell) {
        Object value = null;
        switch (cell.getCellType()) {
            case STRING: //字符串类型
                value = cell.getStringCellValue();
                break;
            case BOOLEAN: //boolean类型
                value = cell.getBooleanCellValue();
                break;
            case NUMERIC: //数字类型(包含日期和普通数字)
                if (DateUtil.isCellDateFormatted(cell)) {
                    value = cell.getDateCellValue();
                } else {
                    value = cell.getNumericCellValue();
                }
                break;
            case FORMULA: //公式类型
                value = cell.getCellFormula();
                break;
            default:
                break;
        }
        return value;
    }
}

 输出结果:

猜你喜欢

转载自blog.csdn.net/qq_36662478/article/details/88140109
今日推荐