用于多个单元格的 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
的高级别类中没有设置选中单元格的方法。所以需要使用底层低位类。这样做需要区分 XSSF
和 HSSF
,因为需要使用不同的低电平 类。
以下完整示例将活动单元格设置为 B2
。这还将 sheet 具有选择和活动单元格的视图设置为那个给定的单元格 B2
。然后它使用 XSSF
和 HSSF
的低级方法将选择设置为 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);
}
}
}
我正在尝试使用方法 sheet.setActiveCell(CellAddress addr)
设置同时激活多个单元格的范围。我已经尝试过多个版本的 Apache poi-ooxml 库,现在我使用的是 3.16,它也支持方法 sheet.setActiveCell(String addr)
(我知道 3.16 是旧的,但最新版本的问题也一样)。
按照对这个问题的建议:
问题是,每次我尝试使用 apache poi 打开一个 xlsx,其中一系列单元格已设置为活动时,我从 Excel 收到一条错误消息,说文件已损坏并且需要恢复。如果我这样做,恢复会正确完成,但这个错误很烦人,因为我每天必须打开大量这些文件。
有没有办法避免 excel 的这个错误(可能修改 xlsx 的创建或更改 Excel 中的某些设置)?
只有一个单元格可以成为活动单元格。 Sheet.setActiveCell
只设置一个活动单元格。因此,如果 setActiveCell(String addr)
可用,sheet.setActiveCell("A1:B5")
将起作用,但它会导致 sheet 损坏。这就是它被删除的原因。
可以选择多个单元格。但是在apache poi
的高级别类中没有设置选中单元格的方法。所以需要使用底层低位类。这样做需要区分 XSSF
和 HSSF
,因为需要使用不同的低电平 类。
以下完整示例将活动单元格设置为 B2
。这还将 sheet 具有选择和活动单元格的视图设置为那个给定的单元格 B2
。然后它使用 XSSF
和 HSSF
的低级方法将选择设置为 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);
}
}
}