Apache POI专注于生成的Excel文件中的特定单元格

您好我正在使用Apache poi来生成Excel文件。 我正在使用XSSFWorkbook格式。 我正在试图把重点放在生成的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); } 

我也看过这个问题 。 该解决scheme似乎不适合我。 任何人都可以帮我吗?

PS:我正在使用apache poi版本3.15。

更新1:

我也有一个冻结窗格左上angular的单元格为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); 。 这是确保该工作簿不是空的,并包含至less一张表。 上面的代码既不显示C1单元格(创build窗格的左上angular单元格)也不显示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()); } 

不幸的是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(); } }