c语言编程笔录

首页 >   > 笔记大全

笔记大全

使用hutool工具导出Excel标题自定义顺序

更新时间:2023-10-18

第一段

Hutool 是一个Java工具包,封装了很多常用的公共类库,提供了 String、Date、IO、图形、各种平台相关的工具类等,最重要的是,Hutool震撼的工具类够用!

import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import cn.hutool.poi.excel.cell.CellUtil;
import cn.hutool.poi.excel.style.StyleUtil;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;

import java.util.ArrayList;
import java.util.List;

public class HutoolTest {

    public static void main(String[] args) {

        List list = new ArrayList<>();
        User user1 = new User();
        user1.setName("张三");
        user1.setAge("25");
        user1.setSex("男");
        user1.setAddress("广东省广州市天河区");
        user1.setPhone("13888888888");
        User user2 = new User();
        user2.setName("李四");
        user2.setAge("30");
        user2.setSex("女");
        user2.setAddress("湖南省长沙市岳麓区");
        user2.setPhone("13999999999");
        list.add(user1);
        list.add(user2);

        ExcelWriter writer = ExcelUtil.getWriter();
        //自定义标题列顺序
        writer.addHeaderAlias("name", "姓名");
        writer.addHeaderAlias("sex", "性别");
        writer.addHeaderAlias("age", "年龄");
        writer.addHeaderAlias("address", "地址");
        writer.addHeaderAlias("phone", "电话");

        writer.write(list, true);
        writer.flush();
        writer.close();
    }

    static class User {
        private String name;
        private String sex;
        private String age; 
        private String address; 
        private String phone;
        // 省略set、get方法
    }
}

在这个例子中,我们可以看到,ExcelWriter 对象提供了 addHeaderAlias 方法来自定义标题列。通过该方法,我们可以将原本 Java 对象中的字段映射成任意 Excel 表头标题。当然,如果想保留原本 Java 对象中的字段名,也可以直接调用 addHeaderAlias 方法不传入第二个参数即可。

第二段

Hutool 工具包中的 ExcelWriter 对象还可以通过 setColumnWidth 方法来设置列宽,通过 setRowHeight 方法来设置行高。

import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;

import java.util.ArrayList;
import java.util.List;

public class HutoolTest {

    public static void main(String[] args) {

        List list = new ArrayList<>();
        User user1 = new User();
        user1.setName("张三");
        user1.setAge("25");
        user1.setSex("男");
        user1.setAddress("广东省广州市天河区");
        user1.setPhone("13888888888");
        User user2 = new User();
        user2.setName("李四");
        user2.setAge("30");
        user2.setSex("女");
        user2.setAddress("湖南省长沙市岳麓区");
        user2.setPhone("13999999999");
        list.add(user1);
        list.add(user2);

        ExcelWriter writer = ExcelUtil.getWriter();
        writer.addHeaderAlias("name", "姓名");
        writer.addHeaderAlias("sex", "性别");
        writer.addHeaderAlias("age", "年龄");
        writer.addHeaderAlias("address", "地址");
        writer.addHeaderAlias("phone", "电话");
        writer.setColumnWidth(0, 15);
        writer.setColumnWidth(1, 10);
        writer.setColumnWidth(2, 5);
        writer.setColumnWidth(3, 20);
        writer.setColumnWidth(4, 15);

        writer.write(list, true);
        writer.flush();
        writer.close();
    }

    static class User {
        private String name;
        private String sex;
        private String age; 
        private String address; 
        private String phone;
        // 省略set、get方法
    }
}

在这个例子中,我们通过 setColumnWidth 方法设置了每一列的列宽,便于数据在 Excel 中展示和查看。需要注意的是,列宽的单位是字符宽度,不是像素,这样可以保证在不同的设备上可以正常显示。

第三段

Hutool 工具包还提供了更多的 API 来设置 Excel 导出的样式,例如设置标题、设置单元格样式等。下面我们可以看一个具体的例子。

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import cn.hutool.poi.excel.style.StyleUtil;
import org.apache.poi.ss.usermodel.*;

import java.util.List;
import java.util.Map;

public class HutoolTest {

    public static void main(String[] args) {

        List list = getUserList();
        ExcelWriter writer = ExcelUtil.getWriterWithSheet("用户列表");

        // 样式设置
        CellStyle headCellStyle = StyleUtil.buildHeadCellStyle(writer.getWorkbook());
        CellStyle bodyCellStyle = StyleUtil.buildBodyCellStyle(writer.getWorkbook());

        // 标题设置
        Row row0 = writer.getOrCreateRow(0);
        Cell cell0 = row0.createCell(0);
        cell0.setCellValue("用户列表");
        cell0.setCellStyle(headCellStyle);
        CellUtil.createCell(row0, 1, null, headCellStyle);
        CellUtil.createCell(row0, 2, null, headCellStyle);
        CellUtil.createCell(row0, 3, null, headCellStyle);
        CellUtil.createCell(row0, 4, null, headCellStyle);
        CellUtil.createCell(row0, 5, null, headCellStyle);
        CellUtil.createCell(row0, 6, null, headCellStyle);
        CellUtil.createCell(row0, 7, null, headCellStyle);
        writer.merge(0, 0, 0, 7);

        // 自定义标题列顺序
        writer.addHeaderAlias("name", "姓名");
        writer.addHeaderAlias("sex", "性别");
        writer.addHeaderAlias("age", "年龄");
        writer.addHeaderAlias("address", "地址");
        writer.addHeaderAlias("phone", "电话");
        writer.addHeaderAlias("email", "邮箱");
        writer.addHeaderAlias("create_time", "创建时间");
        writer.addHeaderAlias("update_time", "更新时间");

        for (User user : list) {
            Map map = ObjectUtil.beanToMap(user, true, true);
            writer.writeCellValue(1, map, bodyCellStyle);
        }

        writer.autoSizeColumn(0);
        writer.autoSizeColumn(1);
        writer.autoSizeColumn(2);
        writer.autoSizeColumn(3);
        writer.autoSizeColumn(4);
        writer.autoSizeColumn(5);
        writer.autoSizeColumn(6);
        writer.autoSizeColumn(7);

        writer.flush();
        writer.close();
    }

    static class User {
        private String name;
        private String sex;
        private Integer age;
        private String address;
        private String phone;
        private String email;
        private Integer create_time;
        private Integer update_time;
        // 省略set、get方法
    }

    private static List getUserList() {
        List list = CollUtil.newArrayList();
        for (int i = 0; i < 10; i++) {
            User user = new User();
            user.setName("name" + i);
            user.setSex(i % 2 == 0 ? "男" : "女");
            user.setAge(i);
            user.setAddress("address" + i);
            user.setPhone("13912345678");
            user.setEmail("email" + i + "@qq.com");
            user.setCreate_time(Math.toIntExact(DateUtil.currentSeconds()));
            user.setUpdate_time(Math.toIntExact(DateUtil.currentSeconds()));
            list.add(user);
        }
        return list;
    }
}

在这个例子中,我们可以看到通过 StyleUtil 提供的 API 来创建两个 CellStyle 对象,一个用于表头,一个用于表体。对于表头,我们首先创建一行,然后合并单元格、添加单元格数据、设置样式。对于表体,我们直接遍历数据源,并通过 writeCellValue 方法来填充单元格。

第四段

至此,在Hutool工具包中,我们已经掌握了自定义标题、设置列宽高、设置样式等 Excel 导出常用的操作。这些操作都极大地方便了我们进行 Excel 数据导出,减少了我们在代码中的重复劳动。需要注意的是,这些工具只是为我们简化了很多操作,如果涉及到 Excel 导出的复杂需求,还需要耐心地阅读 API 文档,并结合实际情况进行调整。