2017-09-13 90 views
0

为什么不能'使用Apache POI(3.16)'正确'隐藏Excel行?可以调用(XSSFRow)row.setZeroHeight(),这也是Busy developer's guide推荐的内容。但是,这与Excel做它的方式不同。您可以使用相应的上下文菜单选项“隐藏”和“取消隐藏”行。为什么不能使用Apache POI'正确'隐藏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. 

} 

}

+0

因为setHidden为细胞而不是行? – 2017-09-13 11:16:44

+0

[如何在Java中使用Apache Poi取消隐藏隐藏行](https://stackoverflow.com/questions/6923153/how-to-un-hide-a-hidden-row-in -excel-using-apache-poi-in-java) – Nikolas

+1

[Hiding and Un-Hiding Rows](http://poi.apache.org/spreadsheet/quick-guide.html#Hiding)是正确的,但必须是'row.setZeroHeight(true);'用于隐藏一行。 [Row.setZeroHeigh](https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Row.html#setZeroHeight(布尔值))确实是Excel在隐藏行时所做的。对于'XSSF'只需设置隐藏属性,请参阅https://svn.apache.org/viewvc/poi/tags/REL_3_16_FINAL/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRow.java?view =标记#l423 –

回答

1

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

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

} 
} 
+0

你是对的,我再次检查。你知道为什么使用cellStyle不起作用吗? – ScarOnTheSky

+0

'CellStyle'不能工作,因为隐藏行不是单元格样式,而是行的属性。对于'XSSF',在行的XML中是'。 –

+0

好的,如果不是CellStyle的所有属性都适用于行,那么使用CellStyle类进行样式化行有些误导。 – ScarOnTheSky

0

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

currentRow.getRowStyle().setHidden(true); 

你还挺可以参考this post

编辑:您甚至创造一个新的细胞风格为@RC提及。

+0

不,不起作用。删除cellStyle的创建并调用row.getRowStyle()。setHidden(true)将返回一个NPE,因为该行最初没有样式。 – ScarOnTheSky

相关问题