使用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 文档,并结合实际情况进行调整。