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à)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01java錯(cuò)誤:?不支持發(fā)行版本?22的簡單解決方法
這篇文章主要給大家介紹了關(guān)于java錯(cuò)誤:?不支持發(fā)行版本?22的簡單解決方法,這個(gè)錯(cuò)誤通常是由于Java版本不兼容導(dǎo)致的,請檢查您的項(xiàng)目所使用的Java版本是否與您當(dāng)前安裝的Java版本一致,需要的朋友可以參考下2024-06-06SpringBoot中@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-02org.slf4j.Logger中info()方法的使用詳解
這篇文章主要介紹了org.slf4j.Logger中info()方法的使用詳解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12詳解J2EE開發(fā)的網(wǎng)站部署到阿里云服務(wù)器的方法
這篇文章主要介紹了詳解J2EE開發(fā)的網(wǎng)站部署到阿里云服務(wù)器的方法,需要的朋友可以參考下2018-01-01Java 實(shí)現(xiàn)瀏覽器下載文件及文件預(yù)覽
這篇文章主要介紹了Java 實(shí)現(xiàn)瀏覽器下載文件及文件預(yù)覽,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Java使用JNDI連接數(shù)據(jù)庫的實(shí)現(xiàn)方法
本文主要介紹了Java使用JNDI連接數(shù)據(jù)庫的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12