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

好了,這下只能看POI了,然后想起來項(xiàng)目里引入的HuTools工具類,它應(yīng)該封裝好了吧;于是決定用HuTools里面的ExcelUtil來實(shí)現(xiàn)!
二、秀個(gè)騷操作,使用EasyExcel+HuTools(POI)實(shí)現(xiàn)解析
說明:因?yàn)镋asyExcel實(shí)在太好用了,加上看完HuTools工具類的方法發(fā)現(xiàn),圖片解析是單獨(dú)的,所以決定使用EasyExcel來解析數(shù)據(jù),用HuTools工具類來解析里面的圖片;如果表格數(shù)據(jù)過大則謹(jǐn)慎使用筆者這種方式哦。
1、定義EasyExcel解析用到的與表格映射的JavaBean
/**
* <p>
* 任務(wù)表格映射
* </p>
*
* @author kobe
* @since 2023-03-04
*/
@Data
public class TaskExcelDto implements Serializable {
private static final long serialVersionUID = 1L;
//這個(gè)注解表示解析的時(shí)候忽略
@ExcelIgnore
private Long id;
@ExcelProperty("姓名")
private String name;
@ExcelProperty("歸屬狀態(tài)")
private String status;
@ExcelProperty("計(jì)劃代碼")
private String planCode;
@ExcelProperty("日期")
private Date issueDate;
@ExcelProperty("時(shí)間")
private String time;
@ExcelProperty("任務(wù)分類")
private String types;
@ExcelProperty("訂單號(hào)")
private String orderNum;
@ExcelProperty("金額")
private Double money;
@ExcelProperty("提成")
private Double divvy;
@ExcelProperty("總金額")
private Double totalMoney;
@ExcelProperty("計(jì)劃人")
private String planer;
@ExcelProperty("所設(shè)關(guān)鍵詞")
private String keywords;
@ExcelIgnore
private String picture;
// 圖片數(shù)據(jù),臨時(shí)變量
@ExcelIgnore
private PictureData pictureData;
}2、實(shí)現(xiàn)代碼
@ApiOperation("excel導(dǎo)入")
@PostMapping("v1/excel/import")
public JsonResult importByExcel(MultipartFile file) throws IOException {
List<TaskExcelDto> list = new ArrayList<>();
// EasyExcel解析普通數(shù)據(jù)(這里為了演示簡單寫一下,實(shí)戰(zhàn)建議寫個(gè)實(shí)現(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工具類解析表格的圖片
//注意這個(gè)方法只能讀取浮動(dòng)的圖片,嵌入單元格的讀取不到!
//注意這個(gè)方法只能讀取浮動(dòng)的圖片,嵌入單元格的讀取不到!
//注意這個(gè)方法只能讀取浮動(dòng)的圖片,嵌入單元格的讀取不到!
ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
//key是圖片位置,row_cell的格式;value是圖片數(shù)據(jù)
Map<String, PictureData> picMap = ExcelPicUtil.getPicMap(reader.getWorkbook(), 0);
//這里只關(guān)心行數(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));
}
});
// 調(diào)用業(yè)務(wù)代碼保存數(shù)據(jù)
service.importByExcel(list);
return JsonResult.success();
}3、注意:
這個(gè)讀取方法只能讀取浮動(dòng)的圖片,嵌入單元格的讀取不到!如果發(fā)現(xiàn)沒讀取到,檢查一下Excel中圖片在單元格中的樣式,右擊“切換為浮動(dòng)圖片”即可。
總結(jié)
到此這篇關(guān)于Java使用POI解析帶圖片的excel文件的文章就介紹到這了,更多相關(guān)Java解析帶圖片excel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于springcloud集成nacos遇到的問題
這篇文章主要介紹了關(guān)于springcloud集成nacos遇到的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
java錯(cuò)誤:?不支持發(fā)行版本?22的簡單解決方法
這篇文章主要給大家介紹了關(guān)于java錯(cuò)誤:?不支持發(fā)行版本?22的簡單解決方法,這個(gè)錯(cuò)誤通常是由于Java版本不兼容導(dǎo)致的,請檢查您的項(xiàng)目所使用的Java版本是否與您當(dāng)前安裝的Java版本一致,需要的朋友可以參考下2024-06-06
SpringBoot中@Autowired注入service時(shí)出現(xiàn)循環(huán)依賴問題的解決方法
在Spring Boot開發(fā)過程中,@Autowired注入Service時(shí)出現(xiàn)循環(huán)依賴是一個(gè)常見問題,循環(huán)依賴指的是兩個(gè)或多個(gè)Bean相互依賴,形成閉環(huán),導(dǎo)致Spring容器無法正常初始化這些Bean,這里提供幾種解決Spring Boot中@Autowired注入Service時(shí)循環(huán)依賴問題的方法2024-02-02
org.slf4j.Logger中info()方法的使用詳解
這篇文章主要介紹了org.slf4j.Logger中info()方法的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
詳解J2EE開發(fā)的網(wǎng)站部署到阿里云服務(wù)器的方法
這篇文章主要介紹了詳解J2EE開發(fā)的網(wǎng)站部署到阿里云服務(wù)器的方法,需要的朋友可以參考下2018-01-01
Java 實(shí)現(xiàn)瀏覽器下載文件及文件預(yù)覽
這篇文章主要介紹了Java 實(shí)現(xiàn)瀏覽器下載文件及文件預(yù)覽,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Java使用JNDI連接數(shù)據(jù)庫的實(shí)現(xiàn)方法
本文主要介紹了Java使用JNDI連接數(shù)據(jù)庫的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12

