Bootstrap

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

生活的苦难可以被疲劳麻痹,被娱乐转移,无论如何只要还生存着,行尸走肉也可以得过且过,最终习以为常,可以称之为钝化。学习的痛苦在于,你始终要保持敏锐的触感,保持清醒的认知和丰沛的感情,这不妨称之为锐化。

前言

在之前的博客:

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

中给大家介绍了Apache POI在本地写入Excel的基本操作。

但可能很多朋友就会问了:在实际操作中,我们一般都是采用实体类集合来写入数据的吧。总不可能一个单元格一个单元格去填写吧?

是的。所以今天给大家带来一个进阶版,通过实体类集合来写入数据。

开整

话不多说,在上篇博客的环境基础之上>(点击进入上篇博客),我们直接开始编写代码:

实体类

首先,既然是通过实体类集合来写入数据,我们当然需要一个实体类:

package com.guqueyue.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;


//lombok插件的注解
@Data // 若未使用lombok插件,请自行生成getter、setter以及toString方法
@AllArgsConstructor // 若未使用lombok插件,请自行生成有参构造方法
@NoArgsConstructor // 若未使用lombok插件,请自行生成无参构造方法
@Accessors(chain = true) // 开启链式编程
public class DemoData {

    /**
     * 书名
     */
    private String bookName;

    /**
     * 作者
     */
    private String author;

    /**
     * 时间
     */
    private String dateTime;

}

Excel拆分

一般来说,Excel表格可以分为两个部分,一个为列名部分,一个为数据部分:

在这里插入图片描述

列名部分

列名部分我们用一个数组表示好了:

/**
 * 列名部分
 */
private static final String[] rowNameArray = {"书名", "作者", "时间"};

数据部分

数据部分我们用个方法批量生成就好了:

/**
 * 数据部分
 */
private List<DemoData> getData() {
   
   List<DemoData> list = new ArrayList<>();
   for (int i = 0; i < 10; i++) {
       DemoData demoData = new DemoData();
       demoData.setAuthor("路遥")
               .setBookName("平凡的世界" + (i+1))
               .setDateTime(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));
       list.add(demoData);
   }
   
   return list;
}

写个方法测试一下,生成了啥:

 /**
  * 查看生成的数据
  */
@Test
public void seeData() {
    // 得到实体类集合
    List<DemoData> list = getData();
    // 遍历
    list.forEach(demoData -> {
        System.out.println(demoData);
    });
}

运行,得:
在这里插入图片描述

完整代码

由于我们这里数据量并不庞大,所以直接生成03版本的Excel就好了。如若数据量超过65536行,可以生成07版本的excel。至于如何生成,可以 点击进入

相信有了之前的铺垫,以下代码不难理解(当然,还需要一点点反射基础,我后续可能会出相关的博客,有需要的小伙伴可以关注我哦):

package com.guqueyue.excel;

import com.guqueyue.entity.DemoData;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName ExcelWriteTest3
 * @Description 通过实体类集合写入Excel表格
 * @Author 古阙月
 * @Date 2020/11/1 16:55
 * @Version 1.0
 **/
public class ExcelWriteTest3 {

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

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

    /**
     * 列名部分
     */
    private static final String[] rowNameArray = {"书名", "作者", "时间"};

    /**
     * 数据部分
     */
    private List<DemoData> getData() {

        List<DemoData> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            DemoData demoData = new DemoData();
            demoData.setAuthor("路遥")
                    .setBookName("平凡的世界" + (i+1))
                    .setDateTime(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));
            list.add(demoData);
        }

        return list;
    }

    /**
     * 查看生成的数据
     */
    @Test
    public void seeData() {
        // 得到实体类集合
        List<DemoData> list = getData();
        // 遍历
        list.forEach(demoData -> {
            System.out.println(demoData);
        });
    }

    /**
     * 用实体类集合生成Excel
     */
    @Test
    public void writeExcelTest() throws Exception {

        // 生成一张工作簿
        Workbook workbook = new HSSFWorkbook();
        // 生成一张工作表
        Sheet sheet = workbook.createSheet("古阙月的书单");

        /**
         * 写入列名部分
         */
        Row row1 = sheet.createRow(0); // 生成第一行
        for (int i = 0; i < rowNameArray.length; i++) {

            row1.createCell(i).setCellValue(rowNameArray[i]);
        }

        /**
         * 写入数据部分
         */
        List<DemoData> list = getData(); // 得到实体类集合
        for (int i = 0; i < list.size(); i++) {
            // 生成第 i+2行
            Row row = sheet.createRow(i + 1);

            DemoData demoData = list.get(i);
            // 用于标记当前的列
            int j = 0;
            // 获取当前实体类的属性集合
            Field[] fields = demoData.getClass().getDeclaredFields();
            // 遍历
            for (Field field : fields) {

                // 私有属性访问授权
                field.setAccessible(true);

                // 获取属性对应的值
                String value = (String) field.get(demoData);

                // 写入属性对应的值
                row.createCell(j).setCellValue(value);

                // 列号+1
                j++;
            }
        }

        // 生成一张excel表
        FileOutputStream fileOutputStream = new FileOutputStream(PATH + File.separator + FILENAME);
        // 写入
        workbook.write(fileOutputStream);
        // 关流
        fileOutputStream.close();
        System.out.println(FILENAME + "生成完毕!!!");
    }

}

运行writeExcelTest()方法,可以看到控制台一道绿光闪过,控制台打印出了古阙月的书单03.xls生成完毕!!!,也生成了名为古阙月的书单03.xls的文件:
在这里插入图片描述
点开一看,非常完美:
在这里插入图片描述
下期博客将为大家介绍如何在Web即在浏览器端导出Excel,欢迎大家持续关注哦!!!

下期博客来了,点击进入 -> (点我也可):

【Apache POI】Excel操作(三):Excel在浏览器端即Web端写入操作的实现

;