java - 为什么不能使用 Apache POI 隐藏 Excel 行 'properly'?

标签 java excel apache-poi

为什么无法使用 Apache POI (3.16)“正确”隐藏 Excel 行?可以调用 (XSSFRow) row.setZeroHeight(),这也是 Busy developer's guide 的作用。推荐。但是,这与 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.

}

}

最佳答案

Busy developer's guide对于隐藏/取消隐藏行是正确的。但是有一个小错误,因为它必须是 row.setZeroHeight(true); 才能隐藏行。

Row.setZeroHeight(boolean)与隐藏行时 Excel 的操作完全相同。它适用于 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);

  //FileOutputStream out = new FileOutputStream("CreateExcelHiddenRow.xls");   
  FileOutputStream out = new FileOutputStream("CreateExcelHiddenRow.xlsx");   
  wb.write(out);
  out.close();
  wb.close();

 }
}

关于java - 为什么不能使用 Apache POI 隐藏 Excel 行 'properly'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46196042/

相关文章:

java - JVM 是如何决定 JIT 编译方法的(将方法归类为 "hot")?

java - 如何使用 POI 删除表格后的第一个字符

java - 如何使用 apache poi 4.1.0 创建带有 `WorkbookFactory` 的工作簿

java - 是否可以使用java和Apache POI库逐行写入excel文件

excel - 在 Excel 中显示一段时间的弹出窗口

java - URL 查询给出的结果与 postman 不同

java - 如何在 Java XPath 查询中使用 name() 和/或 node()?

java - 如何序列化和恢复函数列表?

python - 在 excel xlsxwriter python 中迭代多个 Dataframe 并写入 excel 电子表格

javascript - 有没有办法从 Excel Javascript API 保存 Excel 文档?