java使用easyexcel导出文件,自定义样式

实体类

package com.control.domain.vo;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.*;
import com.alibaba.excel.enums.BooleanEnum;
import com.alibaba.excel.enums.poi.BorderStyleEnum;
import com.alibaba.excel.enums.poi.FillPatternTypeEnum;
import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;

import java.util.Date;

/**
 * 描述 : TODO<br/>
 * 作者 : <br/>
 * 时间 : 2023-12-21 9:00:41<br/>
 */
@Data
@EqualsAndHashCode
@HeadStyle
@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, borderTop = BorderStyleEnum.THIN,
		borderBottom = BorderStyleEnum.THIN, borderLeft = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN)
@ContentFontStyle(fontHeightInPoints = 12)
@ContentRowHeight(30)
@HeadRowHeight(30)
public class OutAluminumTaskExcel {

	@ColumnWidth(value = 7)
	@ExcelProperty({ "偏差统计及任务列表", "偏差统计及任务列表", "报告时间", "序号" })
	private Integer id;

	@ColumnWidth(value = 20)
	@ExcelProperty({ "偏差统计及任务列表", "偏差统计及任务列表", "报告时间", "单位" })
	private String pApartment;

	@ColumnWidth(value = 15)
	@ExcelProperty({ "偏差统计及任务列表", "偏差统计及任务列表", "", "槽号" })
	private String slotNo;

	/**
	 * 实际出铝量
	 */
	@ColumnWidth(value = 15)
	@ExcelProperty({ "偏差统计及任务列表", "偏差统计及任务列表", "", "任务量(kg)" })
	private String realOutAluminumWeight;

	/**
	 * 计划出铝量
	 */
	@ColumnWidth(value = 15)
	@ExcelProperty({ "偏差统计及任务列表", "偏差统计及任务列表", "", "实出量(kg)" })
	private String planOutAluminumWeight;

	@ColumnWidth(value = 20)
	@ExcelProperty({ "偏差统计及任务列表", "偏差统计及任务列表", "出铝日期", "出铝偏差(kg)" })
	private String diffOutAluminumWeight;

	@ColumnWidth(value = 15)
	@ExcelProperty({ "偏差统计及任务列表", "偏差统计及任务列表", "", "偏差等级" })
	private String taskLevel;

	@ColumnWidth(value = 15)
	@ExcelProperty({ "偏差统计及任务列表", "偏差统计及任务列表", "", "任务类型" })
	private String taskName;

	@ColumnWidth(value = 10)
	@ExcelProperty({ "偏差统计及任务列表", "偏差统计及任务列表", "", "责任人" })
	private String taskSendPerson;

	@ColumnWidth(value = 22)
	@ExcelProperty({ "偏差统计及任务列表", "偏差统计及任务列表", "", "任务发出时间" })
	private Date createTime;

	@ExcelProperty({ "偏差统计及任务列表", "偏差统计及任务列表", "", "建议" })
	@ColumnWidth(value = 150)
	@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.LEFT)
	private String opinionNote;

}

测试类中的测试方法

@Disabled
	@DisplayName("excel绘制")
	@Test
	public void exportExcel() throws IOException {
		// pOutAluminumTasksController.exportExcel(null);
		String path = "C:\\Users\\xxx\\Desktop\\";
		String fileName = path + "偏差统计及任务列表" + ".xlsx";
		List<OutAluminumTaskExcel> outAluminumTask = pTaskMapper.getOutAluminumTask(DateUtil.beginOfDay(new Date()));
		// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
		EasyExcel.write(fileName, OutAluminumTaskExcel.class).registerWriteHandler(new CellWriteHandler() {
			@Override
			public void afterCellDispose(CellWriteHandlerContext context) {
				if (context.getRowIndex() == 0) {
					if (context.getColumnIndex() == 0) {
						Workbook workbook = context.getWriteWorkbookHolder().getWorkbook();
						Font font = workbook.createFont();
						font.setFontHeightInPoints((short) 32);
						font.setColor(Font.COLOR_RED);
						font.setFontName("宋体");
						CellStyle cellStyle = workbook.createCellStyle();
						cellStyle.setFillBackgroundColor(IndexedColors.GREY_50_PERCENT.getIndex());
						// cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
						cellStyle.setFont(font);
						cellStyle.setAlignment(HorizontalAlignment.CENTER);
						cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
						context.getCell().setCellStyle(cellStyle);
						context.getFirstCellData().setWriteCellStyle(null);
					}
				}
				else if (context.getRowIndex() == 2) {
					if (context.getColumnIndex() == 2) {
						context.getCell().setCellValue(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm"));
					}
					else if (context.getColumnIndex() == 6) {
						context.getCell().setCellValue(DateUtil.format(new Date(), "yyyy年MM月dd日"));
					}
				}

			}
		}).sheet("偏差统计及任务列表").doWrite(outAluminumTask);
	}

效果图
在这里插入图片描述

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于复杂自定义表头的导出,可以使用EasyExcel的注解`@ExcelProperty`来实现。具体步骤如下: 1. 创建表头实体类,使用`@ExcelProperty`注解来定义表头名称和对应的字段。 ```java public class ComplexHeadData { @ExcelProperty({"主标题", "名称"}) private String name; @ExcelProperty({"主标题", "数量"}) private Integer number; @ExcelProperty({"主标题", "价格"}) private Double price; @ExcelProperty({"次标题", "子名称"}) private String subName; @ExcelProperty({"次标题", "子数量"}) private Integer subNumber; @ExcelProperty({"次标题", "子价格"}) private Double subPrice; // 省略getter和setter方法 } ``` 2. 创建导出数据集合,并将数据集合和表头实体类传入`EasyExcel.write()`方法中,使用`Sheet`对象来设置表头。 ```java List<ComplexHeadData> data = ... Sheet sheet = new Sheet(1, 0, ComplexHeadData.class); // 设置主标题行 List<List<String>> head = new ArrayList<>(); head.add(Arrays.asList("主标题", "名称", "数量", "价格")); // 设置次标题行 head.add(Arrays.asList("次标题", "子名称", "子数量", "子价格")); // 设置表头样式 WriteCellStyle headStyle = new WriteCellStyle(); // ... 设置样式 // 设置主标题行的样式 WriteCellStyle mainHeadStyle = new WriteCellStyle(headStyle); mainHeadStyle.setFillForegroundColor(IndexedColors.BLUE_GREY.getIndex()); // 设置次标题行的样式 WriteCellStyle subHeadStyle = new WriteCellStyle(headStyle); subHeadStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); // 设置主标题行和次标题行的样式 WriteCellStyle headCellStyle = new WriteCellStyle(); headCellStyle.setWrapped(true); headCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); headCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); headCellStyle.setMainHeadStyle(mainHeadStyle); headCellStyle.setSubHeadStyle(subHeadStyle); // 设置表头 sheet.setHead(head); sheet.setHeadStyle(headCellStyle); // 写入数据到Excel EasyExcel.write(outputStream, ComplexHeadData.class).sheet().doWrite(data); ``` 通过以上步骤,即可实现复杂自定义表头的导出。需要注意的是,`@ExcelProperty`注解中的数组参数表示表头的层级关系,数组的第一个元素为主标题,第二个元素为次标题,以此类推。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值