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("訂單號")
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è)方法只能讀取浮動的圖片,嵌入單元格的讀取不到!
//注意這個(gè)方法只能讀取浮動的圖片,嵌入單元格的讀取不到!
//注意這個(gè)方法只能讀取浮動的圖片,嵌入單元格的讀取不到!
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è)讀取方法只能讀取浮動的圖片,嵌入單元格的讀取不到!如果發(fā)現(xiàn)沒讀取到,檢查一下Excel中圖片在單元格中的樣式,右擊“切換為浮動圖片”即可。
總結(jié)
到此這篇關(guān)于Java使用POI解析帶圖片的excel文件的文章就介紹到這了,更多相關(guān)Java解析帶圖片excel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決MyBatis Mapper的XML文件SQL語句無法自動提示問題(親測有效)
這篇文章主要給大家介紹了如何解決MyBatis Mapper的XML文件SQL語句無法自動提示的問題,文中有詳細(xì)的原因分析,以及通過圖文介紹的解決方案,需要的朋友可以參考下2023-10-10
JavaEE7+Websockets+GlassFish4打造聊天室
Java EE 7已經(jīng)發(fā)布很久了,新增加了很多新的功能和特性,如新增或更新了不少的JSR標(biāo)準(zhǔn)。其中特別受到關(guān)注的是Websockets。它的一個(gè)好處之一是減少了不必要的網(wǎng)絡(luò)流量。它主要是用于在客戶機(jī)和服務(wù)器之間建立單一的雙向連接。2015-09-09
SpringBoot @PostMapping接收HTTP請求的流數(shù)據(jù)問題
這篇文章主要介紹了SpringBoot @PostMapping接收HTTP請求的流數(shù)據(jù)問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
Java中replace、replaceAll和replaceFirst函數(shù)的用法小結(jié)
相信會java的同學(xué)估計(jì)都用過replace、replaceAll、replaceFirst這三個(gè)函數(shù),可是,我們真的懂他們嗎?下面通過這篇文章大家再來好好學(xué)習(xí)學(xué)習(xí)下這幾個(gè)函數(shù)。2016-09-09

