Java ApachePOI关注生成的excel文件中的特定单元格
嗨,我正在使用ApachePOI生成excel文件。我使用的是XSSF工作簿格式。我试图将焦点放在生成的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);
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,我已经更新了问题中的代码。非常感谢你的帮助!