前言

Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

实际开发中,用POI来读写excel文档的比较多。所以,这里记录下用POI读取excel文档的一些难点做下记录。

难点1:合并单元格

在实际开发中,有时会遇到如图示例,需要按照如图所示进行导出excel文件。这就涉及到了合并单元格和给单元格赋值的问题。

代码实现策略:

step 1: 合并单元格

eventSheet.addMergedRegion(new CellRangeAddress(lineNum, fields.size() + lineNum - 1, 1, 1));

step 2: 给单元格赋值

按照正常给单元格赋值即可,只是在合并的单元格第一行赋值就行,不用重复赋值;

cell = row.createCell((short) 1);
cell.setCellValue(eventVO.getEventId());
cell.setCellStyle(align_center_style);

难点2:数据验证-下拉框

在导出excel文件时,需要添加数据验证的下拉框。如图:

代码实现策略:

step 1:设置需要进行数据验证的单元格范围和可供选择的值

	/**
* 设置 excel数据验证
*
* @param firstRow
* @param firstCol
* @param endRow
* @param endCol
* @param strList 可供选择的值
* @return
* @since @ 2018年3月14日
*/
XSSFDataValidation getDataValidationList(XSSFSheet sheet, short firstRow, short firstCol, short endRow, short endCol, List<String> strList) {
String[] datas = strList.toArray(new String[0]);
XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet);
XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper
.createExplicitListConstraint(datas);
CellRangeAddressList addressList = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
XSSFDataValidation validation = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, addressList);
return validation;
}

step 2:给当前sheet添加数据验证

sheet.addValidationData(line2ValidationList);

难点3:数据验证-某列保证唯一性

有时候在excel文件的某列添加数据时,需要保证某列的数据唯一。这就需要使用excel的数据验证-自定义,设置为:=COUNTIF($B$2:B2,B2)=1(说明:从B2开始,B列的数据保证唯一,若是重复会给出提示,不能保存)

代码实现策略:

step 1:设置需要进行数据验证的单元格范围

    public static XSSFDataValidation getDataValidationCustomFormula(XSSFSheet sheet, short firstRow, short firstCol, short endRow, short endCol, String formula) {
XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet);
XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper
.createCustomConstraint(formula);
CellRangeAddressList addressList = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
XSSFDataValidation validation = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, addressList); validation.createErrorBox("Error", "Repeating Date.");
validation.setShowErrorBox(true);
validation.setEmptyCellAllowed(true);
validation.setSuppressDropDownArrow(true);
validation.setShowPromptBox(true);
validation.setErrorStyle(DataValidation.ErrorStyle.STOP); return validation;
}

step 2:给当前sheet添加数据验证

        XSSFDataValidation dataValidation = XX.getDataValidationCustomFormula((XSSFSheet) eventSheet, (short) 1, (short) 1, (short) (lineNum + 5), (short) 1, "=COUNTIF($B$2:B2,B2)=1");
if (dataValidation != null) {
eventSheet.addValidationData(dataValidation);
}

POI实现excel的数据验证的更多相关文章

  1. 项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据

    1. 快递员的条件分页查询-noSession,条件查询 2. 快递员删除(逻辑删除) 3. 基于Apache POI实现批量导入区域数据 a) Jquery OCUpload上传文件插件使用 b) ...

  2. 使用poi读取Excel文件数据

    package com.haiyisoft.iecp.util; import java.io.File;import java.io.FileInputStream;import java.io.F ...

  3. java中使用poi导出excel表格数据并且可以手动修改导出路径

    在我们开发项目中,很多时候会提出这样的需求:将前端的某某数据以excel表格导出,今天就给大家写一个简单的模板. 这里我们选择使用poi导出excel: 第一步:导入需要的jar包到 lib 文件夹下

  4. 使用NPOI或POI 导出Excel大数据(百万级以上),导致内存溢出的解决方案(NPOI,POI)

    使用工具:POI(JAVA),NPOI(.Net) 致谢博主 Crazy_Jeff 提供的思路 一.问题描述: 导出任务数据量近100W甚至更多,导出的项目就会内存溢出,挂掉. 二.原因分析: 1.每 ...

  5. Java POI 实现Excel相同数据同一颜色,不同数据颜色交替显示

    目录 1.效果图 2.具体代码实现 excel 读取工具类 excel写入和测试类 1.效果图 2.具体代码实现 excel 读取工具类 package utils; import java.io.F ...

  6. POI 生成excel(大数据量) SXSSF

    使用POI 的SXSSF (Streaming Usermodel API)生成较大的excel,同时开启压缩 import junit.framework.Assert; import org.ap ...

  7. poi读取Excel内容数据

    public static void main(String[] args) { try{ //获取文件输入流 FileInputStream fileIn = new FileInputStream ...

  8. poi导入excel表格数据到数据库的时候,对出生日期的校验

    出生日期格式为8位数字的字符串 如:yyyyMMdd 规则:yyyy大于1900并小于当前时间,月.日 按日期规则校验 //解决读过来的字符串显示为科学计数法问题 BigDecimal bd = ne ...

  9. excel自定义数据验证

    1. 判断必须为5位或者9位的数字 2. 自定义限制级别和提示消息

随机推荐

  1. Oracle之视图

    Oracle之视图 2018.9.12 由于视图的数据与表数据互相关联,所以切记谨慎操作 建立视图 使用下面sql语句来完成视图的创建 create or replace view 视图名 as se ...

  2. 【例题收藏】◇例题·6◇ 电压机制(voltage)

    ◆例题·6◆ 电压机制 周六日常模拟赛……已经不知道该说什么了(感觉做不出来的都是好题) ▷ 题目 (终于不用自己翻译英文题了╮(╯-╰)╭) [问题描述] 科学家在“无限神机”(Infinity M ...

  3. JavaScript--获取页面盒子中鼠标相对于盒子上、左边框的坐标

    分析: 外层边框是浏览器边框,内部盒子是页面的一个盒子,绿点是盒子中鼠标的位置.鼠标相对盒子边框的坐标=页面中(注意不是浏览器)鼠标坐标-盒子相对于浏览器边框的偏移量 第一步:求浏览器边框位置 x=e ...

  4. dom4j解析器sax解析xml文件

    1.使用dom4j解析器解析xml ***解析器dom4j是由dom4j组织提供的,针对xml进行解析.dom4j不是Javase的一部分,使用时需要导入dom4j的jar包(官网下载) 在eclip ...

  5. C# WebClient类上传和下载文件

    这篇文章主要介绍了C# WebClient类用法实例,本文讲解使用WebClient下载文件.OpenWriter打开一个流使用指定的方法将数据写入到uri以及上传文件示例,需要的朋友可以参考下   ...

  6. 电子商城实录------定义init初始化的方法

    路由方法的设置 //路由方法 private static function dispatch(){ //获取控制器名称(类比:英文单词的后缀) $controller_name=CONTROLLER ...

  7. R语言学习笔记(七): 排序函数:sort(), rank(), order()

    sort() sort()函数直接对函数进行排序,并返回排序结果. > a <- c(12,4,6,5) > sort(a) [1] 4 5 6 12 rank() rank()函数 ...

  8. P2153 [SDOI2009]晨跑(最小费用最大流)

    题目描述 Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个十字路口和M条街 ...

  9. python--基本类型之数值

    Number(数字): 数字类型创建: a = 10b = ab = 20 pint('a : 'a)pint('b : 'b) 数据类型转换: int(x,[,base]) 将 x 转换为一个整数f ...

  10. 详解jQuery中 .bind() vs .live() vs .delegate() vs .on() 的区别

    转载自:http://zhuzhichao.com/2013/12/differences-between-jquery-bind-vs-live/ 我见过很多开发者很困惑关于jQuery中的.bin ...