依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.6</version>
</dependency>
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
压缩图片工具类:
@description: 调用Thumbnails压缩图片
public class ImgUtil {
private static Logger logger = LoggerFactory.getLogger(ImgUtil.class);
/**
* 根据指定大小压缩图片
*
* @param imageBytes 源图片字节数组
* @param desFileSize 指定图片大小,单位kb
* @param imageId 影像编号
* @return 压缩质量后的图片字节数组
*/
public static byte[] compressPicForScale(byte[] imageBytes, long desFileSize, String imageId) {
if (imageBytes == null || imageBytes.length <= 0 || imageBytes.length < desFileSize * 1024) {
return imageBytes;
}
long srcSize = imageBytes.length;
//double accuracy = getAccuracy(srcSize / 1024);
double accuracy=0.4;
try {
while (imageBytes.length > desFileSize * 1024) {
ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
//Thumbnails用来压缩图片的工具
Thumbnails.of(inputStream)
.scale(accuracy)
.outputQuality(accuracy)
.toOutputStream(outputStream);
imageBytes = outputStream.toByteArray();
}
logger.info("【图片压缩】imageId={} | 图片原大小={}kb | 压缩后大小={}kb",
imageId, srcSize / 1024, imageBytes.length / 1024);
} catch (Exception e) {
logger.error("【图片压缩】msg=图片压缩失败!", e);
}
return imageBytes;
}
/**
* 自动调节精度(经验数值)
*
* @param size 源图片大小
* @return 图片压缩质量比
*/
private static double getAccuracy(long size) {
double accuracy;
if (size < 900) {
accuracy = 0.5;
} else if (size < 2047) {
accuracy = 0.6;
} else if (size < 3275) {
accuracy = 0.44;
} else {
accuracy = 0.4;
}
return accuracy;
}
}
存至excel的转化器
/**
* @author Hai
* @program: subtlechat
* @description: 将URL图片的格式转化器
* @create 2020/10/8 - 12:45
**/
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();
//openConnection:返回一个URLConnection实例,该实例表示到URL引用的远程对象的连接。
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);
byte[] compressBytes = ImgUtil.compressPicForScale(bytes,200, UUID.randomUUID().toString());
return new CellData(compressBytes);
}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();
}
}
}
}
Excel导入导出的数据类
@Data
@ColumnWidth(25)
@ContentRowHeight(30)
public class GroupMsgContentData {
@ExcelProperty("消息内容编号")
private Integer id;
@ExcelProperty("发送者的编号")
private Integer fromId;
@ExcelProperty("昵称")
private String fromName;
//@ExcelProperty(value = "头像",converter = UrlImageConverter.class)
@ExcelIgnore
private URL fromProfile;
@ExcelProperty("发送时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date createTime;
@ExcelProperty(value = {"内容","文本"})
@ColumnWidth(50)
private String textContent;
@ExcelProperty(value = {"内容","图片"},converter = MyUrlImageConverter.class)
@ColumnWidth(50)
private URL imageContent;
@ExcelIgnore
private Integer messageTypeId;
@Override
public String toString() {
return "GroupMsgContentData{" +
"id=" + id +
", fromId=" + fromId +
", fromName='" + fromName + '\'' +
", fromProfile=" + fromProfile +
", createTime=" + createTime +
", textContent='" + textContent + '\'' +
", imageContent=" + imageContent +
", messageTypeId=" + messageTypeId +
'}';
}
注意保存图片的这一数据是:
@ExcelProperty(value = {“内容”,“图片”},converter = MyUrlImageConverter.class)
@ColumnWidth(50)
private URL imageContent;
将数据库实体转化为excel实体
public static GroupMsgContentData convertEntityToData(GroupMsgContent groupMsgContent) throws MalformedURLException {
GroupMsgContentData groupMsgContentData = new GroupMsgContentData();
groupMsgContentData.setFromId(groupMsgContent.getFromId());
groupMsgContentData.setId(groupMsgContent.getId());
groupMsgContentData.setFromName(groupMsgContent.getFromName());
groupMsgContentData.setCreateTime(groupMsgContent.getCreateTime());
//转化为URL以Excel导出图片
groupMsgContentData.setFromProfile(new URL(groupMsgContent.getFromProfile()));
//根据消息类型设置内容
if (groupMsgContent.getMessageTypeId()==1){
groupMsgContentData.setTextContent(groupMsgContent.getContent());
}
if (groupMsgContent.getMessageTypeId()==2){
groupMsgContentData.setImageContent(new URL(groupMsgContent.getContent()));
}
return groupMsgContentData;
}