设计写入实体类
@Data
public class WriteData {
@ExcelProperty("字符串")
private String string;
@ExcelProperty("日期")
private Date date;
@ExcelProperty("小数")
private Double doubleData;
@ExcelIgnore
private 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();
}
导出指定列
除了固定列之外,我们可以根据用户传递的参数进行动态配置导出列
排除列
//排除指定列,可以传入列名,或者指定列的索引index
Set<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 注解的列都会被导出
指定写入第几列
有些时候为了方便查看,我们可能会设置一些空行作为间隔
@Data
public 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 的值的时候设置即可
@Data
public 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> {
@Override
public Class supportJavaTypeKey() {
return String.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
@Override
public String convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
return cellData.getStringValue();
}
@Override
public CellData convertToExcelData(String s, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
return new CellData("自定义: " + s);
}
}
实体类
@Data
public 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);
}