package com.jilongda.manage; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellRangeAddress; import org.aspectj.lang.annotation.Before; import org.junit.jupiter.api.Test; import java.io.FileOutputStream; import java.io.IOException; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; /** * @author xuanjinnan * @date 2022/12/9 10:32 */ public class MyComplexTemplateTest { List traffics = new ArrayList<>(); @Test public void myNestedLoopTest() throws IOException { Traffic traffic1 = new Traffic("小明", Date.from(LocalDateTime.now().minusDays(4).atZone(ZoneId.systemDefault()).toInstant()) , new ArrayList<>(Arrays.asList(new TrafficDetail(1,3),new TrafficDetail(2,4),new TrafficDetail(3,4))) , new ArrayList<>(Collections.singletonList(new TrafficDetail(1, 5)))); Traffic traffic2 = new Traffic("小明", Date.from(LocalDateTime.now().minusDays(3).atZone(ZoneId.systemDefault()).toInstant()) , new ArrayList<>(Collections.singletonList(new TrafficDetail(1, 3))) , new ArrayList<>(Arrays.asList(new TrafficDetail(1,5),new TrafficDetail(2,6),new TrafficDetail(3,7)))); Traffic traffic3 = new Traffic("小明", Date.from(LocalDateTime.now().minusDays(2).atZone(ZoneId.systemDefault()).toInstant()) , new ArrayList<>(Collections.singletonList(new TrafficDetail(1, 3))) , new ArrayList<>(Collections.singletonList(new TrafficDetail()))); Traffic traffic4 = new Traffic("小明", Date.from(LocalDateTime.now().minusDays(1).atZone(ZoneId.systemDefault()).toInstant()) , new ArrayList<>(Collections.singletonList(new TrafficDetail())) , new ArrayList<>(Collections.singletonList(new TrafficDetail(1, 5)))); traffics.add(traffic1); traffics.add(traffic2); traffics.add(traffic3); traffics.add(traffic4); //设置 id AtomicInteger id = new AtomicInteger(1); traffics.forEach(traffic -> traffic.setId(id.getAndIncrement())); TemplateExportParams params = new TemplateExportParams( "template/销售数据列表.xls"); // params.setColForEach(true); Map value = new HashMap<>(); value.put("list",traffics); Workbook book = ExcelExportUtil.exportExcel(params, value); // (1)处理付款明细数据不显示; // (2)处理合并单元格边框实线 // (3)处理共享单车和地铁没有边框实线 myRest(book); FileOutputStream fos = new FileOutputStream("F:/workSpace/JiLongDa/manage/src/main/resources/template/销售数据列表.xls"); book.write(fos); fos.close(); } private void myRest(Workbook book) { Sheet firstSheet = book.getSheetAt(0); List mergedRegions = firstSheet.getMergedRegions(); List removeMergedRegionIndexList = new ArrayList<>(); // (1)处理付款明细数据不显示; for (int i = 0; i < mergedRegions.size(); i++) { CellRangeAddress mergedRegion = mergedRegions.get(i); int firstColumn = mergedRegion.getFirstColumn(); int lastColumn = mergedRegion.getLastColumn(); int firstRow = mergedRegion.getFirstRow(); if(firstRow >= 2 && firstColumn >= 3 && lastColumn <= 5){ removeMergedRegionIndexList.add(i); } } firstSheet.removeMergedRegions(removeMergedRegionIndexList); // (2)处理合并单元格边框实线 // for (CellRangeAddress mergedRegion : mergedRegions) { // RegionUtil.setBorderBottom(BorderStyle.THIN, mergedRegion, firstSheet); // RegionUtil.setBorderTop(BorderStyle.THIN, mergedRegion, firstSheet); // RegionUtil.setBorderLeft(BorderStyle.THIN, mergedRegion, firstSheet); // RegionUtil.setBorderRight(BorderStyle.THIN, mergedRegion, firstSheet); // } // (3)处理共享单车和地铁没有边框实线;略,自行处理 } @Data @AllArgsConstructor @NoArgsConstructor public static class Traffic{ public Traffic(String name, Date date, List shareBikes, List subways) { this.name = name; this.date = date; this.shareBikes = shareBikes; this.subways = subways; } private Integer id; private String name; private Date date; private List shareBikes; private List subways; } @Data @AllArgsConstructor @NoArgsConstructor public static class TrafficDetail{ private Integer number; private Integer cost; } }