MergeCellRangeWriteHandler.java
· 1.1 KiB · Java
Originalformat
import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import java.util.ArrayList;
import java.util.List;
/**
* 根据单元格区域合并单元格
**/
public class MergeCellRangeWriteHandler implements SheetWriteHandler {
private final List<CellRangeAddress> rangeCellList;
public MergeCellRangeWriteHandler(List<CellRangeAddress> rangeCellList) {
this.rangeCellList = (rangeCellList == null) ? new ArrayList<>() : rangeCellList;
}
@Override
public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
}
@Override
public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
Sheet sheet = writeSheetHolder.getSheet();
for (CellRangeAddress cellRangeAddress : rangeCellList) {
sheet.addMergedRegionUnsafe(cellRangeAddress);
}
}
}
| 1 | import com.alibaba.excel.write.handler.SheetWriteHandler; |
| 2 | import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; |
| 3 | import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; |
| 4 | import org.apache.poi.ss.usermodel.Sheet; |
| 5 | import org.apache.poi.ss.util.CellRangeAddress; |
| 6 | |
| 7 | import java.util.ArrayList; |
| 8 | import java.util.List; |
| 9 | |
| 10 | /** |
| 11 | * 根据单元格区域合并单元格 |
| 12 | **/ |
| 13 | public class MergeCellRangeWriteHandler implements SheetWriteHandler { |
| 14 | |
| 15 | private final List<CellRangeAddress> rangeCellList; |
| 16 | |
| 17 | public MergeCellRangeWriteHandler(List<CellRangeAddress> rangeCellList) { |
| 18 | this.rangeCellList = (rangeCellList == null) ? new ArrayList<>() : rangeCellList; |
| 19 | } |
| 20 | |
| 21 | @Override |
| 22 | public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { |
| 23 | } |
| 24 | |
| 25 | @Override |
| 26 | public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { |
| 27 | Sheet sheet = writeSheetHolder.getSheet(); |
| 28 | for (CellRangeAddress cellRangeAddress : rangeCellList) { |
| 29 | sheet.addMergedRegionUnsafe(cellRangeAddress); |
| 30 | } |
| 31 | } |
| 32 | } |
| 33 |
PersonController.java
· 2.9 KiB · Java
Originalformat
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.core.io.ClassPathResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.*;
import java.util.stream.Collectors;
@RestController
@RequestMapping("person")
public class DemoController {
@GetMapping("export")
public ResponseEntity<Object> export() throws Exception {
List<Person> list = personService.queryList();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
InputStream templateInputStream = new ClassPathResource("templates/PersonListTemplate.xlsx").getInputStream();
List<CellRangeAddress> cellRangeAddressList = buildMergeCellRangeList(list, 1, 4);
MergeCellRangeWriteHandler mergeStrategy = new MergeCellRangeWriteHandler(cellRangeAddressList);
ExcelWriter writer = EasyExcelFactory.write(outputStream).withTemplate(templateInputStream).build();
WriteSheet sheet = EasyExcelFactory.writerSheet().registerWriteHandler(mergeStrategy).sheetName("公司员工表").build();
Map<String, String> headerMap = new HashMap<>();
headerMap.put("companyName", "xxx 公司");
writer.fill(headerMap, sheet);
FillConfig fillConfig = FillConfig.builder()
.forceNewRow(true)
.build();
writer.fill(list, fillConfig, sheet);
writer.finish();
String encFileName = URLEncoder.encode("公司员工表", "UTF-8");
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + encFileName + ".xlsx");
headers.setContentType(MediaType.parseMediaType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"));
return new ResponseEntity<>(outputStream.toByteArray(), headers, HttpStatus.OK);
}
private List<CellRangeAddress> buildMergeCellRangeList(
List<Person> statsList,
int columnIndex,
int startRowIndex
) {
List<CellRangeAddress> rangeCellList = new ArrayList<>();
LinkedHashMap<String, Long> groupMap = statsList.stream()
.collect(Collectors.groupingBy(Person::getDepartmentName, LinkedHashMap::new, Collectors.counting()));
for (Map.Entry<String, Long> entry : groupMap.entrySet()) {
int count = entry.getValue().intValue();
if (count > 1) {
int endRowIndex = startRowIndex + count - 1;
rangeCellList.add(new CellRangeAddress(startRowIndex, endRowIndex, columnIndex, columnIndex));
}
startRowIndex += count;
}
return rangeCellList;
}
}
| 1 | import com.alibaba.excel.EasyExcelFactory; |
| 2 | import com.alibaba.excel.ExcelWriter; |
| 3 | import com.alibaba.excel.write.metadata.WriteSheet; |
| 4 | import com.alibaba.excel.write.metadata.fill.FillConfig; |
| 5 | import org.apache.poi.ss.util.CellRangeAddress; |
| 6 | |
| 7 | import org.springframework.core.io.ClassPathResource; |
| 8 | import org.springframework.http.HttpHeaders; |
| 9 | import org.springframework.http.HttpStatus; |
| 10 | import org.springframework.http.MediaType; |
| 11 | import org.springframework.http.ResponseEntity; |
| 12 | import org.springframework.web.bind.annotation.RequestMapping; |
| 13 | import org.springframework.web.bind.annotation.RestController; |
| 14 | |
| 15 | |
| 16 | import java.io.ByteArrayOutputStream; |
| 17 | import java.io.InputStream; |
| 18 | import java.net.URLEncoder; |
| 19 | import java.util.*; |
| 20 | import java.util.stream.Collectors; |
| 21 | |
| 22 | @RestController |
| 23 | @RequestMapping("person") |
| 24 | public class DemoController { |
| 25 | |
| 26 | @GetMapping("export") |
| 27 | public ResponseEntity<Object> export() throws Exception { |
| 28 | List<Person> list = personService.queryList(); |
| 29 | ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); |
| 30 | InputStream templateInputStream = new ClassPathResource("templates/PersonListTemplate.xlsx").getInputStream(); |
| 31 | |
| 32 | List<CellRangeAddress> cellRangeAddressList = buildMergeCellRangeList(list, 1, 4); |
| 33 | MergeCellRangeWriteHandler mergeStrategy = new MergeCellRangeWriteHandler(cellRangeAddressList); |
| 34 | |
| 35 | ExcelWriter writer = EasyExcelFactory.write(outputStream).withTemplate(templateInputStream).build(); |
| 36 | WriteSheet sheet = EasyExcelFactory.writerSheet().registerWriteHandler(mergeStrategy).sheetName("公司员工表").build(); |
| 37 | Map<String, String> headerMap = new HashMap<>(); |
| 38 | headerMap.put("companyName", "xxx 公司"); |
| 39 | writer.fill(headerMap, sheet); |
| 40 | |
| 41 | FillConfig fillConfig = FillConfig.builder() |
| 42 | .forceNewRow(true) |
| 43 | .build(); |
| 44 | writer.fill(list, fillConfig, sheet); |
| 45 | writer.finish(); |
| 46 | |
| 47 | String encFileName = URLEncoder.encode("公司员工表", "UTF-8"); |
| 48 | HttpHeaders headers = new HttpHeaders(); |
| 49 | headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + encFileName + ".xlsx"); |
| 50 | headers.setContentType(MediaType.parseMediaType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")); |
| 51 | |
| 52 | return new ResponseEntity<>(outputStream.toByteArray(), headers, HttpStatus.OK); |
| 53 | } |
| 54 | |
| 55 | private List<CellRangeAddress> buildMergeCellRangeList( |
| 56 | List<Person> statsList, |
| 57 | int columnIndex, |
| 58 | int startRowIndex |
| 59 | ) { |
| 60 | List<CellRangeAddress> rangeCellList = new ArrayList<>(); |
| 61 | LinkedHashMap<String, Long> groupMap = statsList.stream() |
| 62 | .collect(Collectors.groupingBy(Person::getDepartmentName, LinkedHashMap::new, Collectors.counting())); |
| 63 | for (Map.Entry<String, Long> entry : groupMap.entrySet()) { |
| 64 | int count = entry.getValue().intValue(); |
| 65 | if (count > 1) { |
| 66 | int endRowIndex = startRowIndex + count - 1; |
| 67 | rangeCellList.add(new CellRangeAddress(startRowIndex, endRowIndex, columnIndex, columnIndex)); |
| 68 | } |
| 69 | startRowIndex += count; |
| 70 | } |
| 71 | return rangeCellList; |
| 72 | } |
| 73 | } |
| 74 |