From fb1b4125084256f665abb0c49bd9509b238a1534 Mon Sep 17 00:00:00 2001 From: cst61 Date: Sat, 25 Apr 2026 22:57:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=8A=A5=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LbDailyUserTradeReportController.java | 159 +++++++++++++++--- 1 file changed, 140 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/rj/controller/LbDailyUserTradeReportController.java b/src/main/java/com/rj/controller/LbDailyUserTradeReportController.java index c336db2..c9905ae 100644 --- a/src/main/java/com/rj/controller/LbDailyUserTradeReportController.java +++ b/src/main/java/com/rj/controller/LbDailyUserTradeReportController.java @@ -16,9 +16,24 @@ import org.springframework.web.bind.annotation.*; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.DataFormat; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.ss.usermodel.BorderStyle; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.SheetConditionalFormatting; +import org.apache.poi.ss.usermodel.ComparisonOperator; +import org.apache.poi.ss.usermodel.ConditionalFormattingRule; +import org.apache.poi.ss.usermodel.FontFormatting; +import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.math.BigDecimal; +import java.math.RoundingMode; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.time.LocalDate; @@ -414,34 +429,119 @@ public class LbDailyUserTradeReportController { String d0 = parsedReportDate.format(mmdd); String d1 = parsedReportDate.minusDays(1).format(mmdd); + float rowHeightFactor = 1.3f; + sheet.setDefaultRowHeightInPoints(sheet.getDefaultRowHeightInPoints() * rowHeightFactor); + + DataFormat dataFormat = workbook.createDataFormat(); + + CellStyle headerStyle = workbook.createCellStyle(); + Font headerFont = workbook.createFont(); + headerFont.setBold(true); + headerFont.setColor(IndexedColors.DARK_BLUE.getIndex()); + headerStyle.setFont(headerFont); + headerStyle.setAlignment(HorizontalAlignment.CENTER); + headerStyle.setVerticalAlignment(VerticalAlignment.CENTER); + headerStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex()); + headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + headerStyle.setBorderTop(BorderStyle.THIN); + headerStyle.setBorderBottom(BorderStyle.THIN); + headerStyle.setBorderLeft(BorderStyle.THIN); + headerStyle.setBorderRight(BorderStyle.THIN); + + CellStyle textStyle = workbook.createCellStyle(); + textStyle.setAlignment(HorizontalAlignment.LEFT); + textStyle.setVerticalAlignment(VerticalAlignment.CENTER); + textStyle.setBorderTop(BorderStyle.THIN); + textStyle.setBorderBottom(BorderStyle.THIN); + textStyle.setBorderLeft(BorderStyle.THIN); + textStyle.setBorderRight(BorderStyle.THIN); + + CellStyle zebraTextStyle = workbook.createCellStyle(); + zebraTextStyle.cloneStyleFrom(textStyle); + zebraTextStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + zebraTextStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + CellStyle intStyle = workbook.createCellStyle(); + intStyle.setAlignment(HorizontalAlignment.RIGHT); + intStyle.setVerticalAlignment(VerticalAlignment.CENTER); + intStyle.setDataFormat(dataFormat.getFormat("#,##0")); + intStyle.setBorderTop(BorderStyle.THIN); + intStyle.setBorderBottom(BorderStyle.THIN); + intStyle.setBorderLeft(BorderStyle.THIN); + intStyle.setBorderRight(BorderStyle.THIN); + + CellStyle zebraIntStyle = workbook.createCellStyle(); + zebraIntStyle.cloneStyleFrom(intStyle); + zebraIntStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + zebraIntStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + CellStyle summaryTextStyle = workbook.createCellStyle(); + summaryTextStyle.cloneStyleFrom(textStyle); + summaryTextStyle.setFillForegroundColor(IndexedColors.LEMON_CHIFFON.getIndex()); + summaryTextStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + Font summaryFont = workbook.createFont(); + summaryFont.setBold(true); + summaryTextStyle.setFont(summaryFont); + summaryTextStyle.setBorderTop(BorderStyle.THIN); + + CellStyle summaryIntStyle = workbook.createCellStyle(); + summaryIntStyle.cloneStyleFrom(intStyle); + summaryIntStyle.setFillForegroundColor(IndexedColors.LEMON_CHIFFON.getIndex()); + summaryIntStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + summaryIntStyle.setFont(summaryFont); + summaryIntStyle.setBorderTop(BorderStyle.THIN); + int r = 0; Row header = sheet.createRow(r++); - header.createCell(0).setCellValue("昵称"); - header.createCell(1).setCellValue(d1 + "买货"); - header.createCell(2).setCellValue(d0 + "卖货"); - header.createCell(3).setCellValue(d0 + "买货"); - header.createCell(4).setCellValue("服务费"); - header.createCell(5).setCellValue("差额"); - header.createCell(6).setCellValue("应收应付"); - header.createCell(7).setCellValue("抵扣金额"); + header.setHeightInPoints(20 * rowHeightFactor); + createHeaderCell(header, 0, "昵称", headerStyle); + createHeaderCell(header, 1, d1 + "买货", headerStyle); + createHeaderCell(header, 2, d0 + "卖货", headerStyle); + createHeaderCell(header, 3, d0 + "买货", headerStyle); + createHeaderCell(header, 4, "服务费", headerStyle); + createHeaderCell(header, 5, "差额", headerStyle); + createHeaderCell(header, 6, "应收应付", headerStyle); + createHeaderCell(header, 7, "抵扣金额", headerStyle); + + sheet.createFreezePane(0, 1); + sheet.setAutoFilter(new CellRangeAddress(0, 0, 0, 7)); for (LbDailyUserTradeReport item : rows) { Row row = sheet.createRow(r++); - row.createCell(0).setCellValue(item.getNickname() == null ? "" : item.getNickname()); - row.createCell(1).setCellValue(asDouble(item.getYestodayBuyAmt())); - row.createCell(2).setCellValue(asDouble(item.getDailySellAmt())); - row.createCell(3).setCellValue(asDouble(item.getDailyBuyAmt())); - row.createCell(4).setCellValue(asDouble(item.getServiceAmt())); - row.createCell(5).setCellValue(asDouble(item.getDiffAmt())); - row.createCell(6).setCellValue(asDouble(item.getActualReceiptsPayments())); - row.createCell(7).setCellValue(asDouble(item.getDikouAmt())); + row.setHeightInPoints(row.getHeightInPoints() * rowHeightFactor); + boolean isSummary = "report_sum".equals(item.getDataType()); + boolean zebra = (r % 2 == 0); + + CellStyle tStyle = isSummary ? summaryTextStyle : (zebra ? zebraTextStyle : textStyle); + CellStyle nStyle = isSummary ? summaryIntStyle : (zebra ? zebraIntStyle : intStyle); + + createTextCell(row, 0, item.getNickname() == null ? "" : item.getNickname(), tStyle); + createIntCell(row, 1, roundedInt(item.getYestodayBuyAmt()), nStyle); + createIntCell(row, 2, roundedInt(item.getDailySellAmt()), nStyle); + createIntCell(row, 3, roundedInt(item.getDailyBuyAmt()), nStyle); + createIntCell(row, 4, roundedInt(item.getServiceAmt()), nStyle); + createIntCell(row, 5, roundedInt(item.getDiffAmt()), nStyle); + createIntCell(row, 6, roundedInt(item.getActualReceiptsPayments()), nStyle); + createIntCell(row, 7, roundedInt(item.getDikouAmt()), nStyle); + } + + if (r > 1) { + SheetConditionalFormatting scf = sheet.getSheetConditionalFormatting(); + ConditionalFormattingRule negative = scf.createConditionalFormattingRule(ComparisonOperator.LT, "0"); + FontFormatting ff = negative.createFontFormatting(); + ff.setFontColorIndex(IndexedColors.DARK_RED.getIndex()); + ff.setFontStyle(false, false); + scf.addConditionalFormatting(new CellRangeAddress[]{new CellRangeAddress(1, r - 1, 5, 5)}, negative); } for (int i = 0; i <= 7; i++) { sheet.autoSizeColumn(i); + int currentWidth = sheet.getColumnWidth(i); + int widened = (int) Math.min(255 * 256, Math.round(currentWidth * 1.5)); + sheet.setColumnWidth(i, widened); } - String filename = "lbDailyUserTradeReport_" + parsedReportDate + "_" + tenantId.trim() + ".xlsx"; + String filename = "当日汇总报表" + parsedReportDate.format(DateTimeFormatter.ofPattern("yyyyMMdd")) + ".xlsx"; String encoded = URLEncoder.encode(filename, StandardCharsets.UTF_8).replaceAll("\\+", "%20"); response.setCharacterEncoding(StandardCharsets.UTF_8.name()); @@ -466,7 +566,28 @@ public class LbDailyUserTradeReportController { } } - private static double asDouble(BigDecimal value) { - return value == null ? 0d : value.doubleValue(); + private static long roundedInt(BigDecimal value) { + if (value == null) { + return 0L; + } + return value.setScale(0, RoundingMode.HALF_UP).longValue(); + } + + private static void createHeaderCell(Row row, int col, String text, CellStyle style) { + Cell cell = row.createCell(col); + cell.setCellValue(text); + cell.setCellStyle(style); + } + + private static void createTextCell(Row row, int col, String text, CellStyle style) { + Cell cell = row.createCell(col); + cell.setCellValue(text); + cell.setCellStyle(style); + } + + private static void createIntCell(Row row, int col, long value, CellStyle style) { + Cell cell = row.createCell(col); + cell.setCellValue((double) value); + cell.setCellStyle(style); } }