用于多个单元格的 Apache Poi setActiveCell()

Apache Poi setActiveCell() for multiple cells

我正在尝试使用方法 sheet.setActiveCell(CellAddress addr) 设置同时激活多个单元格的范围。我已经尝试过多个版本的 Apache poi-ooxml 库,现在我使用的是 3.16,它也支持方法 sheet.setActiveCell(String addr)(我知道 3.16 是旧的,但最新版本的问题也一样)。

按照对这个问题的建议: 我已经设法让它工作,包括自定义 CellAddress 和格式为“A1:B5”的字符串。

问题是,每次我尝试使用 apache poi 打开一个 xlsx,其中一系列单元格已设置为活动时,我从 Excel 收到一条错误消息,说文件已损坏并且需要恢复。如果我这样做,恢复会正确完成,但这个错误很烦人,因为我每天必须打开大量这些文件。

有没有办法避免 excel 的这个错误(可能修改 xlsx 的创建或更改 Excel 中的某些设置)?

只有一个单元格可以成为活动单元格。 Sheet.setActiveCell 只设置一个活动单元格。因此,如果 setActiveCell(String addr) 可用,sheet.setActiveCell("A1:B5") 将起作用,但它会导致 sheet 损坏。这就是它被删除的原因。

可以选择多个单元格。但是在apache poi的高级别类中没有设置选中单元格的方法。所以需要使用底层低位类。这样做需要区分 XSSFHSSF,因为需要使用不同的低电平 类。

以下完整示例将活动单元格设置为 B2。这还将 sheet 具有选择和活动单元格的视图设置为那个给定的单元格 B2。然后它使用 XSSFHSSF 的低级方法将选择设置为 B2:E5

import java.io.*;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;

class CreateExcelSelectMultipleCells {

 public static void main(String[] args) throws Exception {

  try (Workbook workbook = new XSSFWorkbook(); FileOutputStream out = new FileOutputStream("Excel.xlsx") ) {
  //try (Workbook workbook = new HSSFWorkbook(); FileOutputStream out = new FileOutputStream("Excel.xls") ) {

   Sheet sheet = workbook.createSheet();
   Row row;
   Cell cell;
     
   for (int r = 0; r < 6; r++) {
    row = sheet.createRow(r);
    for (int c = 0; c < 6; c++) {
     cell = row.createCell(c);
     cell.setCellValue("R" + (r+1) + "C" + (c+1));
    }
   }

   // set active cell; this also sets sheet view having selection and active cell to one given cell
   sheet.setActiveCell(new CellAddress("B2"));
   // set selected cells 
   if (sheet instanceof XSSFSheet) {
    XSSFSheet xssfSheet = (XSSFSheet) sheet;
    xssfSheet.getCTWorksheet().getSheetViews().getSheetViewArray(0).getSelectionArray(0).setSqref(
     java.util.Arrays.asList("B2:E5"));
   } else if (sheet instanceof HSSFSheet) {
    HSSFSheet hssfSheet = (HSSFSheet) sheet; 
    org.apache.poi.hssf.record.SelectionRecord selectionRecord = hssfSheet.getSheet().getSelection();
    java.lang.reflect.Field field_6_refs = org.apache.poi.hssf.record.SelectionRecord.class.getDeclaredField("field_6_refs");
    field_6_refs.setAccessible(true);
    field_6_refs.set(
     selectionRecord, 
     new org.apache.poi.hssf.util.CellRangeAddress8Bit[] { new org.apache.poi.hssf.util.CellRangeAddress8Bit(1,4,1,4) }
    );
   }
   
   workbook.write(out);
  }
 }
}