2017-07-13 70 views
2

您好我正在使用apache poi生成excel文件。我正在使用XSSFWorkbook格式。我想着重於生成的excel文件的第一個單元格。Apache POI專注於生成的Excel文件中的特定單元格

我試過下面的代碼片段。

 try { 
       Sheet sheet = workbook.getSheetAt(0); 
       workbook.setActiveSheet(0); 
       Cell cell = sheet.getRow(0).getCell(0); 
       cell.setAsActiveCell(); 
       sheet.setActiveCell(cell.getAddress()); 
       sheet.showInPane(0, 0); 
      } catch (IllegalArgumentException e) { 
       LOGGER.error("Failed to set active sheet and cell.", e); 
      } 

我也看過這SO question以及。該解決方案似乎不適合我。任何人都可以在這裏幫我嗎?

P.S:我正在使用apache poi版本3.15。

更新1:

我也有左上角的單元格C1作爲凍結窗格。沒有正確顯示凍結。

我曾嘗試下面的代碼

public void setActiveCell(Workbook workbook, int sheetIndex, int row, int column) { 
     Sheet sheet = workbook.getSheetAt(sheetIndex); 
     CellAddress cellAddress = new CellAddress(row, column); 

     sheet.createFreezePane(2, 0); 
     ((XSSFSheet) sheet).getCTWorksheet().getSheetViews().getSheetViewArray(0).getPane() 
      .setTopLeftCell("C1"); 
     ((XSSFSheet) sheet).setActiveCell(cellAddress); 

//  ((XSSFSheet) sheet).getCTWorksheet().getSheetViews().getSheetViewArray(0) 
//   .setTopLeftCell(cellAddress.formatAsString()); 
//  ((XSSFSheet) sheet).setActiveCell(cellAddress); 
} 

我打電話上面的代碼爲setActiveCell(workbook, 0, 0, 0);。可以確保工作簿不爲空,並且至少包含一張工作表。上面的代碼既不顯示C1單元格(創建的窗格的左上角單元格)也不顯示A1單元格(活動單元格集合)。

更新2:

基於從@AlexRichter答案,下面的代碼工作對我來說:

public void setActiveCell(Workbook workbook, int sheetIndex, int row, int column) { 
     Sheet sheet = workbook.getSheetAt(sheetIndex); 
     CellAddress cellAddress = new CellAddress(row, column); 

     sheet.createFreezePane(2, 0); 
     ((XSSFSheet) sheet).getCTWorksheet().getSheetViews().getSheetViewArray(0).getPane() 
      .setTopLeftCell("C1"); 

     ((XSSFSheet) sheet).getCTWorksheet().getSheetViews().getSheetViewArray(0) 
      .setTopLeftCell(cellAddress.formatAsString()); 
} 
+0

我認爲,你可以使用相同的sheet.showInPane一個()的方法。試試這個方法,並在這裏檢查這個討論http://apache-poi.1045710.n5.nabble.com/RE-How-to-mandate-showing-the-active-cell-when-the-Excel-file-is -first-opened-td2281035.html – Bhavesh

+0

@yaswanth:'.getPane()。xsetTopLeftCell()。setTopLeftCell(「C1」)'不是我所建議的,也不會編譯。 –

+0

對不起,這是一個錯誤。我更新了代碼 – yaswanth

回答

2

不幸XSSFSheet.showInPane是馬車。

對我來說,以下工作:

import org.apache.poi.xssf.usermodel.*; 
import org.apache.poi.ss.usermodel.*; 
import org.apache.poi.ss.util.*; 

import java.io.FileOutputStream; 

class TopLeftCell { 

public static void main(String[] args) throws Exception{ 
    Workbook wb = new XSSFWorkbook(); 

    Sheet sheet = wb.createSheet("new sheet"); 

    ((XSSFSheet)sheet).getCTWorksheet().getSheetViews().getSheetViewArray(0).setTopLeftCell("D10"); 
    ((XSSFSheet)sheet).setActiveCell(new CellAddress("E11")); 

    wb.write(new FileOutputStream("TopLeftCell.xlsx")); 
    wb.close(); 
} 
} 

它使用基本的低電平對象setTopLeftCell

如果您有窗格,則必須爲您需要的窗格設置TopLeftCell。示例:

import org.apache.poi.xssf.usermodel.*; 
import org.apache.poi.ss.usermodel.*; 
import org.apache.poi.ss.util.*; 

import java.io.FileOutputStream; 

class TopLeftCell { 

public static void main(String[] args) throws Exception{ 
    Workbook wb = new XSSFWorkbook(); 

    Sheet sheet = wb.createSheet("new sheet"); 
/* 
    ((XSSFSheet)sheet).getCTWorksheet().getSheetViews().getSheetViewArray(0).setTopLeftCell("D10"); 
    ((XSSFSheet)sheet).setActiveCell(new CellAddress("E11")); 
*/ 

    sheet.createFreezePane(2, 2); //C3 is top left cell of the scrollable pane 
    ((XSSFSheet)sheet).getCTWorksheet().getSheetViews().getSheetViewArray(0).getPane().setTopLeftCell("C3"); 
    ((XSSFSheet)sheet).setActiveCell(new CellAddress("A1")); 

    wb.write(new FileOutputStream("TopLeftCell.xlsx")); 
    wb.close(); 
} 
} 

如果固定窗格不包含行,則似乎有例外。然後設置.getPane().setTopLeftCell中的行是沒有意義的。然後,必須在SheetView中直接在TopLeftCell中設置最上面一行。

例子:

import org.apache.poi.xssf.usermodel.*; 
import org.apache.poi.ss.usermodel.*; 
import org.apache.poi.ss.util.*; 

import java.io.FileOutputStream; 

class TopLeftCell { 

public static void main(String[] args) throws Exception{ 
    Workbook wb = new XSSFWorkbook(); 

    Sheet sheet = wb.createSheet("new sheet"); 

    sheet.createFreezePane(2, 0); //C1 is top left cell of the scrollable pane. 
    //But if the fixed pane contains no rows, as in this example, then setting the row in 
    //getPane().setTopLeftCell is meaningless. Then the top row must be set in the SheetView. 
    //Example: Row 6 shall be the top row: 
    ((XSSFSheet)sheet).getCTWorksheet().getSheetViews().getSheetViewArray(0).setTopLeftCell("A6"); 
    ((XSSFSheet)sheet).getCTWorksheet().getSheetViews().getSheetViewArray(0).getPane().setTopLeftCell("C1"); 
    ((XSSFSheet)sheet).setActiveCell(new CellAddress("C6")); 

    wb.write(new FileOutputStream("TopLeftCell.xlsx")); 
    wb.close(); 
} 
} 
+0

非常感謝您的解決方法。我有另一個問題。我有第二列和第二行的凍結窗格。雖然我可以看到活動單元格爲(0,0)(我打算),但凍結窗格將Excel表格移動到右側,顯示了第25列。含義我可以看到第一行和第一列。我可以看到Excel表格直到第二列。之後我看到了第25列。你能不能幫我讓凍結窗格顯示excel表格,而不移動? – yaswanth

+0

@yaswanth:這就是'XSSFSheet.showInPane'也是錯誤的地方。如果您有**窗格,則必須爲您需要的窗格設置TopLeftCell。但你不會總是有窗格。看我的補充。 –

+0

getPane()。setTopLeftCell(「C1」)(我的凍結窗格凍結,直到B列)似乎不起作用。儘管excel表打開在列C上,但它不顯示我打算的第一行。 – yaswanth

相關問題