【Apache POI】Excel操作(一):Excel本地写入基本操作的实现

有人住高楼,有人在深沟,有人光万丈,有人一身锈;世人千万种,浮云莫去求,斯人若彩虹,遇上方知有。

前言

接下来我会出一系列关于如何用Java操作Excel的博客教程,欢迎有需要的小伙伴持续关注哦!

相信大家在开发的过程中难免遇到要进行Excel读写操作的任务。反正最近本博主就遇到了,因为缺乏相关经验,也是一边烦恼不知从何下手一边研究了一段时间,最后还算是完美的完成了任务。其实跟Java的文件读写操作没两样,而且使用一些工具的话,还要更加的简单。

前期准备

本篇博客的编码环境为:SpringBoot(Java框架) + IDEA(开发工具),若是有不会搭建环境的小伙伴可以参考我的这两篇博客哦:

用Spring Initializr快速构建SpringBoot及整合MVC

或者

用Maven搭建一个SpringBoot工程及启动多个工程实例

POI基本介绍

说到Java操作excel,我们当然不可能用原生的JAVAIO流代码去写,那样效率未免有些低下。这里隆重的给大家介绍由Apache提供的工具Apache POI(当然之后也会给大家介绍有Alibaba提供的工具EasyExcel,使用起来更加的方便,不过其实也是在Apache POI上面进行了封装)。

首先,我们来到Apache POI根正苗红的官网:http://poi.apache.org/

在这里插入图片描述
然后,你会很惊喜的发现:似乎看不出什么名堂,也不知道怎么使用。

不过,不用担心,有本博主在,所有问题都将迎刃而解

我们直接来到百度百科就好了:点击这里,进行跳转

在这里插入图片描述
我们看到最开始的简介中的:

POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

在这里插入图片描述
也就是说,Apache POI不光能操作Excel的读写,还能操作其他的Microsoft Office格式的文档,如我们常用的Word文档、PPT等。当然,本系列博客只涉及Excel的读写操作,至于其他格式的文档操作,读者可以自行研究。

Excel简单介绍

Excel版本介绍

首先,我们看到百度百科中关于Apache POI基本功能关于Excel的介绍:

在这里插入图片描述
我们会发现Excel有两个版本,分别是HSSF以及XSSF

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

那么,这两个版本有什么区别呢?

首先,文件的后缀名不同:

  • HSSF版本为03版本的Excel文件 — 它的后缀名为.xls
  • XSSF版本为07版本的Excel文件 — 它的后缀名为.xlsx

如图所示:
在这里插入图片描述

其次,03版本的.xlsExcel文件最多为65536行:
在这里插入图片描述
而,07版本的.xlsxExcel文件则最多为1048576行,刚好是65536也就是03版本的**16倍**
在这里插入图片描述

Excel基本元素

我们都知道在Java中万物皆可为对象,那么我们在Java中操作Excel都是操作哪些对象呢?

这里我就不卖关子了,它们分别是:

  1. 工作簿
  2. 工作表

如图所示:
在这里插入图片描述

毕竟,我们只有精确到哪个工作簿 -> 哪个工作表 -> 哪行 -> 哪列,才能明确到具体的单元格!!!

开整

导入依赖

首先,我们在SpringBoot工程的依赖管理文件pom.xml中导入我们所需要的依赖:

	<!-- 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>
	
	<!-- 日期格式化工具 -->
	<dependency>
		<groupId>joda-time</groupId>
		<artifactId>joda-time</artifactId>
		<version>2.10.1</version>
	</dependency>

	 <!-- 测试 -->
     <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>4.12</version>
     </dependency>

本地写入

本地写入的话,为了方便我们直接写入到当前.java文件所在的路径就好了。

在IDEA中,要快速获取当前的绝对路径的话:

首先,鼠标右键当前的包,然后选择Copy Path...

在这里插入图片描述

其次,鼠标左键选择Absolute Path,然后再粘贴即可:

在这里插入图片描述

03版本 or 07版本?

POI操作Excel选择03版本,还是07版本。除了所需的依赖不同之外,代码上只有最开始的创建工作簿的代码一行以及生成文件名的后缀不同而已。

如,03版本,后缀名为.xls,创建工作簿代码为:

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

而,07版本,后缀名为.xlsx,创建工作簿代码为:

// 创建一张工作簿
Workbook workbook = new XSSFWorkbook();
03版本

03版本本地写入excel代码如下:

package com.guqueyue.excel;

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.joda.time.DateTime;
import org.junit.Test;

import java.io.File;
import java.io.FileOutputStream;

/**
 * @ClassName ExcelWriteTest
 * @Description 写入03版本Excel测试
 * @Author 古阙月
 * @Date 2020/10/31 21:43
 * @Version 1.0
 **/
public class ExcelWriteTest {

    /**
     * 需要写入excel的路径
     */
    private static final String PATH = "C:\\project\\study_demo\\springboot_demo\\src\\main\\java\\com\\guqueyue\\excel";

    @Test
    public void write03Test() throws Exception {

        // 创建一张工作簿
        Workbook workbook = new HSSFWorkbook();
        // 创建一张工作表
        Sheet sheet1 = workbook.createSheet("古阙月书单");

        /**
         * 创建第一行
         */
        Row row1 = sheet1.createRow(0);
        // 创建第一行第一列
        Cell cell11 = row1.createCell(0);
        // 填值
        cell11.setCellValue("书名");
        // 创建第一行第二列
        Cell cell12 = row1.createCell(1);
        // 填值
        cell12.setCellValue("作者");
        // 创建第一行第三列
        Cell cell13 = row1.createCell(2);
        // 填值
        cell13.setCellValue("时间");

        /**
         * 创建第二行
         */
        Row row2 = sheet1.createRow(1);
        // 创建第二行第一列
        Cell cell21 = row2.createCell(0);
        // 填值
        cell21.setCellValue("《平凡的世界》");
        // 创建第二行第二列
        Cell cell22 = row2.createCell(1);
        // 填值
        cell22.setCellValue("路遥");
        // 创建第二行第三列
        Cell cell23 = row2.createCell(2);
        // 填值
        cell23.setCellValue(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));

        // 用IO流生成一张Excel表(03版本)- 后缀.xls
        FileOutputStream fileOutputStream = new FileOutputStream(PATH + File.separator + "古阙月的书单表03.xls");
        // 写入
        workbook.write(fileOutputStream);
        // 关流
        fileOutputStream.close();

        System.out.println("古阙月的书单表03.xls生成完毕!!!");
    }

}

运行write03Test()方法,可以看到控制台一道绿光闪过,控制台打印出了古阙月的书单表03.xls生成完毕!!!,也生成了名为古阙月的书单表03.xls的文件:
在这里插入图片描述
点开一看,分毫不差,非常棒:
在这里插入图片描述

07版本

07版本本地写入excel代码如下:

package com.guqueyue.excel;

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 org.joda.time.DateTime;
import org.junit.Test;

import java.io.File;
import java.io.FileOutputStream;

/**
 * @ClassName ExcelWriteTest
 * @Description 写入07版本Excel测试
 * @Author 古阙月
 * @Date 2020/10/31 21:43
 * @Version 1.0
 **/
public class ExcelWriteTest2 {

    /**
     * 需要写入excel的路径
     */
    private static final String PATH = "C:\\project\\study_demo\\springboot_demo\\src\\main\\java\\com\\guqueyue\\excel";

    /**
     * 需要写入excel的文件名称
     */
    private static final String FILENAME = "古阙月的书单表07.xlsx";

    @Test
    public void write07Test() throws Exception {

        // 创建一张工作簿
        Workbook workbook = new XSSFWorkbook();
        // 创建一张工作表
        Sheet sheet1 = workbook.createSheet("古阙月书单2");

        /**
         * 创建第一行
         */
        Row row1 = sheet1.createRow(0);
        // 创建第一行第一列
        Cell cell11 = row1.createCell(0);
        // 填值
        cell11.setCellValue("书名");
        // 创建第一行第二列
        Cell cell12 = row1.createCell(1);
        // 填值
        cell12.setCellValue("作者");
        // 创建第一行第三列
        Cell cell13 = row1.createCell(2);
        // 填值
        cell13.setCellValue("时间");

        /**
         * 创建第二行
         */
        Row row2 = sheet1.createRow(1);
        // 创建第二行第一列
        Cell cell21 = row2.createCell(0);
        // 填值
        cell21.setCellValue("《挪威的森林》");
        // 创建第二行第二列
        Cell cell22 = row2.createCell(1);
        // 填值
        cell22.setCellValue("村上春树");
        // 创建第二行第三列
        Cell cell23 = row2.createCell(2);
        // 填值
        cell23.setCellValue(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));

        // 用IO流生成一张Excel表(03版本)- 后缀.xlsx
        FileOutputStream fileOutputStream = new FileOutputStream(PATH + File.separator + FILENAME);
        // 写入
        workbook.write(fileOutputStream);
        // 关流
        fileOutputStream.close();

        System.out.println(FILENAME + "生成完毕!!!");
    }

}

同样的,运行write07Test()方法,可以看到控制台一道绿光闪过,控制台打印出了古阙月的书单表07.xlsx生成完毕!!!,也生成了名为古阙月的书单表07.xlsx的文件:
在这里插入图片描述
点开一看,也是分毫不差,非常棒:
在这里插入图片描述
好了,使用Apache POI实现Excel基本的写入操作就完成了。敬请期待下期博客哦!!!

在本期博客中给大家介绍了Apache POI在本地写入Excel的基本操作。但可能很多朋友就会问了:在实际操作中,我们一般都是采用实体类集合来写入数据的吧。总不可能一个单元格一个单元格去填写吧?

是的。所以下期博客来了,给大家带来一个进阶版,通过实体类集合来写入数据:

【Apache POI】Excel操作(二):Excel本地写入基本操作的实现(进阶版)

参考资料:【狂神说Java】POI及EasyExcel一小时搞定通俗易懂

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值