apache-poi - apache POI:整个列的dataValidation(或样式),标题行除外?
问题描述
对于 CellRange,我们可以传递-1
开始/结束行参数以将样式和dataValidators 应用于整个列。
但是如何跳过标题?
理想的解决方案是CellRangeAddressList
使用“A1:A$”创建,但它只有int
构造函数。
我试着假设这-1
是一个特殊的值,它意味着一些特殊的东西,但CellRangeAddressList(1, -1, ...)
由于“开始行>结束行”错误而失败。然后我还尝试假设-1
最后一个单元格,但是从最后一个到 1CellRangeAddressList(-1, 1, ...)
导致没有选择单元格。
最后,我尝试从 docs 中删除第一行,CellRangeAddressList(-1, -1, ...)
但据我所知,在创建后无法操作范围docs。
解决方案
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 大小。
推荐阅读
- ruby - Rails 未从 CSV 读取特定列
- virtual-machine - 由 Jack 中的 getter mwthod 导致 VMEmulator 中的“段空间不足”错误
- r - 如何解决我在使用 inner_join 函数时遇到的这个错误?
- javascript - 每次单击按钮时如何创建一个新的 DIV?
- ios - 更新 SwiftUI 视图大小以匹配图像
- java - 如何在java中添加2个文本文件的内容
- android - Firebase startAt 在检索数据时返回 null
- azure - 从 Azure DevOps yaml 设置应用服务应用程序设置
- python - AttributeError:类型对象没有属性(*args 有问题?)
- c# - “找不到类型或命名空间‘BlobTrigger’”