Java 为什么可以';Excel行为';适当地';使用ApachePOI隐藏?

Java 为什么可以';Excel行为';适当地';使用ApachePOI隐藏?,java,excel,apache-poi,Java,Excel,Apache Poi,为什么不能使用ApachePOI(3.16)“正确”隐藏Excel行?可以调用(XSSFRow)row.setZeroHeight(),这也是建议的。但是,这与Excel隐藏行的方式不同。可以使用相应的关联菜单选项“隐藏”和“取消隐藏”行 我认为设置行样式应该可行,但实际上不行。在生成的Excel文件中,仍然可以看到该行 package de.mwe; import java.io.File; import java.io.FileOutputStream; import java.io.I

为什么不能使用ApachePOI(3.16)“正确”隐藏Excel行?可以调用(XSSFRow)row.setZeroHeight(),这也是建议的。但是,这与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.

}

}您可以创建一个新的行样式。取而代之的是,获取行的现有样式并添加规则:

currentRow.getRowStyle().setHidden(true);
你可以参考


编辑:您甚至可以创建一个新的单元格样式,如@RC所述。

您可以创建一个新的行样式。取而代之的是,获取行的现有样式并添加规则:

currentRow.getRowStyle().setHidden(true);
你可以参考

编辑:您甚至可以创建一个新的单元格样式,如@RC所述。

用于隐藏/取消隐藏行是正确的。但是有一个小错误,因为它必须是
row.setZeroHeight(true)用于隐藏行

在隐藏行时,执行的正是
Excel
所执行的操作。它适用于
HSSF
以及
XSSF
。对于XSSF,它只是将隐藏属性设置为行XML,请参阅

例如:

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();

 }
}
import java.io.FileOutputStream;
导入org.apache.poi.ss.usermodel.*;
导入org.apache.poi.hssf.usermodel.HSSFWorkbook;
导入org.apache.poi.xssf.usermodel.xssf工作簿;
导入org.apache.poi.xssf.usermodel.XSSFRow;
公共类CreateExcelHiddenRow{
公共静态void main(字符串[]args)引发异常{
//工作簿wb=新的HSSF工作簿();
工作簿wb=新XSSFWorkbook();
Sheet Sheet=wb.createSheet();
对于(int r=0;r<3;r++){
Row Row=sheet.createRow(r);
Cell Cell=row.createCell(0);
cell.setCellValue(“行”+(r+1));
}
Row Row=sheet.getRow(1);
row.setZeroHeight(真);
//FileOutputStream out=新的FileOutputStream(“CreateExcelHiddenRow.xls”);
FileOutputStream out=新的FileOutputStream(“CreateExcelHiddenRow.xlsx”);
wb.写(出);
out.close();
wb.close();
}
}
正确地隐藏/取消隐藏行。但是有一个小错误,因为它必须是
row.setZeroHeight(true)用于隐藏行

在隐藏行时,执行的正是
Excel
所执行的操作。它适用于
HSSF
以及
XSSF
。对于XSSF,它只是将隐藏属性设置为行XML,请参阅

例如:

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();

 }
}
import java.io.FileOutputStream;
导入org.apache.poi.ss.usermodel.*;
导入org.apache.poi.hssf.usermodel.HSSFWorkbook;
导入org.apache.poi.xssf.usermodel.xssf工作簿;
导入org.apache.poi.xssf.usermodel.XSSFRow;
公共类CreateExcelHiddenRow{
公共静态void main(字符串[]args)引发异常{
//工作簿wb=新的HSSF工作簿();
工作簿wb=新XSSFWorkbook();
Sheet Sheet=wb.createSheet();
对于(int r=0;r<3;r++){
Row Row=sheet.createRow(r);
Cell Cell=row.createCell(0);
cell.setCellValue(“行”+(r+1));
}
Row Row=sheet.getRow(1);
row.setZeroHeight(真);
//FileOutputStream out=新的FileOutputStream(“CreateExcelHiddenRow.xls”);
FileOutputStream out=新的FileOutputStream(“CreateExcelHiddenRow.xlsx”);
wb.写(出);
out.close();
wb.close();
}
}

因为setHidden用于单元格而不是行?的可能副本是正确的,但它必须是
行。setZeroHeight(true)用于隐藏行。与Excel在隐藏行时所做的完全相同。对于
XSSF
它只是设置隐藏属性,请参阅,因为setHidden用于单元格而不是行?的可能副本是正确的,但它必须是
row.setZeroHeight(true)用于隐藏行。与Excel在隐藏行时所做的完全相同。对于
XSSF
它只是设置隐藏属性,请参见Nope,不起作用。删除cellStyle的创建并仅调用row.getRowStyle().setHidden(true)将返回NPE,因为该行最初没有样式。否,不起作用。删除cellStyle的创建并仅调用row.getRowStyle().setHidden(true)返回一个NPE,因为该行最初没有样式。您说得对,我再次检查了。您知道为什么使用cellStyle不起作用吗?
cellStyle
不起作用,因为隐藏行不是单元格样式,而是行的属性。对于
XSSF
而言,它在行的XML中是
。好吧,如果不是所有的CellStyle属性都适用于行,那么使用CellStyle类设置行的样式会有点误导。你说得对,我再次检查了。您知道为什么使用cellStyle不起作用吗?
cellStyle
不起作用,因为隐藏行不是单元格样式,而是行的属性。对于
XSSF
而言,它在行的XML中是
。好吧,如果不是CellStyle的所有属性都适用于行,那么使用CellStyle类设置行的样式会有点误导。