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 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单元格内的值
|
* 验证并获取excel单元格内的值
|
||||||
*
|
*
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user