1.easyexcel导出图片简单操作参考官网
2.项目中遇到的问题:项目导出报表需要导出图片
easyexcel导出图片,数据库中的存储的图片是字符串类型(实际上还是图片的URL链接),需要先转为URL,再进行导出操作.
图片字段需要自己重新定义Conventer类:
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.alibaba.excel.util.IoUtils;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
public class MyUrlImageConverter implements Converter<URL> {
@Override
public Class supportJavaTypeKey() {
return URL.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.IMAGE;
}
@Override
public URL convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
throw new UnsupportedOperationException("Cannot convert images to url.");
}
@Override
public CellData convertToExcelData(URL value, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) throws IOException {
InputStream inputStream = null;
try {
//开启连接
URLConnection uc = value.openConnection();
URL url = null;
//获取响应状态
int statusCode = ((HttpURLConnection) uc).getResponseCode();
switch (statusCode){
case 200:
inputStream = value.openStream();
break;
case 404:
//默认给一个图片
url = new URL("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1598096095144&di=9a72ad26e83effb9341c711c9818b85f&imgtype=0&src=http%3A%2F%2Fpic.616pic.com%2Fys_bnew_img%2F00%2F11%2F69%2Fj2AjnHspwT.jpg");
inputStream = url.openStream();
break;
default :
url = new URL("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1598096095144&di=9a72ad26e83effb9341c711c9818b85f&imgtype=0&src=http%3A%2F%2Fpic.616pic.com%2Fys_bnew_img%2F00%2F11%2F69%2Fj2AjnHspwT.jpg");
inputStream = url.openStream();
break;
}
byte[] bytes = IoUtils.toByteArray(inputStream);
return new CellData(bytes);
}catch (ConnectException exception){
//捕获下链接异常
URL url = new URL("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1598096095144&di=9a72ad26e83effb9341c711c9818b85f&imgtype=0&src=http%3A%2F%2Fpic.616pic.com%2Fys_bnew_img%2F00%2F11%2F69%2Fj2AjnHspwT.jpg");
inputStream = url.openStream();
byte[] bytes = IoUtils.toByteArray(inputStream);
return new CellData(bytes);
}catch (FileNotFoundException fileNotFoundException){
URL url = new URL("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1598096095144&di=9a72ad26e83effb9341c711c9818b85f&imgtype=0&src=http%3A%2F%2Fpic.616pic.com%2Fys_bnew_img%2F00%2F11%2F69%2Fj2AjnHspwT.jpg");
inputStream = url.openStream();
byte[] bytes = IoUtils.toByteArray(inputStream);
return new CellData(bytes);
}finally {
if (inputStream != null) {
inputStream.close();
}
}
}
}
返回的实体类:
ic class Image {
/**
* 图片导出
* <p>
* 1. 创建excel对应的实体对象 参照{@link ImageData}
* <p>
* 2. 直接写即可
*/
public void imageWrite() throws Exception {
String fileName = "C:\\Users\\Administrator\\Desktop" + File.separator + "demo.xlsx";
try {
List<Teacher> list = new ArrayList<Teacher>();
Teacher teacher = new Teacher();
teacher.setName("zs").setImg(new URL("https://img.huiding-cloud.com/green-street/png/202102/2021022515328161423354747304712.png"));
list.add(teacher);
EasyExcel.write(fileName, Teacher.class).sheet().doWrite(list);
} catch (Exception e) {
e.printStackTrace();
}
}
测试类
public static void main(String[] args) {
Image image = new Image();
try {
image.imageWrite();
} catch (Exception e) {
e.printStackTrace();
}
}