开幕雷击,你肯定见过这个或者类似填表格的场景。

没错,学校或者公司内部有时候需要安排填写一些信息,然后这些信息通过上传 excel 的方式将其导入到系统中。在此之前只知道通过 csv 文件来导入相关的信息。那 java 是如何读取或写入 excel 的呢?直接通过文件流去硬读肯定读到的是一堆乱码,所以我们用这个 “Apache POI” 来读和写我们的 excel。

同时 Apache POI 的使用也非常简单。

特别想吐槽把 python 吹上天的那些广告和培训机构,我依然还记得在 python 刚刚被吹上天的那个时期,说 python 什么都能干,其中不乏有 python 操作 excel。

以前一直认为只有 python 才可以操作表格,今天学完之后,java 也是可以操作 excel 表格的。

其实场景还是非常之多的,比如将期末考试的成绩进行导出到 excel ,这个操作其实也是非常之常见的咯。

怎么样,阿尔敏美不美😉😉

介绍和导入

好的,现在由我来介绍进击的巨人之阿尔敏,不对,走错片场了。

由我来介绍 Apache POI 是啥,Apache POI 是用 Java 编写的免费开源的跨平台的 Java API,Apache POI 提供 API 让 Java 操作 Microsoft Office(Excel、WORD、PowerPoint、Visio等)文档的读和写的功能。

说起这个东西可以操作 word,这就意味着可以实现从数据库导出数据到 word 的功能。羡慕

常用的类

Apache POI 提供了 8 个常用的类,包括以下几个。

  • HSSF - 提供读写 Microsoft Excel XLS 格式档案的功能。
  • XSSF - 提供读写 Microsoft Excel OOXML XLSX 格式档案的功能。
  • HWPF - 提供读写 Microsoft Word DOC97 格式档案的功能。
  • XWPF - 提供读写 Microsoft Word DOC2003 格式档案的功能。
  • HSLF - 提供读写 Microsoft PowerPoint 格式档案的功能。
  • HDGF - 提供读 Microsoft Visio 格式档案的功能。
  • HPBF - 提供读 Microsoft Publisher 格式档案的功能。
  • HSMF - 提供读 Microsoft Outlook 格式档案的功能。

需要导入的 jar 包

可以使用 maven 的方式自动引入,也可以直接将 jar 包下载下来。

代码示例

本次示例有两个,一个是基本使用,另一个是 99 乘法表的应用。使用的方法也是非常的简单,和操作二维数组一样很相似。

简单示例

写入到磁盘

1、导入完成之后,首先创建一个 Workbook 对象。每一个 Workbook 对象对应的是一个 excel 的工作簿

Workbook workbook = new HSSFWorkbook();

2、然后创建一个工作表,也就是 sheet。

Sheet sheet = workbook.createSheet("工作表1");

我们直接打开 excel 程序的时候,默认是如下图的样子,有一个 sheet。而通过 Java 创建就不一样,需要调用 createSheet 方法即可。

3、创建完工作表之后,就可以对单元格进行操作了,先创建一行

// 创建一个行
Row row = sheet.createRow(0);

4、然后再创建单元格,并在单元格中填写信息。

// 创建单元格
Cell cell1 = row.createCell(0);
cell1.setCellValue("今日新增观众");
Cell cell2 = row.createCell(1);
cell2.setCellValue(666);

5、我们再次创建一行

// 创建一个行
Row row2 = sheet.createRow(1);
// 创建一个单元格
Cell cell21 = row2.createCell(0);
cell21.setCellValue("统计时间");
Cell cell22 = row2.createCell(1);
cell22.setCellValue(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));

6、创建文件输出流,将 excel 保存到磁盘(需要抛出异常)

FileOutputStream fileOutputStream = new FileOutputStream("d:\\excel_demo\\demo.xls");
workbook.write(fileOutputStream);
fileOutputStream.close();

7、运行结果

注意:行和列都是从 0 开始的

从磁盘读取

读取文件也是非常的简单,写入的时候是 createXXX ,那么读取的时候就是 getXXX 。读取 excel 的代码如下。

// 获取文件流
FileInputStream fis = new FileInputStream("d:\\excel_demo\\demo.xls");
// 创建工作簿
HSSFWorkbook workbook = new HSSFWorkbook(fis);
// 创建工作表
HSSFSheet sheet0 = workbook.getSheet("工作表1");
// 获取第 0 行
HSSFRow row = sheet0.getRow(0);
// 获取第 0,1 个单元格
HSSFCell cell0 = row.getCell(0);
HSSFCell cell1 = row.getCell(1);
// 获取单元格中的值
String stringCellValue = cell0.getStringCellValue();
double numericCellValue = cell1.getNumericCellValue();
System.out.println(stringCellValue + ":" + numericCellValue);

运行结果:

总结

Excel中的工作簿、工作表、行、单元格中有如下关系

  1. 一个 Excel 文件对应于一个 Workbook
  2. 一个 Workbook 可以有多个 Sheet 组成
  3. 一个 Sheet 是由多个 Row 组成
  4. 一个 Row 是由多个 Cell 组成

99 乘法表

敢不敢试一试将 99 乘法表写到 excel 表格中

// 创建工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
// 创建工作表
Sheet sheet = workbook.createSheet("99乘法表");
for(int i = 1; i <= 9; i++) {
    // 创建行
    Row row = sheet.createRow(i - 1);
    for (int j = 1; j <= i; j++) {
        // 创建列(创建单元格)
        Cell cell = row.createCell(j - 1);
        cell.setCellValue(i + " × " + j + " = " + (i * j));
    }
}
// 打开输出流
FileOutputStream fileOutputStream = new FileOutputStream("d:\\excel_demo\\demo2.xls");
workbook.write(fileOutputStream);
fileOutputStream.close();

运行结果如下

将 99 乘法表读取出来

// 获取文件流
FileInputStream fis = new FileInputStream("d:\\excel_demo\\demo2.xls");
// 创建工作簿对象
HSSFWorkbook workbook = new HSSFWorkbook(fis);
// 得到工作表
HSSFSheet sheet = workbook.getSheet("99乘法表");
for (int i = 1; i < 10; i++) {
    // 得到行
    HSSFRow row = sheet.getRow(i - 1);
    for (int j = 1; j < i + 1; j++) {
        HSSFCell cell = row.getCell(j - 1);
        System.out.print(cell.getStringCellValue() + "\t");
    }
    System.out.println();
}
fis.close();
workbook.close();

运行结果

后记

使用 Apache POI 操作 excel 其实还是不难的。后续的期末项目肯定是需要利用到的,未来在利用 excel 进行数据的导入和导出,会继续写一篇日志出来记录。