设计写入实体类
@Datapublic class WriteData {@ExcelProperty("字符串")private String string;@ExcelProperty("日期")private Date date;@ExcelProperty("小数")private Double doubleData;@ExcelIgnoreprivate String ignore;}
构造写入的数据
/*** 初始化写入数据** @return*/public static List<WriteData> initData() {List<WriteData> list = new ArrayList<>();for (int i = 0; i < 10; i++) {WriteData data = new WriteData();data.setString("字符串" + i);data.setDate(new Date());data.setDoubleData(0.56);list.add(data);}return list;}
使用注解@ExcelProperty 标注列名
@ExcelIgnore注解忽略某一个属性
简单写入
指定class作为写入模板,会自动关闭写入流
/*** 指定具体的class作为写入模板,并写入excel的第一个sheet中,文件流会自动关闭** @param fileName* @param filePath* @param list*/public static void simpleWrite(String fileName, String filePath, List<WriteData> list) {EasyExcel.write(filePath, WriteData.class).sheet(fileName).doWrite(list);}
构造写入
构造一张表,构造一个sheet,并将两个组合起来进行写入
注意这种方法必须手动将写入流关闭
/*** 构造进行写入** @param fileName* @param filePath* @param list*/public static void buildExcelWrite(String fileName, String filePath, List<WriteData> list) {ExcelWriter writer = EasyExcel.write(filePath, WriteData.class).build();WriteSheet sheet = EasyExcel.writerSheet(fileName).build();writer.write(list, sheet);//该写法必须关闭写入流writer.finish();}
导出指定列
除了固定列之外,我们可以根据用户传递的参数进行动态配置导出列
排除列
//排除指定列,可以传入列名,或者指定列的索引indexSet<String> excludeColumn = new HashSet<>();excludeColumn.add("dateLabel");/*** 根据传递参数排除指定列*/private static void excludeWrite(String fileName, String filePath, List<WriteData> list, Set<String> excludeColumn) {EasyExcel.write(filePath, WriteData.class).sheet(fileName).excludeColumnFiledNames(excludeColumn).doWrite(list);}
除了排除的列,其余列导出
导出列
/*** 导出指定列** @param fileName* @param filePath* @param list* @param includeColumn*/private static void includeWrite(String fileName, String filePath, List<WriteData> list, Set<String> includeColumn) {EasyExcel.write(filePath, WriteData.class).sheet(fileName).includeColumnFiledNames(includeColumn).doWrite(list);}
除了指定的列,其余没有使用@ExcelIgnore 注解的列都会被导出
指定写入第几列
有些时候为了方便查看,我们可能会设置一些空行作为间隔
@Datapublic class IndexData {@ExcelProperty(value = "字符串标题", index = 0)private String string;@ExcelProperty(value = "日期标题", index = 1)private Date date;/*** 这里设置3 会导致第二列空的*/@ExcelProperty(value = "数字标题", index = 3)private Double doubleData;
写入方法
private static void blankLineWrite(String fileName, String filePath, List<WriteData> list) {EasyExcel.write(filePath,BlankLineData.class).sheet(fileName).doWrite(list);}
只需要指定实体类的索引位置即可
复杂头部写入
在实体类中设置注解@ExcelProperty 的值的时候设置即可
@Datapublic class ComplexHeader {@ExcelProperty({"主标题", "字符串标题"})private String string;@ExcelProperty({"主标题", "日期标题"})private Date date;@ExcelProperty({"主标题", "数字标题"})private Double doubleData;}
继续写入(不覆盖)
写到同一个sheet
可以用来将数据分页导出
/*** 重复写入** @param filePath*/private static void repeatWriteToOneSheet(String filePath) {ExcelWriter excelWriter = null;try {// 这里 需要指定写用哪个class去写excelWriter = EasyExcel.write(filePath, WriteData.class).build();// 这里注意 如果同一个sheet只要创建一次WriteSheet writeSheet = EasyExcel.writerSheet("重复写入").build();// 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来for (int i = 0; i < 5; i++) {// 分页去数据库查询数据 这里可以去数据库查询每一页的数据List<WriteData> data = initData();excelWriter.write(data, writeSheet);}} finally {// 千万别忘记finish 会帮忙关闭流if (excelWriter != null) {excelWriter.finish();}}}
写到不同的sheet中
必须指定每一个sheet的名称和no
private static void repeatWriteToDifferSheet(String filePath) {ExcelWriter excelWriter = null;try {// 这里 指定文件excelWriter = EasyExcel.write(filePath).build();// 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面for (int i = 0; i < 5; i++) {// 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样。这里注意DemoData.class 可以每次都变,我这里为了方便 所以用的同一个class 实际上可以一直变WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).head(WriteData.class).build();// 分页去数据库查询数据 这里可以去数据库查询每一页的数据List<WriteData> data = initData();excelWriter.write(data, writeSheet);}} finally {// 千万别忘记finish 会帮忙关闭流if (excelWriter != null) {excelWriter.finish();}}}
日期字符串转换
将数据格式转换成想要的格式
定义CustomConverter实现Converter
public class CustomConverter implements Converter<String> {@Overridepublic Class supportJavaTypeKey() {return String.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}@Overridepublic String convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {return cellData.getStringValue();}@Overridepublic CellData convertToExcelData(String s, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {return new CellData("自定义: " + s);}}
实体类
@Datapublic class ConvertData {/*** 我想所有的 字符串起前面加上"自定义:"三个字*/@ExcelProperty(value = "字符串标题", converter = CustomConverter.class)private String string;/*** 我想写到excel 用年月日的格式*/@DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")@ExcelProperty("日期标题")private Date date;/*** 写到excel中 用百分比表示*/@NumberFormat("#.##%")@ExcelProperty(value = "数字标题")private Double doubleData;}
运行
List<ConvertData> convertData = initConvertData();convertWrite(fileName, filePath, convertData);//初始化数据public static List<ConvertData> initConvertData() {List<ConvertData> list = new ArrayList<>();for (int i = 0; i < 10; i++) {ConvertData data = new ConvertData();data.setString("字符串" + i);data.setDate(new Date());data.setDoubleData(0.56);list.add(data);}return list;}//执行转换写入private static void convertWrite(String fileName, String filePath, List<ConvertData> list) {EasyExcel.write(filePath, ConvertData.class).sheet(fileName).doWrite(list);}
