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

我也看过这个问题。该解决方案似乎对我不起作用。谁能在这里帮我?

PS:我正在使用 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());
}

不幸的是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中设置行是没有意义的。然后,必须直接在工作表视图中的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();
}
}

最新更新