Java使用POI解析帶圖片的excel文件(簡潔好用!)
一、場景
這天遇到這個這樣的需求,需要導入表格中的數(shù)據(jù),還得支持帶圖片;這應該難不倒咱阿里的EasyExcel,打開官網(wǎng)文檔一看哦豁,明確表示暫時不支持解析帶圖片的Excel......

好了,這下只能看POI了,然后想起來項目里引入的HuTools工具類,它應該封裝好了吧;于是決定用HuTools里面的ExcelUtil來實現(xiàn)!
二、秀個騷操作,使用EasyExcel+HuTools(POI)實現(xiàn)解析
說明:因為EasyExcel實在太好用了,加上看完HuTools工具類的方法發(fā)現(xiàn),圖片解析是單獨的,所以決定使用EasyExcel來解析數(shù)據(jù),用HuTools工具類來解析里面的圖片;如果表格數(shù)據(jù)過大則謹慎使用筆者這種方式哦。
1、定義EasyExcel解析用到的與表格映射的JavaBean
/**
* <p>
* 任務表格映射
* </p>
*
* @author kobe
* @since 2023-03-04
*/
@Data
public class TaskExcelDto implements Serializable {
private static final long serialVersionUID = 1L;
//這個注解表示解析的時候忽略
@ExcelIgnore
private Long id;
@ExcelProperty("姓名")
private String name;
@ExcelProperty("歸屬狀態(tài)")
private String status;
@ExcelProperty("計劃代碼")
private String planCode;
@ExcelProperty("日期")
private Date issueDate;
@ExcelProperty("時間")
private String time;
@ExcelProperty("任務分類")
private String types;
@ExcelProperty("訂單號")
private String orderNum;
@ExcelProperty("金額")
private Double money;
@ExcelProperty("提成")
private Double divvy;
@ExcelProperty("總金額")
private Double totalMoney;
@ExcelProperty("計劃人")
private String planer;
@ExcelProperty("所設關鍵詞")
private String keywords;
@ExcelIgnore
private String picture;
// 圖片數(shù)據(jù),臨時變量
@ExcelIgnore
private PictureData pictureData;
}2、實現(xiàn)代碼
@ApiOperation("excel導入")
@PostMapping("v1/excel/import")
public JsonResult importByExcel(MultipartFile file) throws IOException {
List<TaskExcelDto> list = new ArrayList<>();
// EasyExcel解析普通數(shù)據(jù)(這里為了演示簡單寫一下,實戰(zhàn)建議寫個實現(xiàn)類)
EasyExcel.read(file.getInputStream(), TaskExcelDto.class, new AnalysisEventListener<TaskExcelDto>() {
@Override
public void invoke(TaskExcelDto data, AnalysisContext context) {
list.add(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}
}).sheet().doRead();
// 使用HuTools工具類解析表格的圖片
//注意這個方法只能讀取浮動的圖片,嵌入單元格的讀取不到!
//注意這個方法只能讀取浮動的圖片,嵌入單元格的讀取不到!
//注意這個方法只能讀取浮動的圖片,嵌入單元格的讀取不到!
ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
//key是圖片位置,row_cell的格式;value是圖片數(shù)據(jù)
Map<String, PictureData> picMap = ExcelPicUtil.getPicMap(reader.getWorkbook(), 0);
//這里只關心行數(shù),把數(shù)據(jù)裝到Bean里面去,也可用map在循環(huán)中取獲取
picMap.forEach((k, v) -> {
String[] split = k.split(StrUtil.UNDERLINE);
Integer index = Integer.valueOf(split[0]);
list.get(index - 1).setPictureData(v);
});
//建議使用并行流上傳圖片,多線程加速
list.stream().parallel().forEach(i -> {
if (null == i.getPictureData()) {
return;
}
String mimeType = i.getPictureData().getMimeType();
String[] mimeTypes = mimeType.split(StrUtil.SLASH);
try {
String fileName = UUID.randomUUID() + "." + mimeTypes[1];
FileUploadResult fileUploadResult = super.uploadFile(i.getPictureData().getData(), fileName );
i.setPicture(fileUploadResult != null ? fileUploadResult.getWebPath());
} catch (IOException e) {
log.error("file upload error, {}", JSONUtil.toJsonStr(i));
}
});
// 調用業(yè)務代碼保存數(shù)據(jù)
service.importByExcel(list);
return JsonResult.success();
}3、注意:
這個讀取方法只能讀取浮動的圖片,嵌入單元格的讀取不到!如果發(fā)現(xiàn)沒讀取到,檢查一下Excel中圖片在單元格中的樣式,右擊“切換為浮動圖片”即可。
總結
到此這篇關于Java使用POI解析帶圖片的excel文件的文章就介紹到這了,更多相關Java解析帶圖片excel內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot中@Autowired注入service時出現(xiàn)循環(huán)依賴問題的解決方法
在Spring Boot開發(fā)過程中,@Autowired注入Service時出現(xiàn)循環(huán)依賴是一個常見問題,循環(huán)依賴指的是兩個或多個Bean相互依賴,形成閉環(huán),導致Spring容器無法正常初始化這些Bean,這里提供幾種解決Spring Boot中@Autowired注入Service時循環(huán)依賴問題的方法2024-02-02
org.slf4j.Logger中info()方法的使用詳解
這篇文章主要介紹了org.slf4j.Logger中info()方法的使用詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
詳解J2EE開發(fā)的網(wǎng)站部署到阿里云服務器的方法
這篇文章主要介紹了詳解J2EE開發(fā)的網(wǎng)站部署到阿里云服務器的方法,需要的朋友可以參考下2018-01-01
Java使用JNDI連接數(shù)據(jù)庫的實現(xiàn)方法
本文主要介紹了Java使用JNDI連接數(shù)據(jù)庫的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12

