From 79c4711f638585951c4fc4cdfd689736bebb7ddf Mon Sep 17 00:00:00 2001 From: RuoYi <yzz_ivy@163.com> Date: 星期五, 25 四月 2025 10:08:50 +0800 Subject: [PATCH] Excel导入导出支持多图片 --- src/main/java/com/ruoyi/common/utils/StringUtils.java | 12 ++++++ src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java | 63 +++++++++++++++---------------- 2 files changed, 42 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/ruoyi/common/utils/StringUtils.java b/src/main/java/com/ruoyi/common/utils/StringUtils.java index 920968f..74eb532 100644 --- a/src/main/java/com/ruoyi/common/utils/StringUtils.java +++ b/src/main/java/com/ruoyi/common/utils/StringUtils.java @@ -386,6 +386,18 @@ * * @param str 瀛楃涓� * @param sep 鍒嗛殧绗� + * @return list闆嗗悎 + */ + public static final List<String> str2List(String str, String sep) + { + return str2List(str, sep, true, false); + } + + /** + * 瀛楃涓茶浆list + * + * @param str 瀛楃涓� + * @param sep 鍒嗛殧绗� * @param filterBlank 杩囨护绾┖鐧� * @param trim 鍘绘帀棣栧熬绌虹櫧 * @return list闆嗗悎 diff --git a/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java index 6ae9015..c6df2bc 100644 --- a/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java +++ b/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java @@ -95,6 +95,8 @@ { private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); + public static final String SEPARATOR = ","; + public static final String FORMULA_REGEX_STR = "=|-|\\+|@"; public static final String[] FORMULA_STR = { "=", "-", "+", "@" }; @@ -360,7 +362,7 @@ throw new IOException("鏂囦欢sheet涓嶅瓨鍦�"); } boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook); - Map<String, PictureData> pictures; + Map<String, List<PictureData>> pictures = null; if (isXSSFWorkbook) { pictures = getSheetPictures07((XSSFSheet) sheet, (XSSFWorkbook) wb); @@ -504,16 +506,15 @@ } else if (ColumnType.IMAGE == attr.cellType() && StringUtils.isNotEmpty(pictures)) { - PictureData image = pictures.get(row.getRowNum() + "_" + entry.getKey()); - if (image == null) + StringBuilder propertyString = new StringBuilder(); + List<PictureData> images = pictures.get(row.getRowNum() + "_" + entry.getKey()); + for (PictureData picture : images) { - val = ""; + byte[] data = picture.getData(); + String fileName = FileUtils.writeImportBytes(data); + propertyString.append(fileName).append(SEPARATOR); } - else - { - byte[] data = image.getData(); - val = FileUtils.writeImportBytes(data); - } + val = StringUtils.stripEnd(propertyString.toString(), SEPARATOR); } ReflectUtils.invokeSetter(entity, propertyName, val); } @@ -1037,12 +1038,15 @@ else if (ColumnType.IMAGE == attr.cellType()) { ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), cell.getRow().getRowNum() + 1); - String imagePath = Convert.toStr(value); - if (StringUtils.isNotEmpty(imagePath)) + String propertyValue = Convert.toStr(value); + if (StringUtils.isNotEmpty(propertyValue)) { - byte[] data = ImageUtils.getImage(imagePath); - getDrawingPatriarch(cell.getSheet()).createPicture(anchor, - cell.getSheet().getWorkbook().addPicture(data, getImageType(data))); + List<String> imagePaths = StringUtils.str2List(propertyValue, SEPARATOR); + for (String imagePath : imagePaths) + { + byte[] data = ImageUtils.getImage(imagePath); + getDrawingPatriarch(cell.getSheet()).createPicture(anchor, cell.getSheet().getWorkbook().addPicture(data, getImageType(data))); + } } } } @@ -1287,7 +1291,7 @@ public static String convertByExp(String propertyValue, String converterExp, String separator) { StringBuilder propertyString = new StringBuilder(); - String[] convertSource = converterExp.split(","); + String[] convertSource = converterExp.split(SEPARATOR); for (String item : convertSource) { String[] itemArray = item.split("="); @@ -1324,7 +1328,7 @@ public static String reverseByExp(String propertyValue, String converterExp, String separator) { StringBuilder propertyString = new StringBuilder(); - String[] convertSource = converterExp.split(","); + String[] convertSource = converterExp.split(SEPARATOR); for (String item : convertSource) { String[] itemArray = item.split("="); @@ -1750,30 +1754,24 @@ * @param workbook 宸ヤ綔绨垮璞� * @return Map key:鍥剧墖鍗曞厓鏍肩储寮曪紙1_1锛塖tring锛寁alue:鍥剧墖娴丳ictureData */ - public static Map<String, PictureData> getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook) + public static Map<String, List<PictureData>> getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook) { - Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>(); + Map<String, List<PictureData>> sheetIndexPicMap = new HashMap<>(); List<HSSFPictureData> pictures = workbook.getAllPictures(); - if (!pictures.isEmpty()) + if (!pictures.isEmpty() && sheet.getDrawingPatriarch() != null) { for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) { - HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor(); if (shape instanceof HSSFPicture) { HSSFPicture pic = (HSSFPicture) shape; - int pictureIndex = pic.getPictureIndex() - 1; - HSSFPictureData picData = pictures.get(pictureIndex); + HSSFClientAnchor anchor = (HSSFClientAnchor) pic.getAnchor(); String picIndex = anchor.getRow1() + "_" + anchor.getCol1(); - sheetIndexPicMap.put(picIndex, picData); + sheetIndexPicMap.computeIfAbsent(picIndex, k -> new ArrayList<>()).add(pic.getPictureData()); } } - return sheetIndexPicMap; } - else - { - return sheetIndexPicMap; - } + return sheetIndexPicMap; } /** @@ -1783,16 +1781,15 @@ * @param workbook 宸ヤ綔绨垮璞� * @return Map key:鍥剧墖鍗曞厓鏍肩储寮曪紙1_1锛塖tring锛寁alue:鍥剧墖娴丳ictureData */ - public static Map<String, PictureData> getSheetPictures07(XSSFSheet sheet, XSSFWorkbook workbook) + public static Map<String, List<PictureData>> getSheetPictures07(XSSFSheet sheet, XSSFWorkbook workbook) { - Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>(); + Map<String, List<PictureData>> sheetIndexPicMap = new HashMap<>(); for (POIXMLDocumentPart dr : sheet.getRelations()) { if (dr instanceof XSSFDrawing) { XSSFDrawing drawing = (XSSFDrawing) dr; - List<XSSFShape> shapes = drawing.getShapes(); - for (XSSFShape shape : shapes) + for (XSSFShape shape : drawing.getShapes()) { if (shape instanceof XSSFPicture) { @@ -1800,7 +1797,7 @@ XSSFClientAnchor anchor = pic.getPreferredSize(); CTMarker ctMarker = anchor.getFrom(); String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); - sheetIndexPicMap.put(picIndex, pic.getPictureData()); + sheetIndexPicMap.computeIfAbsent(picIndex, k -> new ArrayList<>()).add(pic.getPictureData()); } } } -- Gitblit v1.9.3