md
This commit is contained in:
parent
38c0cc1a36
commit
b24463a726
@ -1,69 +0,0 @@
|
||||
package com.xdadan.erp.emis.service.billexport;
|
||||
|
||||
import com.alibaba.excel.metadata.Head;
|
||||
import com.alibaba.excel.write.handler.CellWriteHandler;
|
||||
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
|
||||
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
|
||||
import org.apache.poi.ss.usermodel.Cell;
|
||||
import org.apache.poi.ss.usermodel.Row;
|
||||
import org.apache.poi.ss.usermodel.Sheet;
|
||||
import org.apache.poi.ss.util.CellRangeAddress;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 列合并工具类
|
||||
*
|
||||
* @author DaiHaijiao
|
||||
*/
|
||||
public class ExcelFillCellMergePrevColUtils implements CellWriteHandler {
|
||||
private static final String KEY = "%s-%s";
|
||||
//所有的合并信息都存在了这个map里面
|
||||
Map<String, Integer> mergeInfo = new HashMap<>();
|
||||
|
||||
public ExcelFillCellMergePrevColUtils() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean aBoolean) {
|
||||
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {
|
||||
// //当前行
|
||||
// int curRowIndex = cell.getRowIndex();
|
||||
// //当前列
|
||||
// int curColIndex = cell.getColumnIndex();
|
||||
//
|
||||
// Integer num = mergeInfo.get(String.format(KEY, curRowIndex, curColIndex));
|
||||
// if (null != num) {
|
||||
// // 合并最后一行 ,列
|
||||
// this.mergeWithPrevCol(writeSheetHolder, cell, curRowIndex, curColIndex, num);
|
||||
// }
|
||||
// }
|
||||
|
||||
public void mergeWithPrevCol(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex, int num) {
|
||||
Sheet sheet = writeSheetHolder.getSheet();
|
||||
CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex, curRowIndex, curColIndex, curColIndex + num);
|
||||
sheet.addMergedRegion(cellRangeAddress);
|
||||
}
|
||||
|
||||
//num从第几列开始增加多少列,(6,2,7)代表的意思就是第6行的第2列至第2+7也就是9列开始合并
|
||||
public void add(int curRowIndex, int curColIndex, int num) {
|
||||
mergeInfo.put(String.format(KEY, curRowIndex, curColIndex), num);
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,110 +0,0 @@
|
||||
package com.xdadan.erp.emis.service.billexport;
|
||||
|
||||
|
||||
import com.alibaba.excel.metadata.Head;
|
||||
import com.alibaba.excel.metadata.data.CellData;
|
||||
import com.alibaba.excel.write.handler.CellWriteHandler;
|
||||
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
|
||||
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
|
||||
import org.apache.poi.ss.usermodel.Cell;
|
||||
import org.apache.poi.ss.usermodel.CellType;
|
||||
import org.apache.poi.ss.usermodel.Row;
|
||||
import org.apache.poi.ss.usermodel.Sheet;
|
||||
import org.apache.poi.ss.util.CellRangeAddress;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 行合并工具类
|
||||
*
|
||||
* @author DaiHaijiao
|
||||
*/
|
||||
public class ExcelFillCellMergeStrategyUtils implements CellWriteHandler {
|
||||
|
||||
/**
|
||||
* 合并字段的下标
|
||||
*/
|
||||
private int[] mergeColumnIndex;
|
||||
/**
|
||||
* 合并几行
|
||||
*/
|
||||
private int mergeRowIndex;
|
||||
|
||||
public ExcelFillCellMergeStrategyUtils(int mergeRowIndex, int[] mergeColumnIndex) {
|
||||
this.mergeRowIndex = mergeRowIndex;
|
||||
this.mergeColumnIndex = mergeColumnIndex;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,
|
||||
Head head, Integer integer, Integer integer1, Boolean aBoolean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell,
|
||||
Head head, Integer integer, Boolean aBoolean) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
//
|
||||
// @Override
|
||||
// public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
|
||||
// CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
|
||||
// List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {
|
||||
// //当前行
|
||||
// int curRowIndex = cell.getRowIndex();
|
||||
// //当前列
|
||||
// int curColIndex = cell.getColumnIndex();
|
||||
//
|
||||
// if (curRowIndex > mergeRowIndex) {
|
||||
// for (int i = 0; i < mergeColumnIndex.length; i++) {
|
||||
// if (curColIndex == mergeColumnIndex[i]) {
|
||||
// this.mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {
|
||||
//获取当前行的当前列的数据和上一行的当前列列数据,通过上一行数据是否相同进行合并
|
||||
//获取当前行的第一列
|
||||
Cell firstNowCell = cell.getSheet().getRow(curRowIndex).getCell(curColIndex);
|
||||
Object curData = firstNowCell.getCellTypeEnum() == CellType.STRING ? firstNowCell.getStringCellValue() : firstNowCell.getNumericCellValue();
|
||||
Row preRow = cell.getSheet().getRow(curRowIndex - 1);
|
||||
if (preRow == null) {
|
||||
// 当获取不到上一行数据时,使用缓存sheet中数据
|
||||
preRow = writeSheetHolder.getCachedSheet().getRow(curRowIndex - 1);
|
||||
}
|
||||
Cell preCell = preRow.getCell(curColIndex);
|
||||
Object preData = preCell.getCellTypeEnum() == CellType.STRING ? preCell.getStringCellValue() : preCell.getNumericCellValue();
|
||||
// 比较当前行的第一列的单元格与上一行是否相同,相同合并当前单元格与上一行
|
||||
if (curData.equals(preData)) {
|
||||
Sheet sheet = writeSheetHolder.getSheet();
|
||||
List<CellRangeAddress> mergeRegions = sheet.getMergedRegions();
|
||||
boolean isMerged = false;
|
||||
for (int i = 0; i < mergeRegions.size() && !isMerged; i++) {
|
||||
CellRangeAddress cellRangeAddr = mergeRegions.get(i);
|
||||
// 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元
|
||||
if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) {
|
||||
sheet.removeMergedRegion(i);
|
||||
cellRangeAddr.setLastRow(curRowIndex);
|
||||
sheet.addMergedRegion(cellRangeAddr);
|
||||
isMerged = true;
|
||||
}
|
||||
}
|
||||
// 若上一个单元格未被合并,则新增合并单元
|
||||
if (!isMerged) {
|
||||
CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, curColIndex);
|
||||
sheet.addMergedRegion(cellRangeAddress);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -24,51 +24,6 @@ import java.util.*;
|
||||
public class ExcelUtils {
|
||||
|
||||
|
||||
public static void exportTplFile(HttpServletResponse response, String excelPath, String fileName, Map<String, Object> outerMap, List<Map<String, Object>> innerMapList,
|
||||
ExcelFillCellMergePrevColUtils excelFillCellMergePrevColUtils, ExcelFillCellMergeStrategyUtils excelFillCellMergeStrategyUtils) throws IOException {
|
||||
|
||||
OutputStream fos=response.getOutputStream();
|
||||
InputStream fis = new ClassPathResource(excelPath).getInputStream();
|
||||
exportToTemplate(fos, fis, outerMap, innerMapList,
|
||||
excelFillCellMergePrevColUtils, excelFillCellMergeStrategyUtils);
|
||||
|
||||
}
|
||||
|
||||
public static void exportTplFileLocal(String outFile, String tplFile, Map<String, Object> outerMap, List<Map<String, Object>> innerMapList,
|
||||
ExcelFillCellMergePrevColUtils excelFillCellMergePrevColUtils, ExcelFillCellMergeStrategyUtils excelFillCellMergeStrategyUtils) throws IOException {
|
||||
|
||||
FileOutputStream fos=new FileOutputStream(outFile);
|
||||
InputStream fis = new FileInputStream(tplFile);
|
||||
|
||||
exportToTemplate(fos, fis,outerMap, innerMapList,
|
||||
excelFillCellMergePrevColUtils, excelFillCellMergeStrategyUtils);
|
||||
|
||||
}
|
||||
|
||||
public static void exportToTemplate(OutputStream fos, InputStream fis, Map<String, Object> outerMap, List<Map<String, Object>> innerMapList,
|
||||
ExcelFillCellMergePrevColUtils excelFillCellMergePrevColUtils, ExcelFillCellMergeStrategyUtils excelFillCellMergeStrategyUtils) throws IOException {
|
||||
// InputStream inputStream = new ClassPathResource(excelPath).getInputStream();
|
||||
// response.setContentType("application/vnd.ms-excel");
|
||||
// response.setCharacterEncoding("utf-8");
|
||||
// String fileOutFileName = URLEncoder.encode(fileName, "UTF-8");
|
||||
// response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
|
||||
ExcelWriter excelWriter = EasyExcel.write(fos)
|
||||
.withTemplate(fis)
|
||||
.registerWriteHandler(excelFillCellMergePrevColUtils)
|
||||
.registerWriteHandler(excelFillCellMergeStrategyUtils)
|
||||
.build();
|
||||
WriteSheet writeSheet = EasyExcel.writerSheet().build();
|
||||
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
|
||||
if (null != innerMapList && innerMapList.size() > 0) {
|
||||
FillWrapper listWrapper = new FillWrapper("list", innerMapList);
|
||||
excelWriter.fill(listWrapper, fillConfig, writeSheet);
|
||||
}
|
||||
if (null != outerMap && outerMap.size() > 0) {
|
||||
excelWriter.fill(outerMap, writeSheet);
|
||||
}
|
||||
excelWriter.finish();
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证并获取excel单元格内的值
|
||||
*
|
||||
|
||||
Loading…
Reference in New Issue
Block a user