Java ApachePOI关注生成的excel文件中的特定单元格

Java ApachePOI关注生成的excel文件中的特定单元格,java,excel,apache-poi,Java,Excel,Apache Poi,嗨,我正在使用ApachePOI生成excel文件。我使用的是XSSF工作簿格式。我试图将焦点放在生成的excel文件的第一个单元格上 我尝试了以下代码片段 try { Sheet sheet = workbook.getSheetAt(0); workbook.setActiveSheet(0); Cell cell = sheet.getRow(0).getCell(0);

嗨,我正在使用ApachePOI生成excel文件。我使用的是XSSF工作簿格式。我试图将焦点放在生成的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);
            }
我也看过这个。这个解决方案似乎对我不起作用。有人能帮我吗

附言:我正在使用ApachePOI版本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(工作簿,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());
}
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();
 }
}

不幸的是,
XSSFSheet.showInPane
有bug

以下是我的作品:

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

我认为有一种方法可以用于相同的工作表。showInPane()。请尝试此方法,并在这里@yaswanth:
.getPane().xsetTopLeftCell().setTopLeftCell(“C1”)
不是我建议的,也不会编译。很抱歉,这是一个错误。我已经更新了code@yaswanth:好的,但现在我无法重现你的行为。使用您的代码片段对我来说就像使用默认的
XSSFSheet
一样有效。列
A:B
是固定的,可滚动窗格以列
C
开始,活动单元格在固定窗格中是
A1
。非常感谢您的解决方法。我还有一个问题。我在第二列和第二行有一个冻结窗格。虽然我可以看到活动单元格为(0,0)(我打算这样做),但冻结窗格将excel工作表向右移动,显示第25列。这意味着我可以看到第一行和第一列。我可以看到excel表格,直到第二列。然后我看到第25栏。你能帮我让冻结窗格在不移动的情况下按原样显示excel工作表吗?@yaswanth:这正是
XSSFSheet的位置。showInPane
也有缺陷。如果有窗格,则必须为所需窗格设置TopLeftCell。但您并不总是有窗格。请参阅我的副刊.getPane().setTopLeftCell(“C1”)(我的冻结窗格冻结到B列)似乎不起作用。虽然excel工作表在C列打开,但它没有显示我想要的第一行。@yaswanth:我的示例代码按预期工作。如果您的代码不能按预期工作,那么我们需要查看该代码。请更新你的问题,提供一个答案。@AlexRichter,我已经更新了问题中的代码。非常感谢你的帮助!