首页 文章

Apache POI关注生成的excel文件中的特定单元格

提问于
浏览
2

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

1 回答

  • 2

    不幸的是 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();
     }
    }
    

相关问题