使用poi3.15对Excel工作簿进行分割

news/2024/12/23 18:54:01/
  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 keyWord1 = "xxxx";String keyWord2 = "yyyy";String keyWordLastColumn = "页";String keyWordLastRow = "The Below is Blank";String keyWordLastRow2 = "以下空白";//设置变量int lastColumn = 0; //最后一列int newSheetNum = 0; //新增页数int lastRowNum = sheet.getLastRowNum(); // 最后一行List<int[]> deleteRow = new ArrayList<>();//开始巡查工作簿for (Row row : sheet){Cell cell = row.getCell(0);     //获取第0列单元格// 查找关键字if (PoiExcelUtils.getCellValue(cell).contains(keyWord1)){// 如果查找到关键字1int nextRowIndex = cell.getRowIndex() +1;Row nextRow = sheet.getRow(nextRowIndex);Cell nextRowCell = nextRow.getCell(0);if (PoiExcelUtils.getCellValue(nextRowCell).contains(keyWord2)){//如果查找到关键字2 则查找关键字3if (lastColumn == 0){   // 如果未获取到最后一列for (Cell tempCell : row){if (PoiExcelUtils.getCellValue(tempCell).contains(keyWordLastColumn)){// 如果查找到关键字3 则返回信息lastColumn = tempCell.getColumnIndex();}}}// 从key1上一行开始 保存这三两行 并增加计数器int[] indexArray = new int[]{cell.getRowIndex()-1,nextRowIndex};deleteRow.add(indexArray);newSheetNum++;}}// 如果检测到最后一行的标记 则跳出循环for (Cell cellT :row ){if (PoiExcelUtils.getCellValue(cellT).contains(keyWordLastRow)){lastRowNum = row.getRowNum() +1;break;}}}/*3 巡查工作簿1 并将其内容进行分割复制*/// 首先获取合并单元格信息Map<Integer,List<Integer[]>> 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<Integer[]> 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;Sheet newSheet = workbook.createSheet();//计算器FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();// 开始新建sheet页for (Row row : sheet){// 获取界限if (newSheetIndex > deleteRow.size() || row.getRowNum() >= lastRowNum){break;}int[] sheetIndex = newSheetIndex == deleteRow.size() ? null : deleteRow.get(newSheetIndex);//判断是否是新标签页的第一行if (sheetIndex != null &&  row.getRowNum() >= sheetIndex[0] && row.getRowNum() < sheetIndex[1]){continue;}if (sheetIndex != null &&  row.getRowNum() == sheetIndex[1]){newSheetIndex++;   //进入新工作簿newSheetRow = 0;    //重置行数if (newSheetIndex > deleteRow.size()){break;}newSheet = workbook.createSheet();    // 新建工作簿continue;}if (newSheetRow == 0){// 如果是第一行 设置列宽for (Cell cell : sheet.getRow(0)){int columWidth = sheet.getColumnWidth(cell.getColumnIndex());newSheet.setColumnWidth(cell.getColumnIndex(),columWidth);if (cell.getColumnIndex() == lastColumn) break;}}// 巡查并创建单元格// 创建新的一行Row targetRow = newSheet.createRow(newSheetRow);for (Cell cell : row){//判断是否结束复制if (cell.getRowIndex() == lastColumn) break;// 如果不结束 获取当前 并复制targetRow.setHeightInPoints(row.getHeightInPoints());Cell targetCell = targetRow.createCell(cell.getColumnIndex());}// 本行复制结束 新页面行数+1newSheetRow++;}// 新建结束// 清空计数器newSheetIndex = 0;newSheetRow = 0;newSheet = workbook.getSheetAt(deleteSheetIndexArr.length);//开始合并单元格for (Row row : sheet){// 获取界限if (newSheetIndex > deleteRow.size() || row.getRowNum() >= lastRowNum){break;}int[] sheetIndex = newSheetIndex == deleteRow.size() ? null : deleteRow.get(newSheetIndex);//判断是否是新标签页的第一行if (sheetIndex != null &&  row.getRowNum() >= sheetIndex[0] && row.getRowNum() < sheetIndex[1]){continue;}if (sheetIndex != null &&  row.getRowNum() == sheetIndex[1]){newSheetIndex++;   //进入新工作簿newSheetRow = 0;    //重置行数if (newSheetIndex > deleteRow.size()){break;}newSheet = workbook.getSheetAt(workbook.getSheetIndex(newSheet)+1); // 获取工作簿continue;}// 巡查并合并单元格 设置单元格格式if (mergedDic.containsKey(row.getRowNum())){// 如果本行具备合并单元格List<Integer[]> 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){Cell targetCell = targetRow.getCell(cell.getColumnIndex());if (targetCell != null){CellStyle sourceCellStyle = cell.getCellStyle();CellStyle targetCellStyle = newSheet.getWorkbook().createCellStyle();targetCellStyle.cloneStyleFrom(sourceCellStyle);targetCell.setCellStyle(targetCellStyle);}}// 本行修改结束 新页面行数+1newSheetRow++;}// 清空计数器newSheetIndex = 0;newSheetRow = 0;newSheet = workbook.getSheetAt(deleteSheetIndexArr.length);//开始巡查for (Row row : sheet){// 开始巡查工作簿// 获取界限if (newSheetIndex > deleteRow.size() || row.getRowNum() >= lastRowNum){break;}int[] sheetIndex = newSheetIndex == deleteRow.size() ? null : deleteRow.get(newSheetIndex);//判断是否是新标签页的第一行//判断是否结束复制if (sheetIndex != null &&  row.getRowNum() >= sheetIndex[0] && row.getRowNum() < sheetIndex[1]){continue;}if (sheetIndex != null &&  row.getRowNum() == sheetIndex[1]){newSheetIndex++;   //进入新工作簿newSheetRow = 0;    //重置行数if (newSheetIndex > deleteRow.size()){break;}newSheet = workbook.getSheetAt(workbook.getSheetIndex(newSheet)+1); // 获取工作簿continue;}// 巡查并复制单元格// 创建新的一行Row targetRow = newSheet.getRow(newSheetRow);for (Cell cell : row){//判断是否结束复制if (cell.getRowIndex() == 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());}}// 本行复制结束 新页面行数+1newSheetRow++;}/*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) 就是普通的根据类型获取单元格内容的方法,就不写了,第一步和第四步不需要的话就删掉


http://www.ppmy.cn/news/598409.html

相关文章

Android——基本控件(下)(十五)

1. 对话框&#xff1a;Dialog 1.1 知识点 &#xff08;1&#xff09;掌握对话框的主要作用&#xff1b; &#xff08;2&#xff09;可以使用AlertDialog和AlertDialog.Builder进行对话框的建立&#xff1b; &#xff08;3&#xff09;可以通过LayoutInflater进行定制对话框…

netwox 基于 Ethernet 层构造 IP 数据包【网络工程】(保姆级图文)

目录 基于 Ethernet 层构造 IP 数据包1) 不指定选项&#xff0c;直接运行该模块&#xff0c;查看默认设置。执行命令如下&#xff1a;3) 验证构造的数据包&#xff0c;使用 Wireshark 工具捕获数据包&#xff0c;如图所示。其中&#xff0c;第 2 个数据包为构造的 IPv4 数据包。…

联想Lenovo Quick Fix:关闭或开启Win10系统的自动更新

禁止win10更新小工具.zip - 蓝奏云 下载链接&#xff1a;关闭Win10自动更新.exe - 蓝奏云

联想X86服务器重启管理控制器(XClarity Controller)或TSM的方法

当设备运行较长时间时&#xff0c;服务器的管理控制器&#xff08;或称服务处理器&#xff0c;Service Processor&#xff09;可能由于内存或空间等问题响应缓慢&#xff0c;如果机器上运行ESXi&#xff0c;有可能会在Vcenter报出部件的“state deassert”信息&#xff0c;如下…

联想电脑 linux BIOS,Lenovo笔记本BIOS中各个选项的中文含义是什么

操作步骤: Lenovo笔记本电脑进入BIOS方式: 方式一:按下电源开关按钮开机后,连续不断敲击键盘上的F2按键(频率:每秒1-2次); 方式二:按下电源开关按钮开机后,一边按下键盘左下角的Fn功能键,一边连续不断敲击键盘上的F2按键(频率:每秒1-2次); 方式三: 1、目前联想新销售…

按丶自动打开计算机,联想电脑台式机启动自动进入Lenovo diagnostics界面

用户找到电脑不能进入桌面,启动电脑总是显示这个界面,打开机箱盖子,发现硬件配置,还是独立显卡都很正常。灰尘也不多 ,配置也挺好。 总是进入这个界面,最后发现原来键盘的F10按键被按下去了, 这个台式机键盘比较生硬,容易卡主,灵敏度还行,一点键盘按键卡主,就系统总…

联想lenovo电脑如何开机进入Bios与Boot menu

一、启动快捷启动菜单模式 在开机后电脑屏幕显示了”LENOVO“字样图画的时候&#xff0c;疯狂按F12&#xff0c;如果不行就重启再试一次&#xff0c;如果还不行&#xff0c;就再重启一次&#xff0c;按FnF12。界面如下图所示&#xff1a; 二、开机启动进入bios 在开机后电脑屏…

thinkpad硬件测试软件,Lenovo Diagnostics Windows(联想硬件诊断工具)

LenovoDiagnosticsWindows是一款联想官方打造的电脑硬件检测诊断软件&#xff0c;帮助用户检测电脑硬件问题&#xff0c;并进行修复&#xff0c;有需要的用户可以下载使用。 相关软件软件大小版本说明下载地址 Lenovo Diagnostics Windows是一款联想官方打造的电脑硬件检测诊断…