|
@@ -0,0 +1,584 @@
|
|
|
+package com.nokia.tsl_data.service;
|
|
|
+
|
|
|
+import java.io.FileOutputStream;
|
|
|
+import java.io.OutputStream;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.text.DateFormat;
|
|
|
+import java.text.ParseException;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+import java.util.Calendar;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Locale;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+import org.apache.poi.ss.usermodel.BorderStyle;
|
|
|
+import org.apache.poi.ss.usermodel.Cell;
|
|
|
+import org.apache.poi.ss.usermodel.ConditionalFormattingRule;
|
|
|
+import org.apache.poi.ss.usermodel.FillPatternType;
|
|
|
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
|
|
|
+import org.apache.poi.ss.usermodel.Row;
|
|
|
+import org.apache.poi.ss.usermodel.Sheet;
|
|
|
+import org.apache.poi.ss.usermodel.SheetConditionalFormatting;
|
|
|
+import org.apache.poi.ss.util.CellRangeAddress;
|
|
|
+import org.apache.poi.ss.util.RegionUtil;
|
|
|
+import org.apache.poi.xssf.usermodel.XSSFCellStyle;
|
|
|
+import org.apache.poi.xssf.usermodel.XSSFColor;
|
|
|
+import org.apache.poi.xssf.usermodel.XSSFDataFormat;
|
|
|
+import org.apache.poi.xssf.usermodel.XSSFFont;
|
|
|
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 投诉报表数据生成
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class TslReportService {
|
|
|
+
|
|
|
+ private final TslDataService tslDataService;
|
|
|
+
|
|
|
+ private XSSFWorkbook workbook = null;
|
|
|
+
|
|
|
+ // 等线 9号字 普通单元格 带边框
|
|
|
+ private XSSFCellStyle cellStyle1 = null;
|
|
|
+ // 等线 9号字 加粗 标题栏 带边框
|
|
|
+ private XSSFCellStyle cellStyle2 = null;
|
|
|
+ // 等线 9号字 带边框 小数 保留2位
|
|
|
+ private XSSFCellStyle cellStyle3 = null;
|
|
|
+
|
|
|
+ private static final DateFormat DAY_FORMAT = new SimpleDateFormat("yyyyMMdd");
|
|
|
+
|
|
|
+ public TslReportService(TslDataService tslDataService) {
|
|
|
+ this.tslDataService = tslDataService;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void workbookToFile(String day, String path) {
|
|
|
+ getSheet1(day);
|
|
|
+ getSheet2(day);
|
|
|
+ getSheet3(day);
|
|
|
+ try (OutputStream outputStream = new FileOutputStream(path)) {
|
|
|
+ workbook.write(outputStream);
|
|
|
+ workbook.close();
|
|
|
+ workbook = null;
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.info("写入失败。。。");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 投诉处理时长、超时工单概况
|
|
|
+ *
|
|
|
+ * @param day
|
|
|
+ */
|
|
|
+ private void getSheet3(String day) {
|
|
|
+ // 计算时间常数
|
|
|
+ Calendar calendar = Calendar.getInstance(Locale.CHINA);
|
|
|
+ try {
|
|
|
+ calendar.setTime(DAY_FORMAT.parse(day));
|
|
|
+ } catch (ParseException e) {
|
|
|
+ log.error("时间字符串解析失败--{}", day);
|
|
|
+ }
|
|
|
+ int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
|
|
|
+ int monthOfYear = calendar.get(Calendar.MONTH);
|
|
|
+ int preMonthOfYear = monthOfYear > 1 ? monthOfYear - 1 : 12;
|
|
|
+
|
|
|
+ Sheet sheet = getWorkbook().createSheet("投诉处理时长、超时工单概况");
|
|
|
+ Row row;
|
|
|
+ Cell cell;
|
|
|
+ CellRangeAddress rangeAddress;
|
|
|
+ XSSFDataFormat dataFormat = getWorkbook().createDataFormat();
|
|
|
+ XSSFFont font = getWorkbook().createFont();
|
|
|
+ font.setFontName("等线");
|
|
|
+ font.setFontHeightInPoints((short) 10);
|
|
|
+ // 基本模式 等线 10号字 带全边框 水平居中
|
|
|
+ XSSFCellStyle baseStyle = getWorkbook().createCellStyle();
|
|
|
+ baseStyle.setFont(font);
|
|
|
+ baseStyle.setAlignment(HorizontalAlignment.CENTER);
|
|
|
+ baseStyle.setBorderBottom(BorderStyle.THIN);
|
|
|
+ baseStyle.setBorderTop(BorderStyle.THIN);
|
|
|
+ baseStyle.setBorderLeft(BorderStyle.THIN);
|
|
|
+ baseStyle.setBorderRight(BorderStyle.THIN);
|
|
|
+ // 样式1 与base相同
|
|
|
+ XSSFCellStyle cellStyle1 = baseStyle.copy();
|
|
|
+ // 样式2 百分比 2位小数
|
|
|
+ XSSFCellStyle cellStyle2 = baseStyle.copy();
|
|
|
+ cellStyle2.setDataFormat(dataFormat.getFormat("0.00%"));
|
|
|
+ // 样式3 自动换行 背景色FFE7E6E6
|
|
|
+ XSSFCellStyle cellStyle3 = baseStyle.copy();
|
|
|
+ cellStyle3.setWrapText(true);
|
|
|
+ XSSFColor color = new XSSFColor();
|
|
|
+ color.setARGBHex("FFE7E6E6");
|
|
|
+ cellStyle3.setFillPattern(FillPatternType.SOLID_FOREGROUND);
|
|
|
+ cellStyle3.setFillForegroundColor(color);
|
|
|
+ // 样式4 小数 保留2位
|
|
|
+ XSSFCellStyle cellStyle4 = baseStyle.copy();
|
|
|
+ cellStyle4.setDataFormat(dataFormat.getFormat("0.00"));
|
|
|
+
|
|
|
+ // 第一行
|
|
|
+ row = sheet.createRow(0);
|
|
|
+ cell = row.createCell(0);
|
|
|
+ cell.setCellValue(String.format("超时工单情况(1-%s)", dayOfMonth));
|
|
|
+ cell.setCellStyle(cellStyle3);
|
|
|
+ // 合并单元格 A1 - D1
|
|
|
+ rangeAddress = new CellRangeAddress(0, 0, 0, 3);
|
|
|
+ addMergedRegion(sheet, rangeAddress);
|
|
|
+ cell = row.createCell(6);
|
|
|
+ cell.setCellValue(String.format("平均处理时长(1-%s)", dayOfMonth));
|
|
|
+ cell.setCellStyle(cellStyle3);
|
|
|
+ // 合并单元格 G1 - J1
|
|
|
+ rangeAddress = new CellRangeAddress(0, 0, 6, 9);
|
|
|
+ addMergedRegion(sheet, rangeAddress);
|
|
|
+
|
|
|
+ // 第二行
|
|
|
+ row = sheet.createRow(1);
|
|
|
+ cell = row.createCell(0);
|
|
|
+ cell.setCellValue("地市");
|
|
|
+ cell.setCellStyle(cellStyle3);
|
|
|
+ cell = row.createCell(1);
|
|
|
+ cell.setCellValue("工单数");
|
|
|
+ cell.setCellStyle(cellStyle3);
|
|
|
+ cell = row.createCell(2);
|
|
|
+ cell.setCellValue("超时工单数");
|
|
|
+ cell.setCellStyle(cellStyle3);
|
|
|
+ cell = row.createCell(3);
|
|
|
+ cell.setCellValue("超时工单占比");
|
|
|
+ cell.setCellStyle(cellStyle3);
|
|
|
+ cell = row.createCell(6);
|
|
|
+ cell.setCellValue("地市");
|
|
|
+ cell.setCellStyle(cellStyle3);
|
|
|
+ cell = row.createCell(7);
|
|
|
+ cell.setCellValue(String.format("%s月", preMonthOfYear));
|
|
|
+ cell.setCellStyle(cellStyle3);
|
|
|
+ cell = row.createCell(8);
|
|
|
+ cell.setCellValue(String.format("%s月", monthOfYear));
|
|
|
+ cell.setCellStyle(cellStyle3);
|
|
|
+ cell = row.createCell(9);
|
|
|
+ cell.setCellValue("涨幅");
|
|
|
+ cell.setCellStyle(cellStyle3);
|
|
|
+
|
|
|
+ // 设置列宽 2048 2276*3 2048*3 2276*2 3612
|
|
|
+ sheet.setColumnWidth(0, 2048);
|
|
|
+ sheet.setColumnWidth(1, 2276);
|
|
|
+ sheet.setColumnWidth(2, 2276);
|
|
|
+ sheet.setColumnWidth(3, 2276);
|
|
|
+ sheet.setColumnWidth(4, 2048);
|
|
|
+ sheet.setColumnWidth(5, 2048);
|
|
|
+ sheet.setColumnWidth(6, 2048);
|
|
|
+ sheet.setColumnWidth(7, 2276);
|
|
|
+ sheet.setColumnWidth(8, 2276);
|
|
|
+ sheet.setColumnWidth(9, 3612);
|
|
|
+
|
|
|
+ // 设置行高 14.25 25.5 14.25...
|
|
|
+ sheet.getRow(0).setHeightInPoints(14.25F);
|
|
|
+ sheet.getRow(1).setHeightInPoints(25.5F);
|
|
|
+ for (int i = 2; i < 15; i++) {
|
|
|
+ sheet.getRow(i).setHeightInPoints(14.25F);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 管理端-重复投诉率
|
|
|
+ *
|
|
|
+ * @param day
|
|
|
+ */
|
|
|
+ private void getSheet2(String day) {
|
|
|
+ // 计算时间常数
|
|
|
+ Calendar calendar = Calendar.getInstance(Locale.CHINA);
|
|
|
+ try {
|
|
|
+ calendar.setTime(DAY_FORMAT.parse(day));
|
|
|
+ } catch (ParseException e) {
|
|
|
+ log.error("时间字符串解析失败--{}", day);
|
|
|
+ }
|
|
|
+ int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
|
|
|
+ int monthOfYear = calendar.get(Calendar.MONTH);
|
|
|
+ // 显示当前和前一天的对比
|
|
|
+ int preDayOfMonth = (dayOfMonth > 1) ? dayOfMonth - 1 : dayOfMonth;
|
|
|
+
|
|
|
+ Sheet sheet = getWorkbook().createSheet("管理端-重复投诉率");
|
|
|
+ Row row;
|
|
|
+ Cell cell;
|
|
|
+ CellRangeAddress rangeAddress;
|
|
|
+ XSSFFont font;
|
|
|
+ XSSFDataFormat dataFormat = getWorkbook().createDataFormat();
|
|
|
+ // 基本模式 等线 10号字 带全边框 水平居中
|
|
|
+ XSSFCellStyle baseStyle = getWorkbook().createCellStyle();
|
|
|
+ font = getWorkbook().createFont();
|
|
|
+ font.setFontName("等线");
|
|
|
+ font.setFontHeightInPoints((short) 10);
|
|
|
+ baseStyle.setFont(font);
|
|
|
+ baseStyle.setAlignment(HorizontalAlignment.CENTER);
|
|
|
+ baseStyle.setBorderBottom(BorderStyle.THIN);
|
|
|
+ baseStyle.setBorderTop(BorderStyle.THIN);
|
|
|
+ baseStyle.setBorderLeft(BorderStyle.THIN);
|
|
|
+ baseStyle.setBorderRight(BorderStyle.THIN);
|
|
|
+ // 基础模式
|
|
|
+ XSSFCellStyle cellStyle1 = baseStyle.copy();
|
|
|
+ // 带边框 百分比 2位小数
|
|
|
+ XSSFCellStyle cellStyle2 = baseStyle.copy();
|
|
|
+ cellStyle2.setDataFormat(dataFormat.getFormat("0.00%"));
|
|
|
+ // 等线 10号字 自动换行 背景色FFE7E6E6
|
|
|
+ XSSFCellStyle cellStyle3 = baseStyle.copy();
|
|
|
+ cellStyle3.setWrapText(true);
|
|
|
+ XSSFColor color = new XSSFColor();
|
|
|
+ color.setARGBHex("FFE7E6E6");
|
|
|
+ cellStyle3.setFillPattern(FillPatternType.SOLID_FOREGROUND);
|
|
|
+ cellStyle3.setFillForegroundColor(color);
|
|
|
+
|
|
|
+ // 第一行 标题栏
|
|
|
+ row = sheet.createRow(0);
|
|
|
+ cell = row.createCell(0);
|
|
|
+ cell.setCellValue(String.format("重复投诉率(1-%s)", dayOfMonth));
|
|
|
+ cell.setCellStyle(cellStyle3);
|
|
|
+ // 合并单元格 A1 - G1
|
|
|
+ rangeAddress = new CellRangeAddress(0, 0, 0, 6);
|
|
|
+ addMergedRegion(sheet, rangeAddress);
|
|
|
+
|
|
|
+ // 第二行
|
|
|
+ row = sheet.createRow(1);
|
|
|
+ cell = row.createCell(0);
|
|
|
+ cell.setCellValue("");
|
|
|
+ cell.setCellStyle(cellStyle3);
|
|
|
+ cell = row.createCell(1);
|
|
|
+ cell.setCellValue("重复投诉工单数");
|
|
|
+ cell.setCellStyle(cellStyle3);
|
|
|
+ // 合并单元格 B2-C2
|
|
|
+ rangeAddress = new CellRangeAddress(1, 1, 1, 2);
|
|
|
+ addMergedRegion(sheet, rangeAddress);
|
|
|
+ cell = row.createCell(3);
|
|
|
+ cell.setCellValue("重复投诉率");
|
|
|
+ cell.setCellStyle(cellStyle3);
|
|
|
+ // 合并单元格 B2-C2
|
|
|
+ rangeAddress = new CellRangeAddress(1, 1, 3, 4);
|
|
|
+ addMergedRegion(sheet, rangeAddress);
|
|
|
+ cell = row.createCell(5);
|
|
|
+ cell.setCellValue("增量");
|
|
|
+ cell.setCellStyle(cellStyle3);
|
|
|
+ // 合并单元格 F2-G2
|
|
|
+ rangeAddress = new CellRangeAddress(1, 1, 5, 6);
|
|
|
+ addMergedRegion(sheet, rangeAddress);
|
|
|
+
|
|
|
+ // 第三行
|
|
|
+ row = sheet.createRow(2);
|
|
|
+ cell = row.createCell(0);
|
|
|
+ cell.setCellValue("地市");
|
|
|
+ cell.setCellStyle(cellStyle3);
|
|
|
+ cell = row.createCell(1);
|
|
|
+ cell.setCellValue(String.format("%s月截止%s日", monthOfYear, preDayOfMonth));
|
|
|
+ cell.setCellStyle(cellStyle3);
|
|
|
+ cell = row.createCell(2);
|
|
|
+ cell.setCellValue(String.format("%s月截止%s日", monthOfYear, dayOfMonth));
|
|
|
+ cell.setCellStyle(cellStyle3);
|
|
|
+ cell = row.createCell(3);
|
|
|
+ cell.setCellValue(String.format("%s月截止%s日", monthOfYear, preDayOfMonth));
|
|
|
+ cell.setCellStyle(cellStyle3);
|
|
|
+ cell = row.createCell(4);
|
|
|
+ cell.setCellValue(String.format("%s月截止%s日", monthOfYear, dayOfMonth));
|
|
|
+ cell.setCellStyle(cellStyle3);
|
|
|
+ cell = row.createCell(5);
|
|
|
+ cell.setCellValue("重复投诉工单数");
|
|
|
+ cell.setCellStyle(cellStyle3);
|
|
|
+ cell = row.createCell(6);
|
|
|
+ cell.setCellValue("重复投诉率");
|
|
|
+ cell.setCellStyle(cellStyle3);
|
|
|
+
|
|
|
+ // 写入数据行
|
|
|
+ List<List<Object>> sheet2Data = tslDataService.getSheet2Data(day);
|
|
|
+ int rowNum = 3;
|
|
|
+ for (List<Object> list : sheet2Data) {
|
|
|
+ row = sheet.createRow(rowNum++);
|
|
|
+ cell = row.createCell(0);
|
|
|
+ // 地市
|
|
|
+ cell.setCellValue(list.get(0).toString());
|
|
|
+ cell.setCellStyle(cellStyle1);
|
|
|
+ // 前一天重复工单数
|
|
|
+ cell = row.createCell(1);
|
|
|
+ cell.setCellValue(((BigDecimal) list.get(1)).intValue());
|
|
|
+ cell.setCellStyle(cellStyle1);
|
|
|
+ // 当天重复工单数
|
|
|
+ cell = row.createCell(2);
|
|
|
+ cell.setCellValue(((BigDecimal) list.get(2)).intValue());
|
|
|
+ cell.setCellStyle(cellStyle1);
|
|
|
+ // 前一天重复投诉率
|
|
|
+ cell = row.createCell(3);
|
|
|
+ cell.setCellValue(((BigDecimal) list.get(3)).doubleValue());
|
|
|
+ cell.setCellStyle(cellStyle2);
|
|
|
+ // 当前重复投诉率
|
|
|
+ cell = row.createCell(4);
|
|
|
+ cell.setCellValue(((BigDecimal) list.get(4)).doubleValue());
|
|
|
+ cell.setCellStyle(cellStyle2);
|
|
|
+ // 重复工单增量
|
|
|
+ cell = row.createCell(5);
|
|
|
+ cell.setCellValue(((BigDecimal) list.get(5)).intValue());
|
|
|
+ cell.setCellStyle(cellStyle1);
|
|
|
+ // 重复投诉率增量
|
|
|
+ cell = row.createCell(6);
|
|
|
+ cell.setCellValue(((BigDecimal) list.get(6)).doubleValue());
|
|
|
+ cell.setCellStyle(cellStyle2);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 添加条件格式F4-F15
|
|
|
+ rangeAddress = new CellRangeAddress(3, 14, 5, 5);
|
|
|
+ setConditionalFormatting(sheet, rangeAddress);
|
|
|
+ // 添加条件格式G4-G15
|
|
|
+ rangeAddress = new CellRangeAddress(3, 14, 6, 6);
|
|
|
+ setConditionalFormatting(sheet, rangeAddress);
|
|
|
+
|
|
|
+ // 设置列宽2048
|
|
|
+ for (int i = 0; i <= 6; i++) {
|
|
|
+ sheet.setColumnWidth(i, 2048);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设置行高 14.25 27.5 25.5 14.25 ...
|
|
|
+ sheet.getRow(0).setHeightInPoints(14.25F);
|
|
|
+ sheet.getRow(1).setHeightInPoints(27.5F);
|
|
|
+ sheet.getRow(2).setHeightInPoints(25.5F);
|
|
|
+ for (int i = 3; i < 16; i++) {
|
|
|
+ sheet.getRow(i).setHeightInPoints(14.25F);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 管理端-移网质量类
|
|
|
+ *
|
|
|
+ * @param day
|
|
|
+ */
|
|
|
+ private void getSheet1(String day) {
|
|
|
+ Sheet sheet = getWorkbook().createSheet("管理端-移网质量类");
|
|
|
+
|
|
|
+ // 计算天数
|
|
|
+ LocalDate date = LocalDate.parse(day, DateTimeFormatter.ofPattern("yyyyMMdd"));
|
|
|
+ int dayOfMonth = date.getDayOfMonth();
|
|
|
+
|
|
|
+ Row row;
|
|
|
+ Cell cell;
|
|
|
+
|
|
|
+ // 第一行 标题栏
|
|
|
+ cell = sheet.createRow(0).createCell(0);
|
|
|
+ cell.setCellValue("2023年客服投诉清单各地市投诉率情况(管理端-移网质量类)");
|
|
|
+ cell.setCellStyle(getCellStyle2());
|
|
|
+ // 合并单元格
|
|
|
+ CellRangeAddress range = new CellRangeAddress(0, 0, 0, dayOfMonth + 7);
|
|
|
+ sheet.addMergedRegion(range);
|
|
|
+ // 设置合并单元格的边框
|
|
|
+ RegionUtil.setBorderBottom(BorderStyle.THIN, range, sheet);
|
|
|
+ RegionUtil.setBorderTop(BorderStyle.THIN, range, sheet);
|
|
|
+ RegionUtil.setBorderLeft(BorderStyle.THIN, range, sheet);
|
|
|
+ RegionUtil.setBorderRight(BorderStyle.THIN, range, sheet);
|
|
|
+
|
|
|
+ // 第二行 列名
|
|
|
+ row = sheet.createRow(1);
|
|
|
+ cell = row.createCell(0);
|
|
|
+ cell.setCellValue("地市");
|
|
|
+ cell.setCellStyle(getCellStyle1());
|
|
|
+ for (int i = 1; i <= dayOfMonth; i++) {
|
|
|
+ cell = row.createCell(i);
|
|
|
+ cell.setCellValue(i + "日");
|
|
|
+ cell.setCellStyle(getCellStyle1());
|
|
|
+ }
|
|
|
+ cell = row.createCell(dayOfMonth + 1);
|
|
|
+ cell.setCellValue("投诉总量");
|
|
|
+ cell.setCellStyle(getCellStyle1());
|
|
|
+ cell = row.createCell(dayOfMonth + 2);
|
|
|
+ cell.setCellValue("用户数");
|
|
|
+ cell.setCellStyle(getCellStyle1());
|
|
|
+ cell = row.createCell(dayOfMonth + 3);
|
|
|
+ cell.setCellValue("目前万投率");
|
|
|
+ cell.setCellStyle(getCellStyle1());
|
|
|
+ cell = row.createCell(dayOfMonth + 4);
|
|
|
+ cell.setCellValue("本月预测");
|
|
|
+ cell.setCellStyle(getCellStyle1());
|
|
|
+ cell = row.createCell(dayOfMonth + 5);
|
|
|
+ cell.setCellValue("目标值");
|
|
|
+ cell.setCellStyle(getCellStyle1());
|
|
|
+ cell = row.createCell(dayOfMonth + 6);
|
|
|
+ cell.setCellValue("与目标差距");
|
|
|
+ cell.setCellStyle(getCellStyle1());
|
|
|
+ cell = row.createCell(dayOfMonth + 7);
|
|
|
+ cell.setCellValue("地市");
|
|
|
+ cell.setCellStyle(getCellStyle1());
|
|
|
+
|
|
|
+ // 获取数据
|
|
|
+ Map<String, List<Object>> seet1Data = tslDataService.getSeet1Data(day);
|
|
|
+
|
|
|
+ int rowNum = 2;
|
|
|
+ int cellNum = 0;
|
|
|
+ // 写入各地市数据
|
|
|
+ for (String area : tslDataService.getAreas()) {
|
|
|
+ row = sheet.createRow(rowNum++);
|
|
|
+ // 写入A列的地市
|
|
|
+ cell = row.createCell(cellNum++);
|
|
|
+ cell.setCellValue(area);
|
|
|
+ cell.setCellStyle(getCellStyle1());
|
|
|
+ for (Object obj : seet1Data.get(area)) {
|
|
|
+ cell = row.createCell(cellNum++);
|
|
|
+ cell.setCellValue(Double.parseDouble(obj.toString()));
|
|
|
+ cell.setCellStyle(getCellStyle1());
|
|
|
+ }
|
|
|
+ // 写入AC列的地市
|
|
|
+ cell = row.createCell(cellNum++);
|
|
|
+ cell.setCellValue(area);
|
|
|
+ cell.setCellStyle(getCellStyle1());
|
|
|
+ // cellNum复位
|
|
|
+ cellNum = 0;
|
|
|
+ }
|
|
|
+ // 写入全省数据
|
|
|
+ row = sheet.createRow(rowNum);
|
|
|
+ // 写入A列的地市
|
|
|
+ cell = row.createCell(cellNum++);
|
|
|
+ cell.setCellValue("全省");
|
|
|
+ cell.setCellStyle(getCellStyle1());
|
|
|
+ for (Object obj : seet1Data.get("全省")) {
|
|
|
+ cell = row.createCell(cellNum++);
|
|
|
+ cell.setCellValue(Double.parseDouble(obj.toString()));
|
|
|
+ cell.setCellStyle(getCellStyle1());
|
|
|
+ }
|
|
|
+ // 写入AC列的地市
|
|
|
+ cell = row.createCell(cellNum++);
|
|
|
+ cell.setCellValue("全省");
|
|
|
+ cell.setCellStyle(getCellStyle1());
|
|
|
+
|
|
|
+ // 3-15行(2-14)X列到AB列 (23-27)是浮点数,设置为显示小数点后2位
|
|
|
+ for (int i = 2; i <= 14; i++) {
|
|
|
+ row = sheet.getRow(i);
|
|
|
+ for (int j = 23; j <= 27; j++) {
|
|
|
+ cell = row.getCell(j);
|
|
|
+ cell.setCellStyle(getCellStyle3());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 添加条件格式B15-V15
|
|
|
+ CellRangeAddress rangeAddress = new CellRangeAddress(rowNum, rowNum, 1, dayOfMonth);
|
|
|
+ setConditionalFormatting(sheet, rangeAddress);
|
|
|
+ // 添加条件格式Y3-Y14
|
|
|
+ rangeAddress = new CellRangeAddress(2, 13, 24, 24);
|
|
|
+ setConditionalFormatting(sheet, rangeAddress);
|
|
|
+ // 添加条件格式Z3-Z14
|
|
|
+ rangeAddress = new CellRangeAddress(2, 13, 25, 25);
|
|
|
+ setConditionalFormatting(sheet, rangeAddress);
|
|
|
+ // 添加条件格式AB3-AB14
|
|
|
+ rangeAddress = new CellRangeAddress(2, 13, 27, 27);
|
|
|
+ setConditionalFormatting(sheet, rangeAddress);
|
|
|
+
|
|
|
+ // 设置sheet的列宽 1409, 876, 876, ..., 876, 1792, 1665, 2177, 2844, 1409, 2177, 1409
|
|
|
+ sheet.setColumnWidth(0, 1409);
|
|
|
+ for (int i = 1; i <= dayOfMonth; i++) {
|
|
|
+ sheet.setColumnWidth(i, 876);
|
|
|
+ }
|
|
|
+ sheet.setColumnWidth(dayOfMonth + 1, 1792);
|
|
|
+ sheet.setColumnWidth(dayOfMonth + 2, 1665);
|
|
|
+ sheet.setColumnWidth(dayOfMonth + 3, 2177);
|
|
|
+ sheet.setColumnWidth(dayOfMonth + 4, 2844);
|
|
|
+ sheet.setColumnWidth(dayOfMonth + 5, 1409);
|
|
|
+ sheet.setColumnWidth(dayOfMonth + 6, 2177);
|
|
|
+ sheet.setColumnWidth(dayOfMonth + 7, 1409);
|
|
|
+
|
|
|
+ // 设置行高 12
|
|
|
+ for (int i = 0; i < rowNum; i++) {
|
|
|
+ sheet.getRow(i).setHeightInPoints(12F);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private XSSFWorkbook getWorkbook() {
|
|
|
+ if (workbook == null) {
|
|
|
+ workbook = new XSSFWorkbook();
|
|
|
+ }
|
|
|
+ return this.workbook;
|
|
|
+ }
|
|
|
+
|
|
|
+ private XSSFCellStyle getCellStyle1() {
|
|
|
+ if (cellStyle1 == null) {
|
|
|
+ cellStyle1 = getWorkbook().createCellStyle();
|
|
|
+ cellStyle1.setAlignment(HorizontalAlignment.CENTER);
|
|
|
+ XSSFFont font = getWorkbook().createFont();
|
|
|
+ font.setFontName("等线");
|
|
|
+ font.setBold(false);
|
|
|
+ font.setFontHeightInPoints((short) 9);
|
|
|
+ cellStyle1.setFont(font);
|
|
|
+ cellStyle1.setBorderBottom(BorderStyle.THIN);
|
|
|
+ cellStyle1.setBorderTop(BorderStyle.THIN);
|
|
|
+ cellStyle1.setBorderLeft(BorderStyle.THIN);
|
|
|
+ cellStyle1.setBorderRight(BorderStyle.THIN);
|
|
|
+ }
|
|
|
+ return this.cellStyle1;
|
|
|
+ }
|
|
|
+
|
|
|
+ private XSSFCellStyle getCellStyle2() {
|
|
|
+ if (cellStyle2 == null) {
|
|
|
+ cellStyle2 = getWorkbook().createCellStyle();
|
|
|
+ cellStyle2.setAlignment(HorizontalAlignment.CENTER);
|
|
|
+ XSSFFont font = getWorkbook().createFont();
|
|
|
+ font.setFontName("等线");
|
|
|
+ font.setBold(true);
|
|
|
+ font.setFontHeightInPoints((short) 9);
|
|
|
+ cellStyle2.setFont(font);
|
|
|
+ cellStyle2.setBorderBottom(BorderStyle.THIN);
|
|
|
+ cellStyle2.setBorderTop(BorderStyle.THIN);
|
|
|
+ cellStyle2.setBorderLeft(BorderStyle.THIN);
|
|
|
+ cellStyle2.setBorderRight(BorderStyle.THIN);
|
|
|
+ }
|
|
|
+ return this.cellStyle2;
|
|
|
+ }
|
|
|
+
|
|
|
+ private XSSFCellStyle getCellStyle3() {
|
|
|
+ if (cellStyle3 == null) {
|
|
|
+ cellStyle3 = getWorkbook().createCellStyle();
|
|
|
+ cellStyle3.setAlignment(HorizontalAlignment.CENTER);
|
|
|
+ XSSFFont font = getWorkbook().createFont();
|
|
|
+ font.setFontName("等线");
|
|
|
+ font.setBold(false);
|
|
|
+ font.setFontHeightInPoints((short) 9);
|
|
|
+ cellStyle3.setFont(font);
|
|
|
+ cellStyle3.setBorderBottom(BorderStyle.THIN);
|
|
|
+ cellStyle3.setBorderTop(BorderStyle.THIN);
|
|
|
+ cellStyle3.setBorderLeft(BorderStyle.THIN);
|
|
|
+ cellStyle3.setBorderRight(BorderStyle.THIN);
|
|
|
+ XSSFDataFormat format = getWorkbook().createDataFormat();
|
|
|
+ cellStyle3.setDataFormat(format.getFormat("0.00"));
|
|
|
+ }
|
|
|
+ return this.cellStyle3;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加合并单元格并添加边框
|
|
|
+ *
|
|
|
+ * @param sheet
|
|
|
+ * @param range
|
|
|
+ */
|
|
|
+ private void addMergedRegion(Sheet sheet, CellRangeAddress range) {
|
|
|
+ sheet.addMergedRegion(range);
|
|
|
+ // 设置合并单元格的边框
|
|
|
+ RegionUtil.setBorderBottom(BorderStyle.THIN, range, sheet);
|
|
|
+ RegionUtil.setBorderTop(BorderStyle.THIN, range, sheet);
|
|
|
+ RegionUtil.setBorderLeft(BorderStyle.THIN, range, sheet);
|
|
|
+ RegionUtil.setBorderRight(BorderStyle.THIN, range, sheet);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 条件格式 3色渐变
|
|
|
+ * 绿 FF63BE7B 黄 FFFFEB84 红 FFF8696B
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private void setConditionalFormatting(Sheet sheet, CellRangeAddress rangeAddress) {
|
|
|
+ SheetConditionalFormatting conditionalFormatting = sheet.getSheetConditionalFormatting();
|
|
|
+ ConditionalFormattingRule rule = conditionalFormatting.createConditionalFormattingColorScaleRule();
|
|
|
+ XSSFColor[] colors = new XSSFColor[] {
|
|
|
+ new XSSFColor(), new XSSFColor(), new XSSFColor()
|
|
|
+ };
|
|
|
+ colors[0].setARGBHex("FF63BE7B");
|
|
|
+ colors[1].setARGBHex("FFFFEB84");
|
|
|
+ colors[2].setARGBHex("FFF8696B");
|
|
|
+
|
|
|
+ rule.getColorScaleFormatting().setColors(colors);
|
|
|
+
|
|
|
+ CellRangeAddress[] cellRangeAddresses = new CellRangeAddress[] {
|
|
|
+ rangeAddress
|
|
|
+ };
|
|
|
+
|
|
|
+ conditionalFormatting.addConditionalFormatting(cellRangeAddresses, rule);
|
|
|
+ }
|
|
|
+}
|