EasyExcel写模板文件带图片和选择框

模板

写完的效果


 

实现方式都是通过后置处理器

文件转换器直接通过注解属性声明,因为在我注册进去在写模板的时候不生效

@ExcelProperty(converter = MyFileConverter.class)
private File image1;
@ExcelProperty(converter = MyFileConverter.class)
private File image2;
@ExcelProperty(converter = MyFileConverter.class)
private File image3;
@ExcelProperty(converter = MyFileConverter.class)
private File image4;
文件转换器
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.alibaba.excel.util.FileUtils;

import java.io.File;

public class MyFileConverter implements Converter<File> {

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }
 
    @Override
    public Class supportJavaTypeKey() {
        return File.class;
    }
 
    @Override
    public File convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty,
                               GlobalConfiguration globalConfiguration) {
        return null;
    }
 
 
    @Override
    public WriteCellData<?> convertToExcelData(File file, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration)throws Exception {
        if(file == null) {
            return new WriteCellData<>(CellDataTypeEnum.EMPTY);
        }
        byte[] bytes = FileUtils.readFileToByteArray(file);
        return new WriteCellData<>(bytes);
    }
}

处理器代码

import com.alibaba.excel.metadata.data.ImageData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.springframework.util.CollectionUtils;

import java.util.List;

public class CustomCellWriteHandler implements CellWriteHandler {
    private static final String FONT_NAME = "Wingdings 2";

    @Override
    public void afterCellDispose(CellWriteHandlerContext context) {
        Cell cell = context.getCell();
        CellType cellType = cell.getCellType();
        if(!CellType.STRING.equals(cellType)) {
            return;
        }
        String cellValue = cell.getStringCellValue();
        if(StringUtils.isBlank(cellValue)) {
            return;
        }
        WriteWorkbookHolder writeWorkbookHolder = context.getWriteWorkbookHolder();
        Workbook workbook = writeWorkbookHolder.getWorkbook();
        // 图片处理
        if(cellValue.contains("照片")) {
            Sheet sheet = workbook.getSheetAt(0);
            Drawing<?> drawingPatriarch = sheet.createDrawingPatriarch();
            List<WriteCellData<?>> cellDataList = context.getCellDataList();
            for (int i = 0; i < cellDataList.size(); i++) {
                List<ImageData> imageDataList = cellDataList.get(i).getImageDataList();
                if(CollectionUtils.isEmpty(imageDataList)) {
                    continue;
                }
                byte[] bytes = imageDataList.get(0).getImage();
                // 图片位置
                ClientAnchor anchor = drawingPatriarch.createAnchor(50, 50, 50, 50, (short) (3 + i), 33, (short) (4 + i), 34);
                int picture = workbook.addPicture(bytes, HSSFWorkbook.PICTURE_TYPE_JPEG);
                drawingPatriarch.createPicture(anchor, picture);
            }
            return;
        }
        // 选择框处理
        XSSFRichTextString richString = new XSSFRichTextString(cellValue);
        char[] chars = cellValue.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            if(chars[i] == 'R' || chars[i] == '£') {
                Font font = workbook.createFont();
                font.setFontName(FONT_NAME);
                richString.applyFont(i, i + 1, font);
            }
        }
        cell.setCellValue(richString);
    }
}
EasyExcelFactory.write(writeFileName)
                    .registerWriteHandler(new CustomCellWriteHandler())
                    .withTemplate("D:\\data\\test\\做好的模板.xlsx")
                    .sheet().doFill(excelValue);

        

        写模板的时候图片的变量直接被替换成空了,所以直接用单元格中的值做的判断。图片的变量主要作用是调用单元格写处理器。

        选择框是利用富文本编辑器设置不同的字体,是什么字体可以用做好的excel查看,然后在代码中设置就好了。

好的,这里提供使用Spring Boot和EasyExcel实现excel模板文件下载的示例代码: ```java @RestController public class ExcelController { @GetMapping("/downloadExcelTemplate") public void downloadExcelTemplate(HttpServletResponse response) throws IOException { String fileName = "excel_template.xlsx"; String sheetName = "Sheet1"; List<List<String>> head = new ArrayList<>(); head.add(Arrays.asList("姓名", "年龄", "性别")); ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(new ClassPathResource("templates/" + fileName).getInputStream()).build(); WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).build(); excelWriter.fill(head, writeSheet); excelWriter.finish(); response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); response.flushBuffer(); } } ``` 在上述代码中,我们使用了`@RestController`注解来声明一个控制器,然后定义了`downloadExcelTemplate`方法来实现excel模板文件下载功能。在该方法中,我们通过`EasyExcel.write()`方法创建了一个ExcelWriter对象,并通过`withTemplate()`方法指定了模板文件的路径。 接下来,我们创建了一个WriteSheet对象,并通过`EasyExcel.writerSheet()`方法设置了sheet的名称。然后,我们通过`excelWriter.fill()`方法将表头数据入Excel文件中。最后,我们设置响应头并关闭流,即可实现excel模板文件下载功能。 需要注意的是,上述代码中的模板文件必须放在resources/templates目录下。如果您的模板文件不在该目录下,请修改文件路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值