mirror of
				https://github.com/yangzongzhuan/RuoYi-Vue.git
				synced 2025-10-26 12:22:04 +00:00 
			
		
		
		
	Excel导入导出支持多图片
This commit is contained in:
		| @@ -381,6 +381,18 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils | |||||||
|         return new HashSet<String>(str2List(str, sep, true, false)); |         return new HashSet<String>(str2List(str, sep, true, false)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 字符串转list | ||||||
|  |      *  | ||||||
|  |      * @param str 字符串 | ||||||
|  |      * @param sep 分隔符 | ||||||
|  |      * @return list集合 | ||||||
|  |      */ | ||||||
|  |     public static final List<String> str2List(String str, String sep) | ||||||
|  |     { | ||||||
|  |         return str2List(str, sep, true, false); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 字符串转list |      * 字符串转list | ||||||
|      *  |      *  | ||||||
|   | |||||||
| @@ -95,6 +95,8 @@ public class ExcelUtil<T> | |||||||
| { | { | ||||||
|     private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); |     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_REGEX_STR = "=|-|\\+|@"; | ||||||
|  |  | ||||||
|     public static final String[] FORMULA_STR = { "=", "-", "+", "@" }; |     public static final String[] FORMULA_STR = { "=", "-", "+", "@" }; | ||||||
| @@ -360,7 +362,7 @@ public class ExcelUtil<T> | |||||||
|             throw new IOException("文件sheet不存在"); |             throw new IOException("文件sheet不存在"); | ||||||
|         } |         } | ||||||
|         boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook); |         boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook); | ||||||
|         Map<String, PictureData> pictures; |         Map<String, List<PictureData>> pictures = null; | ||||||
|         if (isXSSFWorkbook) |         if (isXSSFWorkbook) | ||||||
|         { |         { | ||||||
|             pictures = getSheetPictures07((XSSFSheet) sheet, (XSSFWorkbook) wb); |             pictures = getSheetPictures07((XSSFSheet) sheet, (XSSFWorkbook) wb); | ||||||
| @@ -504,16 +506,15 @@ public class ExcelUtil<T> | |||||||
|                         } |                         } | ||||||
|                         else if (ColumnType.IMAGE == attr.cellType() && StringUtils.isNotEmpty(pictures)) |                         else if (ColumnType.IMAGE == attr.cellType() && StringUtils.isNotEmpty(pictures)) | ||||||
|                         { |                         { | ||||||
|                             PictureData image = pictures.get(row.getRowNum() + "_" + entry.getKey()); |                             StringBuilder propertyString = new StringBuilder(); | ||||||
|                             if (image == null) |                             List<PictureData> images = pictures.get(row.getRowNum() + "_" + entry.getKey()); | ||||||
|  |                             for (PictureData picture : images) | ||||||
|                             { |                             { | ||||||
|                                 val = ""; |                                 byte[] data = picture.getData(); | ||||||
|                             } |                                 String fileName = FileUtils.writeImportBytes(data); | ||||||
|                             else |                                 propertyString.append(fileName).append(SEPARATOR); | ||||||
|                             { |  | ||||||
|                                 byte[] data = image.getData(); |  | ||||||
|                                 val = FileUtils.writeImportBytes(data); |  | ||||||
|                             } |                             } | ||||||
|  |                             val = StringUtils.stripEnd(propertyString.toString(), SEPARATOR); | ||||||
|                         } |                         } | ||||||
|                         ReflectUtils.invokeSetter(entity, propertyName, val); |                         ReflectUtils.invokeSetter(entity, propertyName, val); | ||||||
|                     } |                     } | ||||||
| @@ -1037,12 +1038,15 @@ public class ExcelUtil<T> | |||||||
|         else if (ColumnType.IMAGE == attr.cellType()) |         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); |             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); |             String propertyValue = Convert.toStr(value); | ||||||
|             if (StringUtils.isNotEmpty(imagePath)) |             if (StringUtils.isNotEmpty(propertyValue)) | ||||||
|             { |             { | ||||||
|                 byte[] data = ImageUtils.getImage(imagePath); |                 List<String> imagePaths = StringUtils.str2List(propertyValue, SEPARATOR); | ||||||
|                 getDrawingPatriarch(cell.getSheet()).createPicture(anchor, |                 for (String imagePath : imagePaths) | ||||||
|                         cell.getSheet().getWorkbook().addPicture(data, getImageType(data))); |                 { | ||||||
|  |                     byte[] data = ImageUtils.getImage(imagePath); | ||||||
|  |                     getDrawingPatriarch(cell.getSheet()).createPicture(anchor, cell.getSheet().getWorkbook().addPicture(data, getImageType(data))); | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -1288,7 +1292,7 @@ public class ExcelUtil<T> | |||||||
|     public static String convertByExp(String propertyValue, String converterExp, String separator) |     public static String convertByExp(String propertyValue, String converterExp, String separator) | ||||||
|     { |     { | ||||||
|         StringBuilder propertyString = new StringBuilder(); |         StringBuilder propertyString = new StringBuilder(); | ||||||
|         String[] convertSource = converterExp.split(","); |         String[] convertSource = converterExp.split(SEPARATOR); | ||||||
|         for (String item : convertSource) |         for (String item : convertSource) | ||||||
|         { |         { | ||||||
|             String[] itemArray = item.split("="); |             String[] itemArray = item.split("="); | ||||||
| @@ -1325,7 +1329,7 @@ public class ExcelUtil<T> | |||||||
|     public static String reverseByExp(String propertyValue, String converterExp, String separator) |     public static String reverseByExp(String propertyValue, String converterExp, String separator) | ||||||
|     { |     { | ||||||
|         StringBuilder propertyString = new StringBuilder(); |         StringBuilder propertyString = new StringBuilder(); | ||||||
|         String[] convertSource = converterExp.split(","); |         String[] convertSource = converterExp.split(SEPARATOR); | ||||||
|         for (String item : convertSource) |         for (String item : convertSource) | ||||||
|         { |         { | ||||||
|             String[] itemArray = item.split("="); |             String[] itemArray = item.split("="); | ||||||
| @@ -1751,30 +1755,24 @@ public class ExcelUtil<T> | |||||||
|      * @param workbook 工作簿对象 |      * @param workbook 工作簿对象 | ||||||
|      * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData |      * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData | ||||||
|      */ |      */ | ||||||
|     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(); |         List<HSSFPictureData> pictures = workbook.getAllPictures(); | ||||||
|         if (!pictures.isEmpty()) |         if (!pictures.isEmpty() && sheet.getDrawingPatriarch() != null) | ||||||
|         { |         { | ||||||
|             for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) |             for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) | ||||||
|             { |             { | ||||||
|                 HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor(); |  | ||||||
|                 if (shape instanceof HSSFPicture) |                 if (shape instanceof HSSFPicture) | ||||||
|                 { |                 { | ||||||
|                     HSSFPicture pic = (HSSFPicture) shape; |                     HSSFPicture pic = (HSSFPicture) shape; | ||||||
|                     int pictureIndex = pic.getPictureIndex() - 1; |                     HSSFClientAnchor anchor = (HSSFClientAnchor) pic.getAnchor(); | ||||||
|                     HSSFPictureData picData = pictures.get(pictureIndex); |  | ||||||
|                     String picIndex = anchor.getRow1() + "_" + anchor.getCol1(); |                     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; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @@ -1784,16 +1782,15 @@ public class ExcelUtil<T> | |||||||
|      * @param workbook 工作簿对象 |      * @param workbook 工作簿对象 | ||||||
|      * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData |      * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData | ||||||
|      */ |      */ | ||||||
|     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()) |         for (POIXMLDocumentPart dr : sheet.getRelations()) | ||||||
|         { |         { | ||||||
|             if (dr instanceof XSSFDrawing) |             if (dr instanceof XSSFDrawing) | ||||||
|             { |             { | ||||||
|                 XSSFDrawing drawing = (XSSFDrawing) dr; |                 XSSFDrawing drawing = (XSSFDrawing) dr; | ||||||
|                 List<XSSFShape> shapes = drawing.getShapes(); |                 for (XSSFShape shape : drawing.getShapes()) | ||||||
|                 for (XSSFShape shape : shapes) |  | ||||||
|                 { |                 { | ||||||
|                     if (shape instanceof XSSFPicture) |                     if (shape instanceof XSSFPicture) | ||||||
|                     { |                     { | ||||||
| @@ -1801,7 +1798,7 @@ public class ExcelUtil<T> | |||||||
|                         XSSFClientAnchor anchor = pic.getPreferredSize(); |                         XSSFClientAnchor anchor = pic.getPreferredSize(); | ||||||
|                         CTMarker ctMarker = anchor.getFrom(); |                         CTMarker ctMarker = anchor.getFrom(); | ||||||
|                         String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); |                         String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); | ||||||
|                         sheetIndexPicMap.put(picIndex, pic.getPictureData()); |                         sheetIndexPicMap.computeIfAbsent(picIndex, k -> new ArrayList<>()).add(pic.getPictureData()); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 RuoYi
					RuoYi