diff --git a/src/com/engine/salary/report/wrapper/SalaryStatisticsEmployeeWrapper.java b/src/com/engine/salary/report/wrapper/SalaryStatisticsEmployeeWrapper.java index 262104e75..66eeff817 100644 --- a/src/com/engine/salary/report/wrapper/SalaryStatisticsEmployeeWrapper.java +++ b/src/com/engine/salary/report/wrapper/SalaryStatisticsEmployeeWrapper.java @@ -7,6 +7,7 @@ import com.cloudstore.eccom.result.WeaResultMsg; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.component.SalaryWeaTable; +import com.engine.salary.component.WeaTableColumnGroup; import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO; import com.engine.salary.entity.salaryarchive.dto.SalaryArchiveListDTO; import com.engine.salary.entity.salaryitem.po.SalaryItemPO; @@ -21,6 +22,8 @@ import com.engine.salary.report.entity.param.SalaryStatisticsEmployeeSalaryQuery import com.engine.salary.report.service.SalaryStatisticsEmployeeService; import com.engine.salary.report.service.impl.SalaryStatisticsEmployeeServiceImpl; import com.engine.salary.report.util.ReportDataUtil; +import com.engine.salary.service.SalaryItemService; +import com.engine.salary.service.impl.SalaryItemServiceImpl; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.excel.ExcelUtilPlus; @@ -57,6 +60,10 @@ public class SalaryStatisticsEmployeeWrapper extends Service { return ServiceUtil.getService(SalaryStatisticsEmployeeServiceImpl.class, user); } + private SalaryItemService getSalaryItemService(User user) { + return ServiceUtil.getService(SalaryItemServiceImpl.class, user); + } + /** * 员工列表 * @@ -164,13 +171,13 @@ public class SalaryStatisticsEmployeeWrapper extends Service { if (record.containsKey(itemKey)) { if (Objects.nonNull(record.get(itemKey)) && StringUtils.isNotEmpty(record.get(itemKey).toString()) && NumberUtils.isCreatable(record.get(itemKey).toString())) { sumBigDecimal = sumBigDecimal.add(new BigDecimal(record.get(itemKey).toString())); - record.put(itemKey, ReportDataUtil.thousandthConvert(record.get(itemKey).toString())); + record.put(itemKey, record.get(itemKey).toString()); } } } // 薪资项目合计 if (queryParam.isExport()) { - countResultMap.put(itemKey, ReportDataUtil.thousandthConvert(sumBigDecimal.toString())); + countResultMap.put(itemKey, sumBigDecimal.toString()); } } } @@ -264,39 +271,61 @@ public class SalaryStatisticsEmployeeWrapper extends Service { queryParam.setExport(true); Map resultMap = salaryList(queryParam); List columns = (List)resultMap.get("columns"); - List salaryItemList = ((List)resultMap.get("salaryItems")); List> resultList = ((PageInfo>) resultMap.get("pageInfo")).getList(); Map countResult = (Map)resultMap.get("countResult"); Map columnMap = SalaryEntityUtil.convert2Map(columns, WeaTableColumn::getColumn); - List finalColumns = new ArrayList<>(); + // 获取薪资项目保留小数位数 + List salaryItemPOList = getSalaryItemService(user).listAll(); + Map salaryItemMap = SalaryEntityUtil.convert2Map(salaryItemPOList, item -> item.getId() + "_salaryItem"); + List finalColumns = new ArrayList<>(); queryParam.getColumns().forEach(col -> { WeaTableColumn column = columnMap.get(col); if (column != null) { - finalColumns.add(column); + SalaryItemPO salaryItemPO = salaryItemMap.get(column.getColumn()); + Integer pattern = salaryItemPO == null ? 0 : salaryItemPO.getPattern(); + String dataType = salaryItemPO == null ? SalaryDataTypeEnum.STRING.getValue() : salaryItemPO.getDataType(); + finalColumns.add(new WeaTableColumnGroup("100px", column.getText(), column.getColumn(), "false", pattern, dataType)); } }); - columns = finalColumns; List> rowList = new ArrayList<>(); // 表头 - rowList.add(columns.stream().map(WeaTableColumn::getText).collect(Collectors.toList())); + rowList.add(finalColumns); // 数据 for (Map valueMap : resultList) { List list = new ArrayList<>(); - for (WeaTableColumn column : columns) { - list.add(Util.null2String(valueMap.get(column.getColumn()))); + for (Object column : finalColumns) { + WeaTableColumnGroup col = (WeaTableColumnGroup)column; + if (col.getDataType().equals(SalaryDataTypeEnum.NUMBER.getValue())) { + try { + list.add(new BigDecimal(Util.null2String(valueMap.get(col.getColumn())))); + } catch (Exception e) { + list.add(Util.null2String(valueMap.get(col.getColumn()))); + } + } else { + list.add(Util.null2String(valueMap.get(col.getColumn()))); + } } rowList.add(list); } // 合计 List sumRow = new ArrayList<>(); sumRow.add("总计"); - for (int i = 1; i < columns.size(); i++) { - sumRow.add(Util.null2String(countResult.get(columns.get(i).getColumn()))); + for (int i = 1; i < finalColumns.size(); i++) { + WeaTableColumnGroup weaTableColumnGroup = (WeaTableColumnGroup)finalColumns.get(i); + if (weaTableColumnGroup.getDataType().equals(SalaryDataTypeEnum.NUMBER.getValue())) { + try { + sumRow.add(new BigDecimal(Util.null2String(countResult.get(weaTableColumnGroup.getColumn())))); + } catch (Exception e) { + sumRow.add(Util.null2String(countResult.get(weaTableColumnGroup.getColumn()))); + } + } else { + sumRow.add(Util.null2String(countResult.get(weaTableColumnGroup.getColumn()))); + } } rowList.add(sumRow); - return ExcelUtilPlus.genWorkbookV2(rowList, "薪资明细", true); + return ExcelUtilPlus.genWorkbookV2WithPattern(rowList, "薪资明细", true); } // public Map exportDetailList(SalaryStatisticsEmployeeDetailQueryParam queryParam) { diff --git a/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java b/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java index b468c29d3..5165b6c50 100644 --- a/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java @@ -619,7 +619,7 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe loggerContext.setOperatedesc(SalaryI18nUtil.getI18nLabel(0, "薪资档案") + "-" + name); loggerContext.setUser(user); SalaryElogConfig.salaryArchiveLoggerTemplate.write(loggerContext); - return ExcelUtilPlus.genWorkbookV2WithPattern(rows, sheetName); + return ExcelUtilPlus.genWorkbookV2WithPattern(rows, sheetName, false); } diff --git a/src/com/engine/salary/util/excel/ExcelUtilPlus.java b/src/com/engine/salary/util/excel/ExcelUtilPlus.java index 748c12c79..f301e8c23 100644 --- a/src/com/engine/salary/util/excel/ExcelUtilPlus.java +++ b/src/com/engine/salary/util/excel/ExcelUtilPlus.java @@ -6,11 +6,13 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.*; -import org.springframework.beans.BeanUtils; import java.awt.Color; import java.math.BigDecimal; -import java.util.*; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -70,7 +72,7 @@ public class ExcelUtilPlus { } - public static XSSFWorkbook genWorkbookV2WithPattern(List> rowList, String sheetName) { + public static XSSFWorkbook genWorkbookV2WithPattern(List> rowList, String sheetName, boolean lastRowRed) { XSSFWorkbook workbook = new XSSFWorkbook(); // 设置title样式 @@ -102,6 +104,19 @@ public class ExcelUtilPlus { cellStyle.setBorderTop(BorderStyle.THIN); cellStyle.setBorderBottom(BorderStyle.THIN); + XSSFCellStyle redCellStyle = workbook.createCellStyle(); + XSSFFont redFont = workbook.createFont(); + redFont.setFontName("宋体"); + redFont.setFontHeightInPoints((short) 10);// 设置字体大小 + redFont.setColor(new XSSFColor(new Color(0xFF3333), null)); + redFont.setBold(true); + redCellStyle.setWrapText(true); + redCellStyle.setFont(redFont);// 选择需要用到的字体格式 + redCellStyle.setBorderLeft(BorderStyle.THIN); + redCellStyle.setBorderRight(BorderStyle.THIN); + redCellStyle.setBorderTop(BorderStyle.THIN); + redCellStyle.setBorderBottom(BorderStyle.THIN); + XSSFSheet sheet = workbook.createSheet(sheetName); //自适应宽度 sheet.autoSizeColumn(0, true); @@ -124,20 +139,38 @@ public class ExcelUtilPlus { } HashMap numberCellStyleMap = new HashMap(); + HashMap numberRedCellStyleMap = new HashMap(); XSSFDataFormat df = workbook.createDataFormat(); patternList.stream().distinct().filter(a -> a != null).forEach(p -> { String start = "0."; if (p == 0) { start = "0"; } + + XSSFCellStyle numberRedCellStyle = workbook.createCellStyle(); + // 不能copy,在excel里编辑时背景变成了黑色 + // BeanUtils.copyProperties(redCellStyle, numberRedCellStyle); + numberRedCellStyle.setWrapText(true); + numberRedCellStyle.setBorderLeft(BorderStyle.THIN); + numberRedCellStyle.setBorderRight(BorderStyle.THIN); + numberRedCellStyle.setBorderTop(BorderStyle.THIN); + numberRedCellStyle.setBorderBottom(BorderStyle.THIN); + numberRedCellStyle.setFont(redFont); short format = df.getFormat(start + Stream.generate(() -> "0").limit(p).collect(Collectors.joining()) + "_ "); + numberRedCellStyle.setDataFormat(format); + numberRedCellStyleMap.put(p, numberRedCellStyle); XSSFCellStyle numberCellStyle = workbook.createCellStyle(); - BeanUtils.copyProperties(cellStyle, numberCellStyle); + // BeanUtils.copyProperties(cellStyle, numberCellStyle); + numberCellStyle.setFont(font);// 选择需要用到的字体格式 + numberCellStyle.setWrapText(true); + numberCellStyle.setBorderLeft(BorderStyle.THIN); + numberCellStyle.setBorderRight(BorderStyle.THIN); + numberCellStyle.setBorderTop(BorderStyle.THIN); + numberCellStyle.setBorderBottom(BorderStyle.THIN); numberCellStyle.setDataFormat(format); numberCellStyleMap.put(p, numberCellStyle); }); - for (int rowIndex = 1; rowIndex < rowList.size(); rowIndex++) { List infoList = rowList.get(rowIndex); XSSFRow row = sheet.createRow(rowIndex); @@ -149,16 +182,25 @@ public class ExcelUtilPlus { if (rowIndex == 0) { cell.setCellStyle(titleCellStyle); } else { - cell.setCellStyle(cellStyle); + if (lastRowRed && rowIndex == rowList.size() - 1) { + cell.setCellStyle(redCellStyle); + } else { + cell.setCellStyle(cellStyle); + } } Object o = infoList.get(cellIndex); if (o instanceof String) { cell.setCellType(CellType.STRING); cell.setCellValue(String.valueOf(o)); } else if (o instanceof BigDecimal) { + if (lastRowRed && rowIndex == rowList.size() - 1) { + cell.setCellStyle(numberRedCellStyleMap.get(patternList.get(cellIndex))); + } else { + cell.setCellStyle(numberCellStyleMap.get(patternList.get(cellIndex))); + } cell.setCellType(CellType.NUMERIC); + double value = o == null ? 0 : ((BigDecimal) o).doubleValue(); cell.setCellValue(o == null ? 0 : ((BigDecimal) o).doubleValue()); - cell.setCellStyle(numberCellStyleMap.get(patternList.get(cellIndex))); } else if (o instanceof Boolean) { cell.setCellType(CellType.BOOLEAN); cell.setCellValue(String.valueOf(o));