apache POI: dataValidation (или стиль) для всего столбца, кроме строки заголовка? - PullRequest
0 голосов
/ 17 января 2019

Для CellRange мы можем передать -1 как для параметров начала / конца строки, чтобы применить стили, так и dataValidators ко всему столбцу .

Но как пропустить заголовок?

Идеальным решением было бы CellRangeAddressList, созданное с помощью "A1: A $", но в нем есть только конструкторы int.

Я пытался предположить, что -1 - это специальное значение, котороеозначает что-то особенное, но CellRangeAddressList(1, -1, ...) завершается с ошибкой «начало строки> конец строки».Затем я также попытался предположить, что -1 означает последнюю ячейку, но переход от последней к 1 CellRangeAddressList(-1, 1, ...) привел к тому, что ячейка не была выбрана.

Наконец, я попытался удалить первую строку из CellRangeAddressList(-1, -1, ...), но это не так.можно манипулировать диапазонами после создания, насколько я могу судить по документам .

1 Ответ

0 голосов
/ 17 января 2019

Создание CellRangeAddress для всего столбца, кроме первой строки, означает, что CellRangeAddress начинается со строки 2 и увеличивается до максимального количества строк. Это зависит от SpreadsheetVersion. В EXCEL2007 максимальное количество строк равно 2 ^ 20 = 1048576. В EXCEL97 максимальное количество строк равно 2 ^ 16 = 65536.

Используя SpreadsheetVersion , мы можем получить это различное максимальное количество строк в зависимости от SpreadsheetVersion.

Пример:

import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.ss.SpreadsheetVersion;

class CreateCellRangeAddressList {

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

  //Workbook workbook = new XSSFWorkbook(); 
  Workbook workbook = new HSSFWorkbook(); 

// ...

  int lastRow = workbook.getSpreadsheetVersion().getLastRowIndex();

  CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(
   1, // row 2
   lastRow, 
   2, // column C
   2);

System.out.println(cellRangeAddressList.getCellRangeAddress(0)); 
//C2:C1048576 or C2:C65536 dependent on SpreadsheetVersion

// ...

 }
}

Поскольку вопрос был о проверке данных для всего столбца, кроме первой строки, давайте рассмотрим пример для этого.

import java.io.FileOutputStream;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddressList;

class CreateExcelDataValidationListsWholeColumn {

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

  //Workbook workbook = new HSSFWorkbook();
  Workbook workbook = new XSSFWorkbook();

  Sheet sheet = workbook.createSheet("Sheet1");

  sheet.createRow(0).createCell(1).setCellValue("col2Head");

  //data validation in column B, except first row:
  DataValidationHelper dvHelper = sheet.getDataValidationHelper();
  DataValidationConstraint dvConstraint = dvHelper.createExplicitListConstraint(new String[]{"X", "Y"}) ;
  int lastRow = workbook.getSpreadsheetVersion().getLastRowIndex();
  CellRangeAddressList addressList = new CellRangeAddressList(1, lastRow, 1, 1); //B2:B1048576      
  DataValidation validation = dvHelper.createValidation(dvConstraint, addressList);
  sheet.addValidationData(validation); // data validation for B2:B1048576 

  FileOutputStream out = null;
  if (workbook instanceof HSSFWorkbook) {
   out = new FileOutputStream("CreateExcelDataValidationListsWholeColumn.xls");
  } else if (workbook instanceof XSSFWorkbook) {
   out = new FileOutputStream("CreateExcelDataValidationListsWholeColumn.xlsx");
  }
  workbook.write(out);
  workbook.close();
  out.close();

 }
}

Это приводит к листу XML следующим образом:

<worksheet>
 <dimension ref="B1"/>
 <sheetViews>
  <sheetView workbookViewId="0" tabSelected="true"/>
 </sheetViews>
 <sheetFormatPr defaultRowHeight="15.0"/>
 <sheetData>
  <row r="1"><c r="B1" t="s"><v>0</v></c></row>
 </sheetData>
 <dataValidations count="1">
  <dataValidation type="list" sqref="B2:B1048576" allowBlank="true" errorStyle="stop">
    <formula1>"X,Y"</formula1>
  </dataValidation>
 </dataValidations>
 <pageMargins bottom="0.75" footer="0.3" header="0.3" left="0.7" right="0.7" top="0.75"/>
</worksheet>

И, используя HSSFWorkbook, получаем CreateExcelDataValidationListsWholeColumn.xls размером 4 КБ.

...