Apache POI – 全部展开/全部折叠

我现在正在使用Apache POI从Java创build一个excel,在那里我需要在导出的excel中展开/折叠全部。 请在展开之前和之后find我想要的下面的图片,以及下面的代码到目前为止我试过。 (如果你在试图结束的话,可能需要jar)。 任何人都可以请这个帮忙。

在这里输入图像说明 在这里输入图像说明

码:

package com.skumar.excel; import java.io.FileOutputStream; import java.util.Set; import java.util.TreeSet; import org.apache.poi.xssf.usermodel.XSSFCellStyle; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Workbook; public class ExcelGroupData { public static void main(String[] args) { String excelFilename = null; ExcelGroupData myExcel = new ExcelGroupData(); /* if (args.length < 1) { System.err.println("Usage: java "+ myExcel.getClass().getName()+ " Excel_Filename"); System.exit(1); } excelFilename = args[0].trim();*/ excelFilename = "C:\\aaa\\excel.xls"; myExcel.generateExcel(excelFilename); } public void generateExcel(String excelFilename){ try { //New Workbook Workbook wb = new XSSFWorkbook(); Cell c = null; //Cell style for header row CellStyle cs = wb.createCellStyle(); cs.setFillForegroundColor(IndexedColors.LIME.getIndex()); cs.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND); Font f = wb.createFont(); f.setBoldweight(Font.BOLDWEIGHT_BOLD); f.setFontHeightInPoints((short) 12); cs.setFont(f); //Cell style for summary row CellStyle css = wb.createCellStyle(); f = wb.createFont(); f.setBoldweight(Font.BOLDWEIGHT_BOLD); f.setFontHeightInPoints((short) 10); css.setFont(f); //New Sheet XSSFSheet sheet1 = null; sheet1 = (XSSFSheet) wb.createSheet("myData"); // Row and column indexes int idx = 0; int idy = 0; //Generate column headings Row row = sheet1.createRow(idx); c = row.createCell(idy); c.setCellValue("Customer"); c.setCellStyle(cs); sheet1.setColumnWidth(idy, 10 * 500); idy++; c = row.createCell(idy); c.setCellValue("Order Number"); c.setCellStyle(cs); sheet1.setColumnWidth(idy, 10 * 500); idy++; c = row.createCell(idy); c.setCellValue("Order Total"); c.setCellStyle(cs); sheet1.setColumnWidth(idy, 10 * 500); idy++; //Next row and reset column idx = idx + 1; idy = 0; // reset column //Header of First Group int firstRow = idx + 1; row = sheet1.createRow(idx); c = row.createCell(idy); c.setCellValue("ABC"); idy++; c = row.createCell(idy); c.setCellValue("101"); idy++; c = row.createCell(idy); c.setCellValue(10.99); idy++; //1st row of 1st Group idx = idx + 1; idy = 0; // reset column row = sheet1.createRow(idx); c = row.createCell(idy); c.setCellValue("ABC1"); idy++; c = row.createCell(idy); c.setCellValue("102"); idy++; c = row.createCell(idy); c.setCellValue(22.23); idy++; //2nd row of 1st Group idx = idx + 1; idy = 0; // reset column row = sheet1.createRow(idx); c = row.createCell(idy); c.setCellValue("ABC2"); idy++; c = row.createCell(idy); c.setCellValue("105"); idy++; c = row.createCell(idy); c.setCellValue(25.23); idy++; //3rd row of 1st Group idx = idx + 1; idy = 0; // reset column int lastRow = idx + 1; row = sheet1.createRow(idx); c = row.createCell(idy); c.setCellValue("ABC3"); idy++; c = row.createCell(idy); c.setCellValue("103"); idy++; c = row.createCell(idy); c.setCellValue(100.33); idy++; // Second Group: Populate detail row data //Header of 2nd Group idx = idx + 1; idy = 0; // reset column row = sheet1.createRow(idx); c = row.createCell(idy); c.setCellValue("XYZ"); idy++; c = row.createCell(idy); c.setCellValue("103"); idy++; c = row.createCell(idy); c.setCellValue(100.33); idy++; //1st row of 2nd Group idx = idx + 1; idy = 0; row = sheet1.createRow(idx); c = row.createCell(idy); c.setCellValue("XYZ1"); idy++; c = row.createCell(idy); c.setCellValue("103"); idy++; c = row.createCell(idy); c.setCellValue(100.33); idy++; //2nd row of 2nd Group idx = idx + 1; idy = 0; // reset column row = sheet1.createRow(idx); c = row.createCell(idy); c.setCellValue("XYZ2"); idy++; c = row.createCell(idy); c.setCellValue("103"); idy++; c = row.createCell(idy); c.setCellValue(100.33); idy++; //3rd row of 2nd Group idx = idx + 1; idy = 0; // reset column int lastOfSecondGroup = idx+1; row = sheet1.createRow(idx); c = row.createCell(idy); c.setCellValue("XYZ3"); idy++; c = row.createCell(idy); c.setCellValue("103"); idy++; c = row.createCell(idy); c.setCellValue(100.33); idy++; System.out.println(firstRow + " " + lastRow); //Group the Rows together sheet1.groupRow(1, lastOfSecondGroup-1); sheet1.setRowGroupCollapsed(firstRow, true); sheet1.setRowSumsBelow(false); FileOutputStream fileOut = new FileOutputStream(excelFilename.trim()); wb.write(fileOut); fileOut.close(); } catch (Exception e) { System.out.println(e); } } private String getColumnName(int columnNumber) { String columnName = ""; int dividend = columnNumber + 1; int modulus; while (dividend > 0){ modulus = (dividend - 1) % 26; columnName = (char)(65 + modulus) + columnName; dividend = (int)((dividend - modulus) / 26); } return columnName; } } 

根据第一张图片,您无法通过创build单个组来获得此结果。 你需要两组 – 第2〜5行,第6〜9行

代码应该是 –

  sheet1.groupRow(1, 4); sheet1.setRowGroupCollapsed(1, true); sheet1.groupRow(5, 8); sheet1.setRowGroupCollapsed(5, true); 

我认为,而不是这些硬编码行不,将有一些分组逻辑。 根据逻辑,您可以指定分组的起始行和结束行