为什么不能使用Apache POI“正确”隐藏Excel行?

为什么不可能使用Apache POI(3.16)“正确”隐藏Excel行? 可以调用(XSSFRow)row.setZeroHeight(),这也是繁忙的开发人员指南build议。 但是,这不像Excel那样隐藏行。 您可以使用相应的上下文菜单选项“隐藏”和“取消隐藏”行。

我认为设置行风格应该工作,但它不。 在生成的Excel文件中,行仍然可以看到。

package de.mwe; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFCellStyle; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.testng.Assert; import org.testng.annotations.Test; public class MWE { @Test public void testHidingRows() { final XSSFWorkbook wb = new XSSFWorkbook(); String sname = "HideRowsTestSheet", cname = "TestName", cvalue = "TestVal"; XSSFSheet sheet = wb.createSheet( sname ); XSSFRow row = sheet.createRow( 0 ); XSSFCell cell = row.createCell( (short) 0 ); cell.setCellValue( cvalue ); XSSFCellStyle hiddenRowStyle = wb.createCellStyle(); hiddenRowStyle.setHidden( true ); row.setRowStyle( hiddenRowStyle ); Assert.assertTrue( row.getRowStyle().getHidden() ); try (FileOutputStream fileOut = new FileOutputStream( new File( "target/PoiTestDrive.xlsx" ) )) { wb.write( fileOut ); } catch ( IOException ex ) { ex.printStackTrace(); } // does not work, resulting Excel file shows first row. } 

}

繁忙的开发者指南是正确的隐藏/取消隐藏行。 但有一点小错误,因为它必须是row.setZeroHeight(true); 为了隐藏一排。

Row.setZeroHeight(boolean)完成Excel在隐藏某行时的function。 它适用于HSSF以及XSSF 。 对于XSSF,只需将隐藏属性设置为XML行,请参阅XSSFRow.java 。

例:

 import java.io.FileOutputStream; import org.apache.poi.ss.usermodel.*; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFRow; public class CreateExcelHiddenRow { public static void main(String[] args) throws Exception { //Workbook wb = new HSSFWorkbook(); Workbook wb = new XSSFWorkbook(); Sheet sheet = wb.createSheet(); for (int r = 0; r < 3; r++) { Row row = sheet.createRow(r); Cell cell = row.createCell(0); cell.setCellValue("Row " + (r+1)); } Row row = sheet.getRow(1); row.setZeroHeight(true); //wb.write(new FileOutputStream("CreateExcelHiddenRow.xls")); wb.write(new FileOutputStream("CreateExcelHiddenRow.xlsx")); wb.close(); } } 

您创build一个新的行样式。 相反,获取行的现有样式并添加您的规则:

 currentRow.getRowStyle().setHidden(true); 

你有点可以参考这篇文章

编辑:你甚至创build一个新的细胞风格作为@RC提到。