首页 > 解决方案 > apache POI:整个列的dataValidation(或样式),标题行除外?

问题描述

对于 CellRange,我们可以传递-1开始/结束行参数以将样式和dataValidators 应用于整个列

但是如何跳过标题?

理想的解决方案是CellRangeAddressList使用“A1:A$”创建,但它只有int构造函数。

我试着假设这-1是一个特殊的值,它意味着一些特殊的东西,但CellRangeAddressList(1, -1, ...)由于“开始行>结束行”错误而失败。然后我还尝试假设-1最后一个单元格,但是从最后一个到 1CellRangeAddressList(-1, 1, ...)导致没有选择单元格。

最后,我尝试从 docs 中删除第一行,CellRangeAddressList(-1, -1, ...)但据我所知,在创建后无法操作范围docs

标签: apache-poi

解决方案


CellRangeAddress为除第一行以外的整列创建 a意味着 aCellRangeAddress从第 2 行开始并达到最大行数。这取决于SpreadsheetVersion. 最大行数为 2^ 20 EXCEL2007= 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 KByte 大小。


推荐阅读