发布时间 : 星期二 文章Apache POI HSSF and XSSF 快速指南 帮助文档 API poi-3.15更新完毕开始阅读
//布尔值'false'必须传递给setSuppressDropDownArrow() //方法和对setShowErrorBox()方法的显式调用。 if(validation instanceof XSSFDataValidation){ validation.setSuppressDropDownArrow(true); validation.setShowErrorBox(true); } else {
//如果Datavalidation包含HSSFDataValidation的实例 //class then'true'应该传递给setSuppressDropDownArrow() //方法,并且调用setShowErrorBox()不是必需的。 validation.setSuppressDropDownArrow(false); }
sheet.addValidationData(validation);
提示和错误消息:
这两个都完全镜像hssf.usermodel所以请参考上面的“错误消息:”和“提示:”部分。
由于ss.usermodel和xssf.usermodel示例之间的差异很小 - 很大程度上受限于DataValidationHelper的获取方式,
缺乏显式转换数据类型和hssf和xssf解释之间行为的小差异setSuppressDropDowmArrow()方法,本节将不再包含其他示例。
高级数据验证。 依赖的下拉列表。
在一些情况下,可能需要向用户呈现包含多于一个下拉列表的纸张。
此外,用户在一个下拉列表中做出的选择可以影响在第二或后续下拉列表中呈现给他们的选项。
现在将解释可以用于实现该行为的一种技术。
有两个关键的技术;一个是使用命名区域或单元格区域来保存下拉列表的数据; 第二个是使用INDIRECT()函数在单元格的名称和实际地址之间进行转换。
在示例部分有一个完整的工作示例,称为LinkedDropDownLists.java - 演示如何创建链接或依赖的下拉列表。这里只解释更相关的点。
要创建两个下拉列表,其中第二个显示的选项取决于第一个选项,请创建一个命名的单元格区域,以容纳填充第一个下拉列表的所有数据。接下来,创建一个数据验证,查找这个命名区域的数据,像这样;
CellRangeAddressList addressList = new CellRangeAddressList(0,0,0,0); DataValidationHelper dvHelper = sheet.getDataValidationHelper();
DataValidationConstraint dvConstraint = dvHelper.createFormulaListConstraint( “CHOICES”);
DataValidation validation = dvHelper.createValidation( dvConstraint,addressList);
sheet.addValidationData(validation);
请注意,区域的名称(在上面的示例中是“CHOICES”)只是传递给createFormulaListConstraint()
方法。这足以使Excel从该命名区域的数据填充下拉列表。
接下来,对于用户可以在第一下拉列表中选择的每个选项,创建匹配的命名的单元区域。 该区域的名称应与用户在第一个下拉列表中选择的文本相匹配。注意,在该示例中,在单元格区域的名称中使用所有大写字母。
现在,非常类似的代码可以用来创建第二个,链接,下拉列表;
CellRangeAddressList addressList = new CellRangeAddressList(0,0,1,1);
DataValidationConstraint dvConstraint = dvHelper.createFormulaListConstraint( “INDIRECT(UPPER($ A $ 1))”);
DataValidation validation = dvHelper.createValidation( dvConstraint,addressList);
sheet.addValidationData(validation);
这里的关键在于以下Excel函数 - INDIRECT(UPPER($ A $ 1)) - 用于填充第二个链接的下拉列表。
使用最内对的括号,它指示Excel查看单元格A1的内容,将其中读取的内容转换为大写 - 在每个区域的名称中使用大写字母 - 然后转换此名称到包含要填充另一个下拉列表的数据的那些单元格的地址。
38、嵌入对象
可以对嵌入的Excel,Word或PowerPoint文档执行更详细的处理,或者使用任何其他类型的嵌入对象。
HSSF:
POIFSFileSystem fs = new POIFSFileSystem(new File(“excel_with_embeded.xls”)); HSSFWorkbook workbook = new HSSFWorkbook(fs);
for(HSSFObjectData obj:workbook.getAllEmbeddedObjects()){ //对象的OLE2类名
String oleName = obj.getOLE2ClassName(); if(oleName.equals(“Worksheet”)),
DirectoryNode dn =(DirectoryNode)obj.getDirectory();
HSSFWorkbook embeddedWorkbook = new HSSFWorkbook(dn,false);
//System.out.println(entry.getName()+“:”+ embeddedWorkbook.getNumberOfSheets()); - else if(oleName.equals(“Document”)),
DirectoryNode dn =(DirectoryNode)obj.getDirectory();
HWPFDocument embeddedWordDocument = new HWPFDocument(dn);
//System.out.println(entry.getName()+“:”+ embeddedWordDocument.getRange()。text()); - else if(oleName.equals(“Presentation”)),
DirectoryNode dn =(DirectoryNode)obj.getDirectory();
SlideShow <?,?> embeddedPowerPointDocument = new HSLFSlideShow(dn);
//System.out.println(entry.getName()+“:”+ embeddedPowerPointDocument.getSlides()。length); } else {
if(obj.hasDirectoryEntry()){
//DirectoryEntry是一个DocumentNode。检查其条目以找出它是什么 DirectoryNode dn =(DirectoryNode)obj.getDirectory(); for(Entry entry:dn){
//System.out.println(oleName +“。”+ entry.getName()); }
} else {
//没有DirectoryEntry
//从HSSFObjectData实例恢复对象的数据。 byte [] objectData = obj.getObjectData(); } } }
XSSF:
XSSFWorkbook workbook = new XSSFWorkbook(“excel_with_embeded.xlsx”); for(PackagePart pPart:workbook.getAllEmbedds()){ String contentType = pPart.getContentType(); //ExcelWorkbook - 二进制或OpenXML
if(contentType.equals(“application /vnd.ms-excel”)),
HSSFWorkbook embeddedWorkbook = new HSSFWorkbook(pPart.getInputStream()); }
//ExcelWorkbook - OpenXML文件格式 else if(contentType.equals(“application /vnd.openxmlformats-officedocument.spreadsheetml.sheet”)),
OPCPackage docPackage = OPCPackage.open(pPart.getInputStream()); XSSFWorkbook embeddedWorkbook = new XSSFWorkbook(docPackage); }
//Word文档 - 二进制(OLE2CDF)文件格式
else if(contentType.equals(“application /msword”)),
HWPFDocument document = new HWPFDocument(pPart.getInputStream()); }
//Word文档 - OpenXML文件格式 else if(contentType.equals(“application /vnd.openxmlformats-officedocument.wordprocessingml.document”)), OPCPackage docPackage = OPCPackage.open(pPart.getInputStream()); XWPFDocument document = new XWPFDocument(docPackage); }
//PowerPoint文档 - 二进制文件格式
else if(contentType.equals(“application /vnd.ms-powerpoint”)),
HSLFSlideShow slideShow = new HSLFSlideShow(pPart.getInputStream()); }
//PowerPoint文档 - OpenXML文件格式 else if(contentType.equals(“application /vnd.openxmlformats-officedocument.presentationml.presentation”)), OPCPackage docPackage = OPCPackage.open(pPart.getInputStream()); XSLFSlideShow slideShow = new XSLFSlideShow(docPackage); }
//任何其他类型的嵌入对象。 else {
System.out.println(“未知的嵌入的文档:”+ contentType); InputStream inputStream = pPart.getInputStream(); } }
(自POI-3.7起)
39、自动过滤器
Workbook wb = new HSSFWorkbook(); //或new XSSFWorkbook(); sheet sheet = wb.createSheet();
sheet.setAutoFilter(CellRangeAddress.valueOf(“C5:F200”));
40、条件格式
Workbook workbook = new HSSFWorkbook(); //或new XSSFWorkbook(); Sheet sheet = workbook.createSheet();
SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
ConditionalFormattingRule rule1 =
sheetCF.createConditionalFormattingRule(ComparisonOperator.EQUAL,“0”); FontFormatting fontFmt = rule1.createFontFormatting(); fontFmt.setFontStyle(true,false);
fontFmt.setFontColorIndex(IndexedColors.DARK_RED.index);
BorderFormatting bordFmt = rule1.createBorderFormatting(); bordFmt.setBorderBottom(BorderFormatting.BORDER_THIN);