1.在实际使用问卷星对班级的学生的健康码、核算记录、行程码进行统计时,导出的excel里是链接而非图片,但是上级要求上交的excel必须是图片为解决该问题,通过以下的main方法解决了该问题。
package com.changshin;
import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Sheet;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.List;
public class ExcelExe {
public static void main(String[] args) {
ExcelWriter writer = null;
try {
File file = new File("C:\\Users\\64913\\Desktop\\180522852_0_五(7)班学生和家长健康码、行程码、核酸结果收集_54_54.xlsx");
FileInputStream input = new FileInputStream(file);
// 2.应用HUtool ExcelUtil获取ExcelReader指定输入流和sheet
ExcelReader excelReader = ExcelUtil.getReader(input, "Sheet1");
// 可以加上表头验证
// 3.读取第二行到最后一行数据
List<List<Object>> read = excelReader.read(1, excelReader.getRowCount());
writer = ExcelUtil.getWriter("D:\\1.xlsx");
for (int i = 0; i < read.size(); i++) {
int num = 0;
for (int j = 0; j < read.get(i).size(); j++) {
if (String.valueOf(read.get(i).get(j)).indexOf("http") == 0) {
BufferedImage bufferedImage = ImgUtil.read(URLUtil.url(String.valueOf(read.get(i).get(j))));
Image image = ImgUtil.scale(bufferedImage, 0.5f);
String prix = String.valueOf(read.get(i).get(j));
int end = prix.lastIndexOf("?");
String prixs = prix.substring(end - 4, end);
System.out.println(prixs);
byte[] pictureData = ImgUtil.toBytes(image, "jpg");
writer.setDefaultRowHeight(70);
writer.setColumnWidth(-1, 30);
//写入图片
writePic(writer, num, i, pictureData, HSSFWorkbook.PICTURE_TYPE_JPEG);
num++;
}
}
System.out.println("当前数据" + i);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
writer.close();
}
}
/**
* @param writer
* @param x 单元格x轴坐标
* @param y 单元格y轴坐标
* @param pictureData 图片二进制数据
* @param picType 图片格式
*/
private static void writePic(ExcelWriter writer, int x, int y, byte[] pictureData, int picType) {
Sheet sheet = writer.getSheet();
Drawing drawingPatriarch = sheet.createDrawingPatriarch();
//设置图片单元格位置
ClientAnchor anchor = drawingPatriarch.createAnchor(0, 0, 0, 0, x, y, x + 1, y + 1);
//随单元格改变位置和大小
anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
//添加图片
int pictureIndex = sheet.getWorkbook().addPicture(pictureData, picType);
drawingPatriarch.createPicture(anchor, pictureIndex);
}
}
使用的maven配置为
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.6.6</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.0.0</version>
</dependency>