2017-07-13 69 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

相关问题