Apache POI练习代码

目录

    • pom.xml
    • [ExcelWriteTest .java](#ExcelWriteTest .java)

pom.xml

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.smy</groupId>
    <artifactId>smy-poi</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--导入依赖-->
    <dependencies>
        <!-- Java 万物皆对象 -->
        <!--xls(03版本)-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>

        <!--xlsx(07版本)-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.9</version>
        </dependency>

        <!--日期格式化工具-->
        <!-- 比Java官方的utils.date好用 -->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.10.1</version>
        </dependency>

        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>


</project>

ExcelWriteTest .java

java 复制代码
package com.smy;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.joda.time.DateTime;
import org.junit.jupiter.api.Test;

import java.io.FileOutputStream;
import java.io.IOException;

/**
 * Description:POI写测试
 * Author:smy
 * Date: 2024/12/17 17:19
 */
public class ExcelWriteTest {
    //copy absolute path 后不要忘记最后要加双斜杠,否则路径不对
    String PATH = "D:\\practise\\PoiExcelTestSuite\\smy-poi\\";

    @Test
    public void testWrite03() throws IOException {
        //1、创建一个工作簿
        Workbook workbook = new HSSFWorkbook();
        //2、创建一个工作表(工作簿中包含工作表,通过工作簿来创建工作表)
        Sheet sheet = workbook.createSheet("sheetTest1");//默认为缺省值,可以创建名称
        //3、创建一个行
        Row row1 = sheet.createRow(0);
        //4、创建一个单元格(1,1)
        Cell cell11 = row1.createCell(0);
        cell11.setCellValue("smy111");
        //(1,2)
        Cell cell12 = row1.createCell(1);
        //bool类型
        cell12.setCellValue(true);

        //第二行
        Row row2 = sheet.createRow(1);
        //(2,1)
        Cell cell21 = row2.createCell(0);
        cell21.setCellValue("统计时间");
        //(2,2)
        Cell cell22 = row2.createCell(1);
        String time = new DateTime().toString("yyyy-MM-dd HH:mm:ss");
        cell22.setCellValue(time);

        //生成一张表(本质是IO操作,IO流)  03 版本使用xls结尾
        FileOutputStream fileOutputStream = new FileOutputStream(PATH + "观众统计表03.xls");

        //输出
        workbook.write(fileOutputStream);
        //关闭流
        fileOutputStream.close();

        System.out.println("观众统计表03 生成完毕!");
    }

    @Test
    public void testWrite07() throws IOException {
        //1、创建一个工作簿 07版本,与03仅对象不同,面向接口编程的好处,对象变了,接口不用变,代码不用改
        //!注意对象的区别以及文件后缀!
        Workbook workbook = new XSSFWorkbook();
        //2、创建一个工作表(工作簿中包含工作表,通过工作簿来创建工作表)
        Sheet sheet = workbook.createSheet("sheetTest1");//默认为缺省值,可以创建名称
        //3、创建一个行
        Row row1 = sheet.createRow(0);
        //4、创建一个单元格(1,1)
        Cell cell11 = row1.createCell(0);
        cell11.setCellValue("第一行第一个单元格值为smy111");
        //(1,2)
        Cell cell12 = row1.createCell(1);
        cell12.setCellValue("第一行第二个单元格值为smy222");
        //(1,5)
        Cell cell15 = row1.createCell(4);
        cell15.setCellValue("测试布尔类型");


        //第二行
        Row row2 = sheet.createRow(1);
        //(2,1)
        Cell cell21 = row2.createCell(0);
        cell21.setCellValue("统计时间");
        //(2,2)
        Cell cell22 = row2.createCell(1);
        String time = new DateTime().toString("yyyy-MM-dd HH:mm:ss");
        cell22.setCellValue(time);

        //(2,5)
        Cell cell25 = row2.createCell(4);
        cell25.setCellType(XSSFCell.CELL_TYPE_BOOLEAN);
        cell25.setCellValue(true);

        //生成一张表(本质是IO操作,IO流)  07 版本使用xlsx结尾
        FileOutputStream fileOutputStream = new FileOutputStream(PATH + "观众统计表07.xlsx");

        //输出
        workbook.write(fileOutputStream);
        //关闭流
        fileOutputStream.close();

        System.out.println("观众统计表07 生成完毕!");
    }

    @Test
    public void testWrite03BigData() throws IOException {
        //记录时间差
        long beginTime = System.currentTimeMillis();
        System.out.println("开始时间:" + beginTime);

        //创建一个工作簿
        Workbook workbook = new HSSFWorkbook();

        //创建一个工作表
        Sheet sheet = workbook.createSheet("smy测试表1");

        //循环创建行(03版本 行数范围:0~65535)
        //缺点:最多只能处理65536行,否则会抛出异常:java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0..65535)
        for (int rowNum = 0; rowNum < 65536; rowNum++){
            Row row = sheet.createRow(rowNum);
            //每一行创建十个单元格并赋值
            for(int cellNum = 0; cellNum < 10; cellNum++){
                Cell cell = row.createCell(cellNum);
                cell.setCellValue(cellNum);
            }
        }
        System.out.println("over");

        //输出流
        FileOutputStream fileOutputStream = new FileOutputStream(PATH + "testWrite03BigData.xls");
        workbook.write(fileOutputStream);
        //关闭流
        fileOutputStream.close();

        long endTime = System.currentTimeMillis();
        System.out.println("结束时间:" + endTime);
        //可能有小数,所以转成double类型,除以一千以秒形式展示
        System.out.println("生成excel表所需要的时间:" + (double)(endTime - beginTime)/1000);
    }


    //耗时较长!优化:考虑使用缓存---->XSSF---->SXSSF
    @Test
    public void testWrite07BigData() throws IOException {
        //记录时间差
        long beginTime = System.currentTimeMillis();
        System.out.println("开始时间:" + beginTime);

        //创建一个工作簿
        Workbook workbook = new XSSFWorkbook();

        //创建一个工作表
        Sheet sheet = workbook.createSheet("smy测试表1");

        //循环创建行(07版本 行数不限,但是同样的65565耗时比03版本的长很多)
        for (int rowNum = 0; rowNum < 100000; rowNum++){
            Row row = sheet.createRow(rowNum);
            //每一行创建十个单元格并赋值
            for(int cellNum = 0; cellNum < 10; cellNum++){
                Cell cell = row.createCell(cellNum);
                cell.setCellValue(cellNum);
            }
        }
        System.out.println("over");

        //输出流
        FileOutputStream fileOutputStream = new FileOutputStream(PATH + "testWrite07BigData.xlsx");
        workbook.write(fileOutputStream);
        //关闭流
        fileOutputStream.close();

        long endTime = System.currentTimeMillis();
        System.out.println("结束时间:" + endTime);
        //可能有小数,所以转成double类型,除以一千以秒形式展示
        System.out.println("生成excel表所需要的时间:" + (double)(endTime - beginTime)/1000);


        //问:POI能否加速?     SXSSF
    }


    //使用缓存来加快速度
    @Test
    public void testWrite07BigDataS() throws IOException {
        //记录时间差
        long beginTime = System.currentTimeMillis();
        System.out.println("开始时间:" + beginTime);

        //创建一个工作簿,S:super
        Workbook workbook = new SXSSFWorkbook();

        //创建一个工作表
        Sheet sheet = workbook.createSheet("smy测试表1");

        //循环创建行(十万条数据,使用SXSSF比XSSF快多了)
        for (int rowNum = 0; rowNum < 100000; rowNum++){
            Row row = sheet.createRow(rowNum);
            //每一行创建十个单元格并赋值
            for(int cellNum = 0; cellNum < 10; cellNum++){
                Cell cell = row.createCell(cellNum);
                cell.setCellValue(cellNum);
            }
        }
        System.out.println("over");

        //输出流
        FileOutputStream fileOutputStream = new FileOutputStream(PATH + "testWrite07BigDataS.xlsx");
        workbook.write(fileOutputStream);
        //关闭流
        fileOutputStream.close();
        //清除临时文件!
        ((SXSSFWorkbook) workbook).dispose();

        long endTime = System.currentTimeMillis();
        System.out.println("结束时间:" + endTime);
        //可能有小数,所以转成double类型,除以一千以秒形式展示
        System.out.println("生成excel表所需要的时间:" + (double)(endTime - beginTime)/1000);

    }
}
相关推荐
程序猿小D8 小时前
第25节 Node.js 断言测试
后端·node.js·log4j·编辑器·vim·apache·restful
RR133512 小时前
图标统计页面的设计与控件 Apache echarts
前端·apache·echarts
tcoding2 天前
《基于Apache Flink的流处理》笔记
笔记·flink·apache
ALLSectorSorft3 天前
上门服务小程序会员系统框架设计
小程序·apache
杨过姑父3 天前
部署开源版禅道,修改apache端口无效解决
bug·apache·软件工程·issue
酷爱码3 天前
Spring Boot 整合 Apache Flink 的详细过程
spring boot·flink·apache
黑客老李3 天前
JavaSec | SpringAOP 链学习分析
java·运维·服务器·开发语言·学习·apache·memcached
临水逸4 天前
可视化大屏工具对比:GoView、DataRoom、积木JimuBI、Metabase、DataEase、Apache Superset 与 Grafana
apache·grafana
SelectDB技术团队4 天前
Apache Doris + MCP:Agent 时代的实时数据分析底座
人工智能·数据挖掘·数据分析·apache·mcp