2017-09-13 123 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