簡體   English   中英

Apache Poi setActiveCell() 用於多個單元

[英]Apache Poi setActiveCell() for multiple cells

我正在嘗試使用方法sheet.setActiveCell(CellAddress addr)來設置同時處於活動狀態的多個單元格的范圍。 我已經嘗試過使用多個版本的 Apache poi-ooxml 庫,現在我使用的是 3.16,它也支持方法sheet.setActiveCell(String addr) (我知道 3.16 是舊的,但問題與最新版本相同) .

按照關於這個問題的建議: Is it possible to set the active range with Apache POI XSSF? 我已經設法讓它工作,使用自定義 CellAddress 和格式為“A1:B5”的字符串。

問題是,每次我嘗試打開一個 xlsx,其中使用 apache poi 將一系列單元格設置為活動時,我都會收到來自 Excel 的錯誤消息,指出文件已損壞,需要恢復。 如果我這樣做了,恢復就會正確完成,但是這個錯誤很煩人,因為我每天都必須打開大量這些文件。

有沒有辦法避免 excel 出現這個錯誤(可能是修改 xlsx 的創建或更改 Excel 中的某些設置)?

只有一個單元格可以是活動單元格。 Sheet.setActiveCell只設置一個活動單元格。 因此,如果setActiveCell(String addr)可用, sheet.setActiveCell("A1:B5")將起作用,但會導致工作表損壞。 這就是它被刪除的原因。

可以選擇多個單元格。 但是在apache poi的高級類中沒有設置選定單元格的方法。 所以需要使用底層的低級類。 這樣做需要區分XSSFHSSF ,因為需要使用不同的低級類。

以下完整示例將活動單元格設置為B2 這還將具有選擇和活動單元格的工作表視圖設置為那個給定的單元格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);
  }
 }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM