From 11214e3074266a23fe61e8eebbce647fdb7305ef Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 12 六月 2026 18:02:03 +0800
Subject: [PATCH] 报价单修改-优化,增加导入记录,降价历史
---
src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java | 340 ++++++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 292 insertions(+), 48 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 d103265..167f4b4 100644
--- a/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
+++ b/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
@@ -10,6 +10,7 @@
import java.lang.reflect.ParameterizedType;
import java.math.BigDecimal;
import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
@@ -465,37 +466,37 @@
{
val = Convert.toBigDecimal(val);
}
- else if (Date.class == fieldType)
- {
- if (val instanceof String)
- {
- val = DateUtils.parseDate(val);
+ else if (Date.class == fieldType)
+ {
+ if (val instanceof String)
+ {
+ val = DateUtils.parseDate(val);
}
else if (val instanceof Double)
- {
- val = DateUtil.getJavaDate((Double) val);
- }
- }
- else if (LocalDate.class == fieldType)
- {
- if (val instanceof String)
- {
- Date date = DateUtils.parseDate(val);
- val = StringUtils.isNull(date) ? null : DateUtils.toLocalDate(date);
- }
- else if (val instanceof Date)
- {
- val = DateUtils.toLocalDate((Date) val);
- }
- else if (val instanceof Double)
- {
- val = DateUtils.toLocalDate(DateUtil.getJavaDate((Double) val));
- }
- }
- else if (Boolean.TYPE == fieldType || Boolean.class == fieldType)
- {
- val = Convert.toBool(val, false);
- }
+ {
+ val = DateUtil.getJavaDate((Double) val);
+ }
+ }
+ else if (LocalDate.class == fieldType)
+ {
+ if (val instanceof String)
+ {
+ Date date = DateUtils.parseDate(val);
+ val = StringUtils.isNull(date) ? null : DateUtils.toLocalDate(date);
+ }
+ else if (val instanceof Date)
+ {
+ val = DateUtils.toLocalDate((Date) val);
+ }
+ else if (val instanceof Double)
+ {
+ val = DateUtils.toLocalDate(DateUtil.getJavaDate((Double) val));
+ }
+ }
+ else if (Boolean.TYPE == fieldType || Boolean.class == fieldType)
+ {
+ val = Convert.toBool(val, false);
+ }
if (StringUtils.isNotNull(fieldType))
{
String propertyName = field.getName();
@@ -667,24 +668,24 @@
val = Convert.toFloat(val);
} else if (BigDecimal.class == fieldType) {
val = Convert.toBigDecimal(val);
- } else if (Date.class == fieldType) {
- if (val instanceof String) {
- val = DateUtils.parseDate(val);
- } else if (val instanceof Double) {
- val = DateUtil.getJavaDate((Double) val);
- }
- } else if (LocalDate.class == fieldType) {
- if (val instanceof String) {
- Date date = DateUtils.parseDate(val);
- val = StringUtils.isNull(date) ? null : DateUtils.toLocalDate(date);
- } else if (val instanceof Date) {
- val = DateUtils.toLocalDate((Date) val);
- } else if (val instanceof Double) {
- val = DateUtils.toLocalDate(DateUtil.getJavaDate((Double) val));
- }
- } else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) {
- val = Convert.toBool(val, false);
- }
+ } else if (Date.class == fieldType) {
+ if (val instanceof String) {
+ val = DateUtils.parseDate(val);
+ } else if (val instanceof Double) {
+ val = DateUtil.getJavaDate((Double) val);
+ }
+ } else if (LocalDate.class == fieldType) {
+ if (val instanceof String) {
+ Date date = DateUtils.parseDate(val);
+ val = StringUtils.isNull(date) ? null : DateUtils.toLocalDate(date);
+ } else if (val instanceof Date) {
+ val = DateUtils.toLocalDate((Date) val);
+ } else if (val instanceof Double) {
+ val = DateUtils.toLocalDate(DateUtil.getJavaDate((Double) val));
+ }
+ } else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) {
+ val = Convert.toBool(val, false);
+ }
if (StringUtils.isNotNull(fieldType)) {
String propertyName = field.getName();
@@ -2068,7 +2069,7 @@
/**
* 鑾峰彇瀵硅薄鐨勫瓙鍒楄〃鏂规硶
- *
+ *
* @param name 鍚嶇О
* @param pojoClass 绫诲璞�
* @return 瀛愬垪琛ㄦ柟娉�
@@ -2089,4 +2090,247 @@
}
return method;
}
+
+ /**
+ * 瀵煎嚭澶歋heet Excel妯℃澘锛堥潤鎬佹柟娉曪級
+ * 鏀寔涓嶅悓绫诲瀷鐨凞TO瀵煎嚭鍒颁笉鍚岀殑Sheet
+ *
+ * @param response HTTP鍝嶅簲
+ * @param sheetDataMap Map<Sheet鍚嶇О, SheetData>锛孲heetData鍖呭惈鏁版嵁鍒楄〃鍜屽搴旂殑Class绫诲瀷
+ * @param fileName 鏂囦欢鍚�
+ */
+ @SuppressWarnings("unchecked")
+ public static void exportExcelMultiSheet(HttpServletResponse response,
+ Map<String, SheetData<?>> sheetDataMap, String fileName)
+ {
+ try (SXSSFWorkbook workbook = new SXSSFWorkbook())
+ {
+ // 鍒涘缓鏍峰紡
+ CellStyle headerStyle = createHeaderStyle(workbook);
+ CellStyle dataStyle = createDataStyle(workbook);
+
+ // 閬嶅巻姣忎釜Sheet
+ for (Map.Entry<String, SheetData<?>> entry : sheetDataMap.entrySet())
+ {
+ String sheetName = entry.getKey();
+ SheetData<?> sheetData = entry.getValue();
+ List<?> dataList = sheetData.getDataList();
+ Class<?> clazz = sheetData.getClazz();
+
+ // 鍒涘缓Sheet
+ Sheet sheet = workbook.createSheet(sheetName);
+
+ // 鑾峰彇瀛楁淇℃伅
+ List<Object[]> fields = getFieldsByClass(clazz, Type.IMPORT);
+ if (fields.isEmpty())
+ {
+ continue;
+ }
+
+ // 鍒涘缓琛ㄥご
+ Row headerRow = sheet.createRow(0);
+ int colIndex = 0;
+ for (Object[] fieldObj : fields)
+ {
+ Field field = (Field) fieldObj[0];
+ Excel excel = (Excel) fieldObj[1];
+ Cell cell = headerRow.createCell(colIndex);
+ cell.setCellValue(excel.name());
+ cell.setCellStyle(headerStyle);
+ // 璁剧疆鍒楀
+ sheet.setColumnWidth(colIndex, (int) ((excel.width() + 0.72) * 256));
+ colIndex++;
+ }
+
+ // 鍐欏叆鏁版嵁
+ if (dataList != null && !dataList.isEmpty())
+ {
+ int rowIndex = 1;
+ for (Object data : dataList)
+ {
+ Row dataRow = sheet.createRow(rowIndex);
+ colIndex = 0;
+ for (Object[] fieldObj : fields)
+ {
+ Field field = (Field) fieldObj[0];
+ Excel excel = (Excel) fieldObj[1];
+ field.setAccessible(true);
+ Object value = field.get(data);
+ Cell cell = dataRow.createCell(colIndex);
+ setCellValueByType(cell, value, excel, dataStyle, workbook);
+ colIndex++;
+ }
+ rowIndex++;
+ }
+ }
+ }
+
+ // 杈撳嚭鍒板搷搴�
+ response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+ response.setCharacterEncoding("utf-8");
+ String encodedFileName = new String(fileName.getBytes("GBK"), "ISO8859_1") + ".xlsx";
+ response.addHeader("Content-Disposition", "attachment;filename=" + encodedFileName);
+ workbook.write(response.getOutputStream());
+ }
+ catch (Exception e)
+ {
+ log.error("瀵煎嚭澶歋heet Excel寮傚父: {}", e.getMessage());
+ throw new UtilException("瀵煎嚭Excel澶辫触: " + e.getMessage());
+ }
+ }
+
+ /**
+ * Sheet鏁版嵁灏佽绫�
+ */
+ public static class SheetData<T>
+ {
+ private List<T> dataList;
+ private Class<T> clazz;
+
+ public SheetData(List<T> dataList, Class<T> clazz)
+ {
+ this.dataList = dataList;
+ this.clazz = clazz;
+ }
+
+ public List<T> getDataList()
+ {
+ return dataList;
+ }
+
+ public Class<T> getClazz()
+ {
+ return clazz;
+ }
+ }
+
+ /**
+ * 鏍规嵁绫昏幏鍙栧瓧娈靛垪琛紙闈欐�佹柟娉曪級
+ */
+ private static List<Object[]> getFieldsByClass(Class<?> clazz, Type type)
+ {
+ List<Object[]> fields = new ArrayList<>();
+ List<Field> tempFields = new ArrayList<>();
+ tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields()));
+ tempFields.addAll(Arrays.asList(clazz.getDeclaredFields()));
+
+ for (Field field : tempFields)
+ {
+ if (field.isAnnotationPresent(Excel.class))
+ {
+ Excel excel = field.getAnnotation(Excel.class);
+ if (excel != null && (excel.type() == Type.ALL || excel.type() == type))
+ {
+ fields.add(new Object[] { field, excel });
+ }
+ }
+ }
+
+ // 鎸塻ort鎺掑簭
+ fields.sort(Comparator.comparing(objects -> ((Excel) objects[1]).sort()));
+ return fields;
+ }
+
+ /**
+ * 鍒涘缓琛ㄥご鏍峰紡
+ */
+ private static CellStyle createHeaderStyle(Workbook workbook)
+ {
+ CellStyle style = workbook.createCellStyle();
+ style.setAlignment(HorizontalAlignment.CENTER);
+ style.setVerticalAlignment(VerticalAlignment.CENTER);
+ style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
+ style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+ style.setBorderRight(BorderStyle.THIN);
+ style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
+ style.setBorderLeft(BorderStyle.THIN);
+ style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
+ style.setBorderTop(BorderStyle.THIN);
+ style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
+ style.setBorderBottom(BorderStyle.THIN);
+ style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
+
+ Font font = workbook.createFont();
+ font.setFontName("Arial");
+ font.setFontHeightInPoints((short) 10);
+ font.setBold(true);
+ style.setFont(font);
+
+ DataFormat dataFormat = workbook.createDataFormat();
+ style.setDataFormat(dataFormat.getFormat("@"));
+
+ return style;
+ }
+
+ /**
+ * 鍒涘缓鏁版嵁鏍峰紡
+ */
+ private static CellStyle createDataStyle(Workbook workbook)
+ {
+ CellStyle style = workbook.createCellStyle();
+ style.setAlignment(HorizontalAlignment.CENTER);
+ style.setVerticalAlignment(VerticalAlignment.CENTER);
+ style.setBorderRight(BorderStyle.THIN);
+ style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
+ style.setBorderLeft(BorderStyle.THIN);
+ style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
+ style.setBorderTop(BorderStyle.THIN);
+ style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
+ style.setBorderBottom(BorderStyle.THIN);
+ style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
+
+ Font font = workbook.createFont();
+ font.setFontName("Arial");
+ font.setFontHeightInPoints((short) 10);
+ style.setFont(font);
+
+ return style;
+ }
+
+ /**
+ * 璁剧疆鍗曞厓鏍煎��
+ */
+ private static void setCellValueByType(Cell cell, Object value, Excel excel, CellStyle dataStyle, Workbook workbook)
+ {
+ cell.setCellStyle(dataStyle);
+
+ if (value == null)
+ {
+ cell.setCellValue("");
+ return;
+ }
+
+ String dateFormat = excel.dateFormat();
+
+ if (StringUtils.isNotEmpty(dateFormat) && value instanceof Date)
+ {
+ cell.setCellValue(new SimpleDateFormat(dateFormat).format((Date) value));
+ }
+ else if (value instanceof Date)
+ {
+ cell.setCellValue(new SimpleDateFormat("yyyy-MM-dd").format((Date) value));
+ }
+ else if (value instanceof BigDecimal)
+ {
+ cell.setCellValue(((BigDecimal) value).doubleValue());
+ }
+ else if (value instanceof Number)
+ {
+ cell.setCellValue(((Number) value).doubleValue());
+ }
+ else if (value instanceof Boolean)
+ {
+ cell.setCellValue((Boolean) value);
+ }
+ else
+ {
+ String strValue = Convert.toStr(value);
+ // 闃叉CSV娉ㄥ叆
+ if (StringUtils.startsWithAny(strValue, FORMULA_STR))
+ {
+ strValue = RegExUtils.replaceFirst(strValue, FORMULA_REGEX_STR, "\t$0");
+ }
+ cell.setCellValue(strValue);
+ }
+ }
}
--
Gitblit v1.9.3