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