作者 RuoYi

Excel注解图片导入兼容xls

@@ -19,6 +19,12 @@ import java.util.Set; @@ -19,6 +19,12 @@ import java.util.Set;
19 import java.util.UUID; 19 import java.util.UUID;
20 import java.util.stream.Collectors; 20 import java.util.stream.Collectors;
21 import javax.servlet.http.HttpServletResponse; 21 import javax.servlet.http.HttpServletResponse;
  22 +import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
  23 +import org.apache.poi.hssf.usermodel.HSSFPicture;
  24 +import org.apache.poi.hssf.usermodel.HSSFPictureData;
  25 +import org.apache.poi.hssf.usermodel.HSSFShape;
  26 +import org.apache.poi.hssf.usermodel.HSSFSheet;
  27 +import org.apache.poi.hssf.usermodel.HSSFWorkbook;
22 import org.apache.poi.ooxml.POIXMLDocumentPart; 28 import org.apache.poi.ooxml.POIXMLDocumentPart;
23 import org.apache.poi.ss.usermodel.BorderStyle; 29 import org.apache.poi.ss.usermodel.BorderStyle;
24 import org.apache.poi.ss.usermodel.Cell; 30 import org.apache.poi.ss.usermodel.Cell;
@@ -185,7 +191,16 @@ public class ExcelUtil<T> @@ -185,7 +191,16 @@ public class ExcelUtil<T>
185 { 191 {
186 throw new IOException("文件sheet不存在"); 192 throw new IOException("文件sheet不存在");
187 } 193 }
188 - Map<String, PictureData> pictures = getSheetPictrues((XSSFSheet) sheet, (XSSFWorkbook) wb); 194 + boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook);
  195 + Map<String, PictureData> pictures;
  196 + if (isXSSFWorkbook)
  197 + {
  198 + pictures = getSheetPictrues07((XSSFSheet) sheet, (XSSFWorkbook) wb);
  199 + }
  200 + else
  201 + {
  202 + pictures = getSheetPictrues03((HSSFSheet) sheet, (HSSFWorkbook) wb);
  203 + }
189 // 获取最后一个非空行的行下标,比如总行数为n,则返回的为n-1 204 // 获取最后一个非空行的行下标,比如总行数为n,则返回的为n-1
190 int rows = sheet.getLastRowNum(); 205 int rows = sheet.getLastRowNum();
191 206
@@ -318,12 +333,8 @@ public class ExcelUtil<T> @@ -318,12 +333,8 @@ public class ExcelUtil<T>
318 { 333 {
319 val = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator()); 334 val = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator());
320 } 335 }
321 - else if (ColumnType.IMAGE == attr.cellType()) 336 + else if (ColumnType.IMAGE == attr.cellType() && StringUtils.isNotEmpty(pictures))
322 { 337 {
323 - if (StringUtils.isNull(pictures))  
324 - {  
325 - val = "";  
326 - }  
327 PictureData image = pictures.get(row.getRowNum() + "_" + entry.getKey()); 338 PictureData image = pictures.get(row.getRowNum() + "_" + entry.getKey());
328 if (image == null) 339 if (image == null)
329 { 340 {
@@ -1179,13 +1190,46 @@ public class ExcelUtil<T> @@ -1179,13 +1190,46 @@ public class ExcelUtil<T>
1179 } 1190 }
1180 1191
1181 /** 1192 /**
1182 - * 获取Excel图片 1193 + * 获取Excel2003图片
  1194 + *
  1195 + * @param sheet 当前sheet对象
  1196 + * @param workbook 工作簿对象
  1197 + * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData
  1198 + */
  1199 + public static Map<String, PictureData> getSheetPictrues03(HSSFSheet sheet, HSSFWorkbook workbook)
  1200 + {
  1201 + Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>();
  1202 + List<HSSFPictureData> pictures = workbook.getAllPictures();
  1203 + if (!pictures.isEmpty())
  1204 + {
  1205 + for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren())
  1206 + {
  1207 + HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor();
  1208 + if (shape instanceof HSSFPicture)
  1209 + {
  1210 + HSSFPicture pic = (HSSFPicture) shape;
  1211 + int pictureIndex = pic.getPictureIndex() - 1;
  1212 + HSSFPictureData picData = pictures.get(pictureIndex);
  1213 + String picIndex = String.valueOf(anchor.getRow1()) + "_" + String.valueOf(anchor.getCol1());
  1214 + sheetIndexPicMap.put(picIndex, picData);
  1215 + }
  1216 + }
  1217 + return sheetIndexPicMap;
  1218 + }
  1219 + else
  1220 + {
  1221 + return sheetIndexPicMap;
  1222 + }
  1223 + }
  1224 +
  1225 + /**
  1226 + * 获取Excel2007图片
1183 * 1227 *
1184 * @param sheet 当前sheet对象 1228 * @param sheet 当前sheet对象
1185 * @param workbook 工作簿对象 1229 * @param workbook 工作簿对象
1186 * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData 1230 * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData
1187 */ 1231 */
1188 - public static Map<String, PictureData> getSheetPictrues(XSSFSheet sheet, XSSFWorkbook workbook) 1232 + public static Map<String, PictureData> getSheetPictrues07(XSSFSheet sheet, XSSFWorkbook workbook)
1189 { 1233 {
1190 Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>(); 1234 Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>();
1191 for (POIXMLDocumentPart dr : sheet.getRelations()) 1235 for (POIXMLDocumentPart dr : sheet.getRelations())