您好我正在使用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);
}
我也看过这个SO question。解决方案似乎对我不起作用。有人可以帮我吗?
P.S:我正在使用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());
}
答案 0 :(得分:3)
不幸的是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();
}
}