From 9dc4254718d7bfbbf34273b38d1691c451669833 Mon Sep 17 00:00:00 2001 From: RuoYi <yzz_ivy@163.com> Date: 星期四, 23 九月 2021 19:15:51 +0800 Subject: [PATCH] 限流返回类型转换数值型的格式 --- src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java | 104 +++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 91 insertions(+), 13 deletions(-) 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 11bd63e..ca14677 100644 --- a/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java +++ b/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java @@ -6,6 +6,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.math.BigDecimal; import java.text.DecimalFormat; import java.util.ArrayList; @@ -19,6 +20,12 @@ import java.util.UUID; import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; +import org.apache.poi.hssf.usermodel.HSSFClientAnchor; +import org.apache.poi.hssf.usermodel.HSSFPicture; +import org.apache.poi.hssf.usermodel.HSSFPictureData; +import org.apache.poi.hssf.usermodel.HSSFShape; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ooxml.POIXMLDocumentPart; import org.apache.poi.ss.usermodel.BorderStyle; import org.apache.poi.ss.usermodel.Cell; @@ -54,7 +61,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.ruoyi.common.core.text.Convert; -import com.ruoyi.common.exception.CustomException; +import com.ruoyi.common.exception.UtilException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DictUtils; import com.ruoyi.common.utils.StringUtils; @@ -185,7 +192,16 @@ { throw new IOException("鏂囦欢sheet涓嶅瓨鍦�"); } - Map<String, PictureData> pictures = getSheetPictrues((XSSFSheet) sheet, (XSSFWorkbook) wb); + boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook); + Map<String, PictureData> pictures; + if (isXSSFWorkbook) + { + pictures = getSheetPictures07((XSSFSheet) sheet, (XSSFWorkbook) wb); + } + else + { + pictures = getSheetPictures03((HSSFSheet) sheet, (HSSFWorkbook) wb); + } // 鑾峰彇鏈�鍚庝竴涓潪绌鸿鐨勮涓嬫爣锛屾瘮濡傛�昏鏁颁负n锛屽垯杩斿洖鐨勪负n-1 int rows = sheet.getLastRowNum(); @@ -318,19 +334,22 @@ { val = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator()); } - else if (ColumnType.IMAGE == attr.cellType()) + else if (!attr.handler().equals(ExcelHandlerAdapter.class)) { - if (StringUtils.isNull(pictures)) - { - val = ""; - } + val = dataFormatHandlerAdapter(val, attr); + } + else if (ColumnType.IMAGE == attr.cellType() && StringUtils.isNotEmpty(pictures)) + { PictureData image = pictures.get(row.getRowNum() + "_" + entry.getKey()); if (image == null) { val = ""; } - byte[] data = image.getData(); - val = FileUtils.writeImportBytes(data); + else + { + byte[] data = image.getData(); + val = FileUtils.writeImportBytes(data); + } } ReflectUtils.invokeSetter(entity, propertyName, val); } @@ -439,7 +458,7 @@ catch (Exception e) { log.error("瀵煎嚭Excel寮傚父{}", e.getMessage()); - throw new CustomException("瀵煎嚭Excel澶辫触锛岃鑱旂郴缃戠珯绠$悊鍛橈紒"); + throw new UtilException("瀵煎嚭Excel澶辫触锛岃鑱旂郴缃戠珯绠$悊鍛橈紒"); } finally { @@ -715,6 +734,10 @@ { cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).toString()); } + else if (!attr.handler().equals(ExcelHandlerAdapter.class)) + { + cell.setCellValue(dataFormatHandlerAdapter(value, attr)); + } else { // 璁剧疆鍒楃被鍨� @@ -885,6 +908,28 @@ public static String reverseDictByExp(String dictLabel, String dictType, String separator) { return DictUtils.getDictValue(dictType, dictLabel, separator); + } + + /** + * 鏁版嵁澶勭悊鍣� + * + * @param value 鏁版嵁鍊� + * @param excel 鏁版嵁娉ㄨВ + * @return + */ + public String dataFormatHandlerAdapter(Object value, Excel excel) + { + try + { + Object instance = excel.handler().newInstance(); + Method formatMethod = excel.handler().getMethod("format", new Class[] { Object.class, String[].class }); + value = formatMethod.invoke(instance, value, excel.args()); + } + catch (Exception e) + { + log.error("涓嶈兘鏍煎紡鍖栨暟鎹� " + excel.handler(), e.getMessage()); + } + return Convert.toStr(value); } /** @@ -1179,13 +1224,46 @@ } /** - * 鑾峰彇Excel鍥剧墖 + * 鑾峰彇Excel2003鍥剧墖 * * @param sheet 褰撳墠sheet瀵硅薄 * @param workbook 宸ヤ綔绨垮璞� * @return Map key:鍥剧墖鍗曞厓鏍肩储寮曪紙1_1锛塖tring锛寁alue:鍥剧墖娴丳ictureData */ - public static Map<String, PictureData> getSheetPictrues(XSSFSheet sheet, XSSFWorkbook workbook) + public static Map<String, PictureData> getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook) + { + Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>(); + List<HSSFPictureData> pictures = workbook.getAllPictures(); + if (!pictures.isEmpty()) + { + 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); + String picIndex = String.valueOf(anchor.getRow1()) + "_" + String.valueOf(anchor.getCol1()); + sheetIndexPicMap.put(picIndex, picData); + } + } + return sheetIndexPicMap; + } + else + { + return sheetIndexPicMap; + } + } + + /** + * 鑾峰彇Excel2007鍥剧墖 + * + * @param sheet 褰撳墠sheet瀵硅薄 + * @param workbook 宸ヤ綔绨垮璞� + * @return Map key:鍥剧墖鍗曞厓鏍肩储寮曪紙1_1锛塖tring锛寁alue:鍥剧墖娴丳ictureData + */ + public static Map<String, PictureData> getSheetPictures07(XSSFSheet sheet, XSSFWorkbook workbook) { Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>(); for (POIXMLDocumentPart dr : sheet.getRelations()) @@ -1209,4 +1287,4 @@ } return sheetIndexPicMap; } -} \ No newline at end of file +} -- Gitblit v1.9.3