大致思路是将相同的列合并,但是我这个有一种特殊的需求要序号相同内容才能够合并, 话不多说 直接上代码。
1.利用poi自带的方法合并数据
sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, column, column));
部分源码展示:
private int addMergedRegion(CellRangeAddress region, boolean validate) {
if (region.getNumberOfCells() < 2) {
throw new IllegalArgumentException("Merged region " + region.formatAsString() + " must contain 2 or more cells");
} else {
region.validate(SpreadsheetVersion.EXCEL2007);
if (validate) {
this.validateArrayFormulas(region);
this.validateMergedRegions(region);
}
CTMergeCells ctMergeCells = this.worksheet.isSetMergeCells() ? this.worksheet.getMergeCells() : this.worksheet.addNewMergeCells();
CTMergeCell ctMergeCell = ctMergeCells.addNewMergeCell();
ctMergeCell.setRef(region.formatAsString());
int numMergeRegions = ctMergeCells.sizeOfMergeCellArray();
ctMergeCells.setCount((long)numMergeRegions);
return numMergeRegions - 1;
}
}
2.编写相关代码
/**
* 动态创建表格
* @param response 响应
* @param dataAggregations 数据源
* @param mergeColumns 需要合并的列
* @param mergeRowMap
* @param sheetName
* @param fileName
* @param masterHead
*/
public static void exportMergeRecord(HttpServletResponse response,
List<String[]> dataAggregations,
List<Integer> mergeColumns,
Map<String,Integer> mergeRowMap,
String sheetName,
String fileName,
String[] masterHead) {
//初始化表格
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet(sheetName);
//设置样式
XSSFCellStyle style = workbook.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER);//水平对齐
XSSFRow sheetRow = sheet.createRow(0);
for (int i = 0; i < masterHead.length ; i++) {
XSSFCell xssfCell = sheetRow.createCell(i);
xssfCell.setCellValue(masterHead[i]);
}
//需要合并的列
boolean isMerge = false;
if(mergeColumns != null && mergeColumns.size() != 0) {
isMerge = true;
}
//需要合并的列
int startIndex = sheet.getLastRowNum();
String currentStr = "";
if (CollectionUtils.isNotEmpty(dataAggregations)){
for (int j = 0; j < dataAggregations.size(); j++) {
String[] strings = dataAggregations.get(j);
// 每行往下写最后一行加1
XSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
int i = 0;
//写入数据
for (String str : strings) {
dataRow.createCell(i).setCellValue(ExcelUtils.process(str));
i++;
}
int mergeNum = 0;
if (mergeRowMap!=null && mergeRowMap.containsKey(currentStr)){
mergeNum = mergeRowMap.get(currentStr);
}
int firstRow = j+startIndex+1-mergeNum;
int lastRow = j+startIndex;
//合并数据
if (isMerge && !currentStr.equals(strings[0]) && mergeNum>1){
//开始行 结束行 开始列 结束列 int firstRow, int lastRow, int firstCol, int lastCol
for (Integer column : mergeColumns) {
sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, column, column));
}
}
//更改序号值
currentStr = strings[0];
//如果是最后一一行 同样需要判断是否合并
if (j==dataAggregations.size()-1){
if (mergeRowMap!=null && mergeRowMap.containsKey(currentStr)){
mergeNum = mergeRowMap.get(currentStr);
int lastRowNum = sheet.getLastRowNum();
firstRow =lastRowNum+1-mergeNum;
lastRow = lastRowNum;
if (mergeNum>1){
//开始行 结束行 开始列 结束列 int firstRow, int lastRow, int firstCol, int lastCol
for (Integer column : mergeColumns) {
sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, column, column));
}
}
}
}
}
}
//设置列宽 网上代码一大堆 自行百度
for (int i = 0; i < Arrays.asList(masterHead).size(); i++) {
sheet.setColumnWidth(i, 4550);
}
try {
ExcelUtils.excelExport(workbook,fileName,response);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
这是相关代码,结合实际自行修改!!!!