使用Java语言,引入依赖apache-poi中的Excel文档操作

前言:

|-------|--------------------|-------|
| HSSF | 针对于excel03之前版本 | .xls |
| XSSF | 针对于excel07之后版本 | .xlsx |
| SXSSF | 针对于excel07之后版本,升级版 | .xlsx |

apache-poi官网图片

首先引入相关文档:

java 复制代码
    <dependencies>
        <!--    03- 版本的excel .xls    -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <!--   07+ 版本的excel .xlsx   -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
    </dependencies>

一、读取操作

目标excel文档如下:

  1. 获取通过文件流读取Excel的工作簿Workbook
  2. 通过workbook 获取工作表
  3. 通过sheet获取row行
  4. 通过row获取cell单元格
  5. 使用cell.getStringCellValue()获取单元格的值
java 复制代码
public static void main(String[] args) throws Exception {
        readExcel07();
//        readExcel07All();
    }

    /**
     * 使用文件流读取.xlsx中的某个数据
     * @throws Exception
     */
    public static void readExcel07() throws Exception{
        //1.通过文件流读取Excel工作部
        FileInputStream inputStream = new FileInputStream("./测试.xlsx");
        //2.获取工作簿
        Workbook workbook = new XSSFWorkbook(inputStream);
        //3.获取工作表
        Sheet sheet = workbook.getSheet("07xlsx版本");
        //4.获取行
        Row row = sheet.getRow(0);
        //5.获取列
        Cell cell = row.getCell(0);
//        RichTextString cellValue = cell.getRichStringCellValue();
        String cellValue = cell.getStringCellValue();
        System.out.println(cellValue);

        //关闭资源
        workbook.close();
        inputStream.close();

    }

    /**
     * 读取文件中所有的非空数据
     * @throws Exception
     */
    public static void readExcel07All() throws Exception{
        //1.通过文件流读取Excel工作部
        FileInputStream inputStream = new FileInputStream("./测试.xlsx");
        //2.获取工作簿
        Workbook workbook = new XSSFWorkbook(inputStream);
        //3.获取工作表
        Sheet sheet = workbook.getSheet("07xlsx版本");
        //4.获取行
        Row row = sheet.getRow(0);
        if(row!=null){
            for (int i = 0; i < row.getRowNum(); i++) {
                //5.获取列
                Cell cell = row.getCell(i);
                if(cell!=null){
                    System.out.print(cell.getStringCellValue() + "/t");
                }
            }
        }
        //关闭资源
        workbook.close();
        inputStream.close();

    }

运行结果如下:

二、使用依赖向excel中写入相关数据

java 复制代码
 public static void main(String[] args) throws Exception {
//        createDemoXLS();
        createDemoXLSX();
    }

    public static void createDemoXLS() throws Exception {
        //首先创建工作簿
        Workbook workbook = new HSSFWorkbook();
        //创建工作表
        Sheet sheet = workbook.createSheet("03xls版本");
        //创建第一行
        Row row = sheet.createRow(0);
        //创建单元格
        Cell cell0 = row.createCell(0);
        cell0.setCellValue("序号");
        Cell cell1 = row.createCell(1);
        cell1.setCellValue("商品名称");

        //创建第二行
        Row row1 = sheet.createRow(1);
        Cell cell10 = row1.createCell(0);
        cell10.setCellValue("0");
        Cell cell11 = row1.createCell(1);
        cell11.setCellValue("电脑");

        //输出流
        FileOutputStream fileOutputStream = new FileOutputStream("./测试.xls");
        workbook.write(fileOutputStream);

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

    }

    public static void createDemoXLSX() throws Exception {
        //首先创建工作簿
        Workbook workbook = new XSSFWorkbook();
        //创建工作表
        Sheet sheet = workbook.createSheet("07xlsx版本");
        //创建第一行
        Row row = sheet.createRow(0);
        //创建单元格
        Cell cell0 = row.createCell(0);
        cell0.setCellValue("序号");
        Cell cell1 = row.createCell(1);
        cell1.setCellValue("商品名称");

        //创建第二行
        Row row1 = sheet.createRow(1);
        Cell cell10 = row1.createCell(0);
        cell10.setCellValue("0");
        Cell cell11 = row1.createCell(1);
        cell11.setCellValue("平板");

        //输出流
        FileOutputStream fileOutputStream = new FileOutputStream("./测试.xlsx");
        workbook.write(fileOutputStream);

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

    }

三、批量插入

java 复制代码
    public static void main(String[] args) throws Exception {
//        BatchXlsInsert();
//        BatchXlsxInsert();
        BatchXlsxBigInsert();
    }

    //大内存插入数据 .xls 03-
    public static void BatchXlsInsert() throws Exception{
        //记录当前时间
        long start = System.currentTimeMillis();
        //先创建工作部
        Workbook workbook = new HSSFWorkbook();
        //工作表
        Sheet sheet = workbook.createSheet("03测试");
        //调用复合组件
        rowOriginSheet(sheet);
        //输出
        FileOutputStream outputStream = new FileOutputStream("./03BatchInsert.xls");
        workbook.write(outputStream);
        long end = System.currentTimeMillis();
        System.out.println("创建03.xls耗时 ====> "+(end-start)/1000 + "s");
    }

    //大内存插入问题 07+ .xlsx
    public static void BatchXlsxInsert() throws Exception{
        //记录当前时间
        long start = System.currentTimeMillis();
        //先创建工作部
        Workbook workbook = new XSSFWorkbook();
        //工作表
        Sheet sheet = workbook.createSheet("07测试");
        //调用复合组件
        rowOriginSheet(sheet);
        //输出
        FileOutputStream outputStream = new FileOutputStream("./07BatchInsert.xlsx");
        workbook.write(outputStream);
        long end = System.currentTimeMillis();
        System.out.println("创建07.xls耗时 ====>"+(end-start)/1000 + "s");
    }

    //大内存插入问题 07+ .xlsx 升级版
    public static void BatchXlsxBigInsert() throws Exception{
        //记录当前时间
        long start = System.currentTimeMillis();
        //先创建工作部
        Workbook workbook = new SXSSFWorkbook();
        //工作表
        Sheet sheet = workbook.createSheet("07测试");
        //调用复合组件
        rowOriginSheet(sheet);
        //输出
        FileOutputStream outputStream = new FileOutputStream("./07BatchBigInsert.xlsx");
        workbook.write(outputStream);
        long end = System.currentTimeMillis();
        System.out.println("创建07.xls耗时 ====>"+(end-start)/1000 + "s");
    }
    public static void rowOriginSheet(Sheet sheet){
        //创建行
//        for (int i = 0; i < 65536; i++) {
        for (int i = 0; i < 1045536; i++) {
            Row row = sheet.createRow(i);
            for (int j = 0; j < 20; j++) {
                Cell cell = row.createCell(j);
                cell.setCellValue(j+1);
            }
        }
    }

其中,HSSFWorkbook只能插入少于65536行的数据,而XSSFWorkbook可以插入少于1045536条数据,但是其插入的速度较慢,因此使用SXSSF进行了升级,插入的速度更快。

相关推荐
james的分享6 天前
大数据领域核心 SQL 优化框架Apache Calcite介绍
大数据·sql·apache·calcite
莫寒清6 天前
Apache Tika
java·人工智能·spring·apache·知识图谱
归叶再无青6 天前
web服务安装部署、性能升级等(Apache、Nginx)
运维·前端·nginx·云原生·apache·bash
忙碌5447 天前
OpenTelemetry实战指南:构建云原生全链路可观测性体系
ios·flink·apache·iphone
悠闲蜗牛�7 天前
Apache Flink实时计算实战指南:从流处理到数据湖仓一体的架构演进
架构·flink·apache
2301_816997888 天前
Apache Commons工具类
apache
心雨⁢⁢⁣8 天前
RocketMq(Apache RocketMQ 5.2.1-SNAPSHOT)消息消费流程
apache·rocketmq·java-rocketmq
切糕师学AI8 天前
Apache ZooKeeper 简介
分布式·zookeeper·apache
忙碌5448 天前
实时流处理架构深度剖析:Apache Flink在实时数仓与风控系统的工程实践
架构·flink·apache
x***r15111 天前
phpstudy_x64_8.1.1.3安装教程(含Apache/MySQL启动与端口修改)
数据库·mysql·apache