模板
写完的效果
实现方式都是通过后置处理器
文件转换器直接通过注解属性声明,因为在我注册进去在写模板的时候不生效
@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查看,然后在代码中设置就好了。