解析excel中的图片
前言
初始化数据是,需要将excel中的数据解析并插入数据库。
但是某几列存放的是图片,这时候怎么办呢。
主要解决的是:获取excel中指定行列的图片字节。
一、pom依赖
解析文件的依赖
java
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
如果执行接口报错的话,可能是poi和log4j有冲突,log4j换成下面的依赖
java
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.17.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.17.1</version>
</dependency>
二、使用步骤
1.示例数据
excel的M、N列是图片,对应index为:12、13
2.代码如下(示例):
java
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFPicture;
import org.apache.poi.xssf.usermodel.XSSFPictureData;
import org.apache.poi.xssf.usermodel.XSSFShape;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.multipart.MultipartFile;
@GetMapping(value = "/uploadPointFile")
public List<String> uploadPointFile(@RequestParam(value = "file") MultipartFile file) throws Exception {
LinkedList<String> insertSql = new LinkedList<>();
String OG_POINT = "INSERT INTO `table_one`(`id`, `city`, `district`, `street`, `community`, `name`, `address`, `deleted`, `gaoDe_log`, `gaoDe_lat`, `label`, `contact_user`, `contact_mobile`, `remark`,`link_path`, `create_community`, `created_time`, `updated_time`) VALUES ('%s', '%s', '%s', '%s', '%s', '%s','%s', 0, '%s', '%s', '%s', '%s', '%s', '%s','%s', '510121',now(),now());";
String OGP_PICTURE = "INSERT INTO `table_two`(`id`, `point_id`, `picture_url`, `deleted`, `created_time`, `updated_time`) VALUES ('%s', '%s', 'https://xxxxx/x/%s', 0,now(),now());";
InputStream inputStream = file.getInputStream();
Workbook workbook = new XSSFWorkbook(inputStream);
// 获取第一个工作表
Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
if (row.getRowNum() == 0) {
continue; // 跳过表头
}
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
// 获取前两列内容作为图片名
String ogSql = String.format(OG_POINT, uuid, row.getCell(0).toString().substring(0, 4), row.getCell(0).toString(), row.getCell(1).toString(), row.getCell(2).toString(), row.getCell(3).toString(), row.getCell(4).toString(), row.getCell(5).toString(), row.getCell(6).toString(), row.getCell(7).toString(), row.getCell(8).toString(), row.getCell(9).toString(), row.getCell(10).toString(), row.getCell(11).toString());
//打印point 的sql
insertSql.add(ogSql);
// 获取工作表中的绘图对象
XSSFDrawing drawing = (XSSFDrawing) sheet.getDrawingPatriarch();
if (drawing == null) {
continue; // 如果没有绘图对象则跳过
}
// 获取所有形状
List<XSSFShape> shapes = drawing.getShapes();
for (XSSFShape shape : shapes) {
if (shape instanceof XSSFPicture) {
XSSFPicture picture = (XSSFPicture) shape;
XSSFClientAnchor anchor = (XSSFClientAnchor) picture.getAnchor();
// 检查图片是否在目标单元格中
if (row.getRowNum() == anchor.getRow1() && (anchor.getCol1() == 12 || anchor.getCol1() == 13)) {
// 获取图片数据
XSSFPictureData pictureData = picture.getPictureData();
byte[] pictureBytes = pictureData.getData();
String fileExtension = pictureData.suggestFileExtension();
//调用文件上传接口
String pictureUrl = "xxxxxxx";
String pictureUuid = UUID.randomUUID().toString().replaceAll("-", "");
String pictureSql = String.format(OGP_PICTURE, pictureUuid, uuid, pictureUrl);
insertSql.add(pictureSql);
}
}
}
}
return insertSql;
}
总结
没有总结,歪比巴卜