Springboot 使用EasyExcel导出含图片并设置样式的Excel文件
- Excel导出系列目录:
- ★★★★尤其注意:
- 引入依赖
- 创建导出模板类
- 逻辑处理
- controller
- service
- 导出效果
- 总结
Excel导出系列目录:
【Springboot 使用EasyExcel导出Excel文件】
【Springboot 使用EasyExcel导出含图片并设置样式的Excel文件】
【Springboot 使用POI导出Excel文件】
【Springboot 导出Excel文件方式对比与注意事项】
★★★★尤其注意:
WPS对xlsx后缀文件兼容性不好
,如果样式要求高,需要兼容各种excel软件,那就导出xls后缀的文件
。具体见【Springboot 导出Excel文件方式对比与注意事项】
本文使用EasyExcel
导出xlsx后缀
的含指定样式图片的Excel文件,用于解决上一篇文章:【Springboot 使用EasyExcel导出Excel文件】的遗留问题
引入依赖
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version>
</dependency>
创建导出模板类
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.converters.string.StringImageConverter;
import com.alibaba.excel.metadata.data.WriteCellData;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.io.File;
import java.io.InputStream;
import java.net.URL;@Data
@EqualsAndHashCode
@ContentRowHeight(100)
@ColumnWidth(100 / 8)
public class ImageDemoData {private File file;private InputStream inputStream;/*** 如果string类型 必须指定转换器,string默认转换成string*/@ExcelProperty(converter = StringImageConverter.class)private String string;private byte[] byteArray;/*** 根据url导出** @since 2.1.1*/private URL url;/*** 根据文件导出 并设置导出的位置。** @since 3.0.0-beta1*/private WriteCellData<Void> writeCellDataFile;
}
逻辑处理
controller
@RestController
@Slf4j
@RequestMapping({"/v1/test"})
public class TestController {@Resourceprivate TestService testService;@PostMapping("/export_record")public void exportRecord(@RequestBody GetRecordDto dto) {testService.exportRecord(dto);log.info("/export_record 导出记录完毕");}
}
service
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.data.ImageData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.util.FileUtils;
import com.alibaba.excel.util.ListUtils;
import java.io.File;
import java.io.InputStream;
import java.net.URL;@Override
public void exportRecord(GetRecordDto dto) {String fileName = "导出文件下载地址,后缀为xlsx";String imagePath = "图片地址";try (InputStream inputStream = FileUtils.openInputStream(new File(imagePath))) {List<ImageDemoData> list = ListUtils.newArrayList();ImageDemoData imageDemoData = new ImageDemoData();list.add(imageDemoData);// 放入五种类型的图片 实际使用只要选一种即可imageDemoData.setByteArray(FileUtils.readFileToByteArray(new File(imagePath)));imageDemoData.setFile(new File(imagePath));imageDemoData.setString(imagePath);imageDemoData.setInputStream(inputStream);imageDemoData.setUrl(new URL("图片url"));// 这里演示// 需要额外放入文字// 而且需要放入2个图片// 第一个图片靠左// 第二个靠右 而且要额外的占用他后面的单元格WriteCellData<Void> writeCellData = new WriteCellData<>();imageDemoData.setWriteCellDataFile(writeCellData);// 这里可以设置为 EMPTY 则代表不需要其他数据了writeCellData.setType(CellDataTypeEnum.STRING);writeCellData.setStringValue("额外的放一些文字");// 可以放入多个图片List<ImageData> imageDataList = new ArrayList<>();ImageData imageData = new ImageData();imageDataList.add(imageData);writeCellData.setImageDataList(imageDataList);// 放入2进制图片imageData.setImage(FileUtils.readFileToByteArray(new File(imagePath)));// 图片类型imageData.setImageType(ImageData.ImageType.PICTURE_TYPE_PNG);// 上 右 下 左 需要留空// 这个类似于 css 的 margin// 这里实测 不能设置太大 超过单元格原始大小后 打开会提示修复。暂时未找到很好的解法。imageData.setTop(5);imageData.setRight(5);imageData.setBottom(5);imageData.setLeft(5);// 放入第二个图片imageData = new ImageData();imageDataList.add(imageData);writeCellData.setImageDataList(imageDataList);imageData.setImage(FileUtils.readFileToByteArray(new File(imagePath)));imageData.setImageType(ImageData.ImageType.PICTURE_TYPE_PNG);imageData.setTop(5);imageData.setRight(5);imageData.setBottom(5);imageData.setLeft(50);// 设置图片的位置 假设 现在目标 是 覆盖 当前单元格 和当前单元格右边的单元格// 起点相对于当前单元格为0 当然可以不写imageData.setRelativeFirstRowIndex(0);imageData.setRelativeFirstColumnIndex(0);imageData.setRelativeLastRowIndex(0);// 前面3个可以不写 下面这个需要写 也就是 结尾 需要相对当前单元格 往右移动一格// 也就是说 这个图片会覆盖当前单元格和 后面的那一格imageData.setRelativeLastColumnIndex(1);// 写入数据EasyExcel.write(fileName, ImageDemoData.class).sheet().doWrite(list);}catch (Exception e){log.error("export error: ",e);}
}
导出效果
总结
这个我是在网上找的,我也拿到代码在本地环境实操了,确认没有问题可以实现,我这边简单的实现直接生成文件到本地了,具体返回response流的方式大家可以借鉴我的上一篇文章:【Springboot 使用EasyExcel导出Excel文件】
借鉴来源:easyExcel帮助文档
这个文档已经迁移到该地址:easyExcel帮助文档-新地址
但是目前两个地址都是可以用的,我还是推荐用旧地址,新地址的该实例描述的截图不正确,容易错过,大家要注意。