和之前的类似 但是换成通过分页符切割了
public void setSheetForPrint(Workbook workbook)throws Exception{
/**
* 处理顺序:
* 1 确定现有页数,并保存 以待用于删除
* 2 巡查工作簿1 获取终结列数、分割次数 终结行数
* 3 巡查工作簿1 并将其内容进行分割复制
* 4 用第1步保存的页序号进行删除
*/
/*1 确定现有页数,并保存 以待用于删除*/
Integer[] deleteSheetIndexArr = new Integer[workbook.getNumberOfSheets()];
// 保存页数
int deleteSheetIndexArrIndex = 0;
for (Sheet sheet : workbook){
int sheetIndex = workbook.getSheetIndex(sheet);
deleteSheetIndexArr[deleteSheetIndexArrIndex] = sheetIndex;
deleteSheetIndexArrIndex++;
}
/*2 巡查工作簿1 获取终结列数和分割次数*/
// 获取工作簿
Sheet sheet = workbook.getSheetAt(0);
//设置关键字 变量 并巡查工作簿
String keyWordLastRow = "The Below is Blank";
String keyWordLastRow2 = "以下空白";
int[] rowBreaks = sheet.getRowBreaks(); //获取分页符 依照分页符进行分页
//设置变量
int lastColumn = 33; //最后一列
int newSheetNum = rowBreaks.length; //新增页数
int lastRowNum = sheet.getLastRowNum(); // 最后一行
//开始巡查工作簿
for (Row row : sheet){
// 查找关键字
// 如果检测到最后一行的标记 则跳出循环
for (Cell cellT :row ){
if (PoiExcelUtils.getCellValue(cellT).contains(keyWordLastRow)){
lastRowNum = row.getRowNum() +1;
break;
}
}
}
/*3 巡查工作簿1 并将其内容进行分割复制*/
// 首先获取合并单元格信息
Map> mergedDic = new HashMap<>(); // 单元格合并字典
for (int i = 0; i < sheet.getNumMergedRegions(); i++) {
CellRangeAddress mergedRegion = sheet.getMergedRegion(i);
Integer firstRow = mergedRegion.getFirstRow();
Integer lastRow = mergedRegion.getLastRow();
Integer firstColumn = mergedRegion.getFirstColumn();
Integer LastColumnT = mergedRegion.getLastColumn();
//获取并设置字典
List tempList = mergedDic.containsKey(firstRow) ? mergedDic.get(firstRow) : new ArrayList<>();
Integer[] mergedArr = new Integer[4];
mergedArr[0] = firstRow;
mergedArr[1] = lastRow;
mergedArr[2] = firstColumn;
mergedArr[3] = LastColumnT;
tempList.add(mergedArr);
mergedDic.put(firstRow,tempList);
}
int newSheetIndex = 0; //新sheet索引
int newSheetRow = 0;
int newPageRow = 0; // 分页信息
Sheet newSheet = workbook.createSheet();
//计算器
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
// 开始新建sheet页
for (Row row : sheet){
// 获取界限
if (row.getRowNum() > lastRowNum){
break;
}
// 获取分页信息
if (newPageRow == 0 && newSheetIndex < newSheetNum){
newPageRow = rowBreaks[newSheetIndex] +1 ;
}
//判断是否是新标签页的第一行
if (row.getRowNum() == newPageRow){
newSheetIndex++; //进入新工作簿
newSheetRow = 0; //重置行数
if (newSheetIndex < newSheetNum){
newPageRow = rowBreaks[newSheetIndex] +1 ;// 重置分页信息
}
newSheet = workbook.createSheet(); // 新建工作簿
}
if (newSheetRow == 0){
// 如果是第一行 设置列宽
for (int i = 0; i < lastColumn + 1; i++) {
newSheet.setColumnWidth(i,sheet.getColumnWidth(i));
}
}
// 巡查并创建单元格
// 创建新的一行
Row targetRow = newSheet.createRow(newSheetRow);
for (Cell cell : row){
//判断是否结束复制
if (cell.getColumnIndex() == lastColumn) break;
// 如果不结束 获取当前 并复制
targetRow.setHeightInPoints(row.getHeightInPoints());
Cell targetCell = targetRow.createCell(cell.getColumnIndex());
}
// 本行复制结束 新页面行数+1
newSheetRow++;
}
// 新建结束
// 清空计数器
newSheetIndex = 0;
newSheetRow = 0;
newPageRow = 0; // 分页信息
newSheet = workbook.getSheetAt(deleteSheetIndexArr.length);
//开始合并单元格
for (Row row : sheet){
// 获取界限
if (row.getRowNum() > lastRowNum){
break;
}
// 获取分页信息
if (newPageRow == 0 && newSheetIndex < newSheetNum){
newPageRow = rowBreaks[newSheetIndex] +1 ;
}
//判断是否是新标签页的第一行
if (row.getRowNum() == newPageRow){
newSheetIndex++; //进入新工作簿
newSheetRow = 0; //重置行数
if (newSheetIndex < newSheetNum){
newPageRow = rowBreaks[newSheetIndex] +1 ;// 重置分页信息
}
newSheet = workbook.getSheetAt(workbook.getSheetIndex(newSheet)+1); // 新建工作簿
}
// 巡查并合并单元格 设置单元格格式
if (mergedDic.containsKey(row.getRowNum())){
// 如果本行具备合并单元格
List mergedList = mergedDic.get(row.getRowNum());
for (Integer[] tempArr : mergedList){
int firstRow = tempArr[0] - (row.getRowNum() - newSheetRow);
int lastRow = tempArr[1]- (row.getRowNum() - newSheetRow);
int firstColumn = tempArr[2];
int LastColumnT = tempArr[3];
CellRangeAddress targetMergedRegion = new CellRangeAddress(
firstRow, lastRow,
firstColumn, LastColumnT
);
newSheet.addMergedRegion(targetMergedRegion);
}
}
//遍历并设置单元格格式
Row targetRow = newSheet.getRow(newSheetRow);
for(Cell cell :row){
if (cell.getColumnIndex() == lastColumn) break;
int columnIndex = cell.getColumnIndex();
try{
Cell targetCell = targetRow.getCell(cell.getColumnIndex());
if (targetCell != null){
CellStyle sourceCellStyle = cell.getCellStyle();
CellStyle targetCellStyle = newSheet.getWorkbook().createCellStyle();
targetCellStyle.cloneStyleFrom(sourceCellStyle);
targetCell.setCellStyle(targetCellStyle);
}
}catch (NullPointerException nullPointerException){
nullPointerException.printStackTrace();
}
}
// 本行修改结束 新页面行数+1
newSheetRow++;
}
// 清空计数器
newSheetIndex = 0;
newSheetRow = 0;
newPageRow = 0; // 分页信息
newSheet = workbook.getSheetAt(deleteSheetIndexArr.length);
//开始巡查
for (Row row : sheet){
// 开始巡查工作簿
// 获取界限
if (row.getRowNum() > lastRowNum){
break;
}
// 获取分页信息
if (newPageRow == 0 && newSheetIndex < newSheetNum){
newPageRow = rowBreaks[newSheetIndex] +1 ;
}
//判断是否是新标签页的第一行
if (row.getRowNum() == newPageRow){
newSheetIndex++; //进入新工作簿
newSheetRow = 0; //重置行数
if (newSheetIndex < newSheetNum){
newPageRow = rowBreaks[newSheetIndex] +1 ;// 重置分页信息
}
newSheet = workbook.getSheetAt(workbook.getSheetIndex(newSheet)+1); // 新建工作簿
}
// 巡查并复制单元格
// 创建新的一行
Row targetRow = newSheet.getRow(newSheetRow);
for (Cell cell : row){
//判断是否结束复制
if (cell.getColumnIndex() == lastColumn) break;
// 如果不结束 获取当前 并复制
Cell targetCell = targetRow.getCell(cell.getColumnIndex());
String cellValueSt = getCellValue(cell,evaluator);
if (!"".equals(cellValueSt)){
targetCell.setCellValue(getCellValue(cell,evaluator));
targetCell.setCellStyle(cell.getCellStyle());
}
}
// 本行复制结束 新页面行数+1
newSheetRow++;
}
/*4 用第1步保存的页序号进行删除*/
Arrays.sort(deleteSheetIndexArr,Comparator.reverseOrder());
for (int deleteSheetIndex : deleteSheetIndexArr){
workbook.removeSheetAt(deleteSheetIndex);
}
}
/**
* 获取单元格内容
* @param cell
* @return
* @throws Exception
*/
private String getCellValue (Cell cell,FormulaEvaluator evaluator)throws Exception{
String cellValue = "";
if (cell == null){
return cellValue;
}
// 获取单元格类型
CellType cellType = cell.getCellTypeEnum();
CellType formula = CellType.FORMULA;
if (cellType.equals(formula)){
// 检查单元格结果类型
CellValue cellValue1 = evaluator.evaluate(cell);
if (cellValue1.getCellTypeEnum() == CellType.NUMERIC) {
cellValue = String.valueOf(cellValue1.getNumberValue());
// 处理数值结果
} else if (cellValue1.getCellTypeEnum() == CellType.STRING) {
cellValue = cellValue1.getStringValue();
// 处理字符串结果
}
}else{
cellValue = PoiExcelUtils.getCellValue(cell);
}
return cellValue;
}
PoiExcelUtils.getCellValue(cell) 为根据类型获取单元格信息,站里搜一下就有