1. 需求分析
用户需要在若依框架中实现 Excel 导出功能,确保每一行的签名能够正确显示,不发生错位,并且导出功能正常。签名可能是图片或文本形式,需要在 Excel 单元格中正确对齐和显示。
2. 技术方案概述
基于若依框架的 Excel 导出功能,结合 EasyExcel 和 POI 库,通过自定义转换器、设置行高列宽、调整单元格对齐方式等实现签名的正确导出。
3. 具体实现步骤
3.1 实体类配置
在需要导出的实体类中,为签名字段添加 @Excel 注解,并指定自定义转换器和单元格样式。
java
arduino
public class YourEntity {
// 其他字段...
@Excel(name = "签名", cellType = ColumnType.IMAGE, width = 20, height = 10, converter = ImageConverter.class)
private String signature;
// getter和setter...
}
3.2 自定义图片转换器
实现 ImageConverter 类,继承 ExcelHandlerAdapter,处理图片数据的转换。
java
scala
public class ImageConverter extends ExcelHandlerAdapter {
@Override
public Object convertToExcelData(Object value, Excel annotation, Integer rowNum) {
// 处理图片数据,返回图片字节流或URL
String imagePath = (String) value;
try {
return ImageIO.read(new File(imagePath));
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
3.3 设置行高列宽
在导出时,通过 EasyExcel 的 WriteHandler 设置合适的行高和列宽,确保签名图片能够完整显示。
java
scala
// 自定义行高列宽处理器
public class CustomRowHeightStyleStrategy extends AbstractRowHeightStyleStrategy {
@Override
protected void setContentColumnHeight(Row row, int relativeRowIndex) {
row.setHeight((short) 400); // 设置行高,单位为1/20个点
}
}
// 在导出时注册处理器
EasyExcel.write(response.getOutputStream(), YourEntity.class)
.registerWriteHandler(new SimpleColumnWidthStyleStrategy(20)) // 列宽20
.registerWriteHandler(new CustomRowHeightStyleStrategy()) // 行高
.sheet("数据")
.doWrite(dataList);
3.4 调整单元格对齐方式
设置单元格的水平和垂直对齐方式,确保签名居中显示。
java
scala
// 自定义单元格样式处理器
public class CustomCellStyleStrategy extends AbstractCellStyleStrategy {
@Override
protected void setContentCellStyle(Cell cell, Head head, Integer relativeRowIndex) {
CellStyle cellStyle = cell.getCellStyle();
cellStyle.setAlignment(HorizontalAlignment.CENTER); // 水平居中
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直居中
cell.setCellStyle(cellStyle);
}
}
// 在导出时注册处理器
EasyExcel.write(response.getOutputStream(), YourEntity.class)
.registerWriteHandler(new CustomCellStyleStrategy())
// 其他处理器...
.sheet("数据")
.doWrite(dataList);
3.5 处理图片缩放和边距
通过自定义 ImageData 设置图片的位置和大小,确保图片适应单元格。
java
arduino
public class ImageUtil {
public static WriteCellData<Void> createImageCell(byte[] imageBytes, int width, int height) {
WriteCellData<Void> cellData = new WriteCellData<>();
ImageData imageData = new ImageData();
imageData.setImageBytes(imageBytes);
imageData.setWidth(width);
imageData.setHeight(height);
// 设置图片边距
imageData.setTop(5);
imageData.setLeft(5);
cellData.setImageDataList(Collections.singletonList(imageData));
return cellData;
}
}
4. 关键代码实现
4.1 导出控制器方法
java
scss
@GetMapping("/export")
public void export(HttpServletResponse response) {
List<YourEntity> dataList = yourService.selectList();
// 处理图片数据...
EasyExcel.write(response.getOutputStream(), YourEntity.class)
.registerWriteHandler(new SimpleColumnWidthStyleStrategy(20))
.registerWriteHandler(new CustomRowHeightStyleStrategy())
.registerWriteHandler(new CustomCellStyleStrategy())
.sheet("签名数据")
.doWrite(dataList);
}
4.2 自定义图片处理
java
scss
public class ImageHandler implements CellWriteHandler {
@Override
public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
if (!isHead && cell.getColumnIndex() == 签名列索引) {
// 调整图片位置和大小
Sheet sheet = writeSheetHolder.getSheet();
Drawing<?> drawing = sheet.createDrawingPatriarch();
ClientAnchor anchor = sheet.getWorkbook().getCreationHelper().createClientAnchor();
anchor.setRow1(cell.getRowIndex());
anchor.setCol1(cell.getColumnIndex());
// 设置图片偏移量
anchor.setDx1(100);
anchor.setDy1(100);
anchor.setDx2(500);
anchor.setDy2(200);
// 添加图片
int pictureIdx = sheet.getWorkbook().addPicture(imageBytes, Workbook.PICTURE_TYPE_PNG);
drawing.createPicture(anchor, pictureIdx);
}
}
}
5. 测试与优化
- 测试不同尺寸的签名图片导出效果
- 调整行高列宽参数,确保签名完整显示
- 测试大量数据导出时的性能和格式正确性
6. 注意事项
- 确保图片路径或 URL 正确,避免图片加载失败
- 对于文本签名,设置合适的字体大小和对齐方式
- 导出前预览 Excel 文件,检查是否有错位或格式问题
- 考虑 Excel 版本兼容性,建议使用.xlsx 格式