前言

先写的导入,以为导出会很简单,没想到导出的东西也不少,基于常用的几种样式和校验写了一个简单的导出,包括时间,数字,文字长度,下拉框,提示框校验,基础样式包括字体,字体颜色,背景颜色等功能,可以使用rgb,基本上满足了我的需求。

基础校验类

package cc.vvxtoys.vhelper.excelhelper.exporter;

import java.text.SimpleDateFormat;

import org.apache.poi.hssf.usermodel.DVConstraint;
import org.apache.poi.hssf.usermodel.HSSFDataValidation;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationConstraint.ValidationType;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.xssf.usermodel.XSSFDataValidation;
import org.apache.poi.xssf.usermodel.XSSFDataValidationConstraint;
import org.apache.poi.xssf.usermodel.XSSFDataValidationHelper;
import org.apache.poi.xssf.usermodel.XSSFSheet; /**
* @author vvxtoys
* @date 2018年11月8日下午5:30:02
* @Description: TODO
* @version V1.0
*/
public class BaseValidation implements Validation{ private int version; //版本
private Sheet sheet;
private ValidationConfig config; public BaseValidation(ValidationConfig config){
this.config = config;
}
@Override
public DataValidation createPrompt(){
if(version == 0){
return xlsPrompt();
}else{
return xlsxPrompt();
}
}
private HSSFDataValidation xlsPrompt(){
CellRangeAddressList addressList = new CellRangeAddressList(config.getStartRow(), config.getEndRow(),
config.getStartCol(), config.getEndCol());
DVConstraint dv = DVConstraint.createCustomFormulaConstraint("BB1");
HSSFDataValidation dataValidation = new HSSFDataValidation(addressList, dv);
dataValidation.setSuppressDropDownArrow(false);
dataValidation.createPromptBox("输入提示", config.getPromptText());
dataValidation.setShowPromptBox(true);
return dataValidation;
}
private XSSFDataValidation xlsxPrompt(){
XSSFDataValidationHelper help = new XSSFDataValidationHelper((XSSFSheet)sheet);
CellRangeAddressList addressList = new CellRangeAddressList(config.getStartRow(), config.getEndRow(),
config.getStartCol(), config.getEndCol());
XSSFDataValidationConstraint dv = (XSSFDataValidationConstraint)help.createCustomConstraint("BB1");
XSSFDataValidation validation = (XSSFDataValidation)help.createValidation(dv, addressList);
validation.setSuppressDropDownArrow(false);
validation.createPromptBox("输入提示",config.getPromptText());
validation.setShowPromptBox(true);
return validation;
}
@Override
public DataValidation createDropDownBox(){
if(version == 0){
return xlsDropDownBox();
}else{
return xlsxDropDownBox();
}
} private HSSFDataValidation xlsDropDownBox(){
CellRangeAddressList regions = new CellRangeAddressList(config.getStartRow(), config.getEndRow(),
config.getStartCol(), config.getEndCol());
DVConstraint constraint = DVConstraint.createExplicitListConstraint(config.getTextlist());
HSSFDataValidation datavalidation = new HSSFDataValidation(regions,constraint);
datavalidation.setSuppressDropDownArrow(false);
datavalidation.createPromptBox("输入提示", config.getPromptText());
datavalidation.setShowPromptBox(true);
return datavalidation;
}
private XSSFDataValidation xlsxDropDownBox(){
XSSFDataValidationHelper help = new XSSFDataValidationHelper((XSSFSheet)sheet);
XSSFDataValidationConstraint dvConstraint= (XSSFDataValidationConstraint) help.createExplicitListConstraint(config.getTextlist());
CellRangeAddressList addressList = new CellRangeAddressList(config.getStartRow(), config.getEndRow(),
config.getStartCol(), config.getEndCol());
XSSFDataValidation validation = (XSSFDataValidation) help.createValidation(
dvConstraint, addressList);
validation.setSuppressDropDownArrow(true);
validation.createPromptBox("输入提示", config.getPromptText());
validation.setShowPromptBox(true);
return validation;
}
@Override
public DataValidation createValidateTime(){
if(version == 0){
return xlsValidateTime();
}else{
return xlsxValidateTime();
}
} private HSSFDataValidation xlsValidateTime(){
CellRangeAddressList addressList = new CellRangeAddressList(config.getStartRow(), config.getEndRow(),
config.getStartCol(), config.getEndCol());
DVConstraint dvConstraint = DVConstraint.createDateConstraint(DVConstraint.OperatorType.BETWEEN, config.getStartDate(),
config.getEndDate(), config.getPattern());
HSSFDataValidation dataValidation = new HSSFDataValidation(addressList, dvConstraint);
dataValidation.setSuppressDropDownArrow(false);
dataValidation.createPromptBox("输入提示",config.getPromptText());
dataValidation.createErrorBox("日期格式错误提示", config.getErrorText());
dataValidation.setShowPromptBox(true);
return dataValidation;
}
private XSSFDataValidation xlsxValidateTime(){
XSSFDataValidation validation = null;
try{
SimpleDateFormat sdf = new SimpleDateFormat(config.getPattern());
XSSFDataValidationHelper help = new XSSFDataValidationHelper((XSSFSheet)sheet);
CellRangeAddressList addressList = new CellRangeAddressList(config.getStartRow(), config.getEndRow(),
config.getStartCol(), config.getEndCol());
XSSFDataValidationConstraint dvConstraint=(XSSFDataValidationConstraint)
help.createDateConstraint(DataValidationConstraint.OperatorType.BETWEEN,
""+DateUtil.getExcelDate(sdf.parse(config.getStartDate())),
""+DateUtil.getExcelDate(sdf.parse(config.getEndDate())), ""); validation = (XSSFDataValidation) help.createValidation(
dvConstraint, addressList); validation.createPromptBox("输入提示",config.getPromptText());
validation.createErrorBox("日期格式错误提示",config.getErrorText());
validation.setShowPromptBox(true);
validation.setShowErrorBox(true);
validation.setErrorStyle(0);
sheet.addValidationData(validation);
}catch(Exception e){
e.printStackTrace();
}
return validation;
}
@Override
public DataValidation createTextLength(){
if(version == 0){
return xlsTextLength();
}else{
return xlsxTextLength();
}
}
private HSSFDataValidation xlsTextLength(){
DVConstraint constraint = DVConstraint.createNumericConstraint(
DVConstraint.ValidationType.TEXT_LENGTH,
DVConstraint.OperatorType.BETWEEN, String.valueOf(config.getMinLen()), String.valueOf(config.getMaxLen()));
CellRangeAddressList addressList = new CellRangeAddressList(config.getStartRow(), config.getEndRow(),
config.getStartCol(), config.getEndCol());
HSSFDataValidation dataValidation = new HSSFDataValidation(addressList, constraint);
dataValidation.setSuppressDropDownArrow(false);
dataValidation.createPromptBox("输入提示", config.getPromptText());
// 设置输入错误提示信息
dataValidation.createErrorBox("格式错误",config.getErrorText());
dataValidation.setShowPromptBox(true);
return dataValidation;
}
private XSSFDataValidation xlsxTextLength(){
XSSFDataValidationHelper help = new XSSFDataValidationHelper((XSSFSheet)sheet);
CellRangeAddressList addressList = new CellRangeAddressList(config.getStartRow(), config.getEndRow(),
config.getStartCol(), config.getEndCol());
XSSFDataValidationConstraint dvConstraint=(XSSFDataValidationConstraint)
help.createNumericConstraint(ValidationType.TEXT_LENGTH, DataValidationConstraint.OperatorType.BETWEEN, String.valueOf(config.getMinLen()), String.valueOf(config.getMaxLen()));
XSSFDataValidation validation = (XSSFDataValidation) help.createValidation(
dvConstraint, addressList);
validation.createPromptBox("输入提示", config.getPromptText());
validation.createErrorBox("格式错误提示", config.getErrorText());
validation.setShowPromptBox(true);
validation.setShowErrorBox(true);
return validation;
}
@Override
public DataValidation createValidateNumber(){
if(version == 0){
return xlsValidateNumber();
}else{
return xlsxValidateNumber();
}
} private HSSFDataValidation xlsValidateNumber(){
DVConstraint constraint = DVConstraint.createNumericConstraint(
DVConstraint.ValidationType.DECIMAL,
DVConstraint.OperatorType.BETWEEN, String.valueOf(config.getMin()), String.valueOf(config.getMax()));
CellRangeAddressList addressList = new CellRangeAddressList(config.getStartRow(), config.getEndRow(),
config.getStartCol(), config.getEndCol());
HSSFDataValidation dataValidation = new HSSFDataValidation(addressList, constraint);
dataValidation.createPromptBox("输入提示", config.getPromptText());
dataValidation.createErrorBox("格式错误", config.getErrorText());
dataValidation.setShowPromptBox(true);
dataValidation.setShowErrorBox(true);
return dataValidation;
}
private XSSFDataValidation xlsxValidateNumber(){
XSSFDataValidationHelper help = new XSSFDataValidationHelper((XSSFSheet)sheet);
CellRangeAddressList addressList = new CellRangeAddressList(config.getStartRow(), config.getEndRow(),
config.getStartCol(), config.getEndCol());
XSSFDataValidationConstraint dvConstraint=(XSSFDataValidationConstraint)
help.createNumericConstraint(ValidationType.DECIMAL, DataValidationConstraint.OperatorType.BETWEEN, String.valueOf(config.getMin()), String.valueOf(config.getMax()));
XSSFDataValidation validation = (XSSFDataValidation) help.createValidation(
dvConstraint, addressList);
validation.createPromptBox("输入提示", config.getPromptText());
validation.createErrorBox("格式错误", config.getErrorText());
validation.setShowPromptBox(true);
validation.setShowErrorBox(true);
return validation;
} public void generatorValidation(){
if(version == 0 && config.getEndRow() == 0){
config.setEndRow(65535);
}else if(version == 1 && config.getEndRow() == 0){
config.setEndRow(1048575);
}
if(config.getCustomize()){
addValidation(config.getDataValidation());
}else{
switch (config.getEv()) {
case PROMPT:
addValidation(createPrompt());
break;
case DROPDOWN:
addValidation(createDropDownBox());
break;
case DATE:
addValidation(createValidateTime());
break;
case LENGTH:
addValidation(createTextLength());
break;
case NUMBER:
addValidation(createValidateNumber());
break;
default:
break;
}
}
}
public void setSheet(Sheet sheet){
if(sheet instanceof HSSFSheet){
this.version = 0;
this.sheet = (HSSFSheet)sheet;
}else if(sheet instanceof XSSFSheet){
this.version = 1;
this.sheet = (XSSFSheet)sheet;
}
} public void addValidation(DataValidation dataValidation){
sheet.addValidationData(dataValidation);
}
}

基础样式类

package cc.vvxtoys.vhelper.excelhelper.exporter;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPalette;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor.HSSFColorPredefined;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.DefaultIndexedColorMap;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFDataFormat;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class BaseStyle { private int version;
private Workbook workbook;
private StyleConfig sconfig; public BaseStyle(Workbook workbook,StyleConfig config) {
if(workbook instanceof HSSFWorkbook){
this.version = 0;
this.workbook = workbook;
this.sconfig = config;
}else if(workbook instanceof XSSFWorkbook){
version = 1;
this.workbook = workbook;
this.sconfig = config;
}
} /**
* @author vvxtoys
* @date 2018年11月13日下午3:38:58
* @Description: 调用优先级 rgb index
* @return
*/
public CellStyle generatorStyle(){
if(sconfig.isOuter()){
return sconfig.getCellStyle();
}
if(version == 0){
HSSFCellStyle style = ((HSSFWorkbook)workbook).createCellStyle();
Object bgColor = sconfig.getBackground();
if(bgColor instanceof byte[]){
byte[] bs = (byte[])bgColor;
style.setFillForegroundColor(HSSFColorPredefined.WHITE.getIndex());
HSSFPalette palette = ((HSSFWorkbook) workbook).getCustomPalette();
palette.setColorAtIndex(HSSFColorPredefined.WHITE.getIndex(), bs[0], bs[1], bs[2]);
}else{
short bgIndex = (short)bgColor;
if(bgIndex == -1){
style.setFillForegroundColor(HSSFColorPredefined.GREY_40_PERCENT.getIndex());
}else{
style.setFillForegroundColor(bgIndex);
}
}
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
style.setBorderBottom(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);
style.setBorderTop(BorderStyle.THIN);
style.setAlignment(HorizontalAlignment.CENTER);
HSSFDataFormat format = ((HSSFWorkbook)workbook).createDataFormat();
style.setDataFormat(format.getFormat("@"));
style.setWrapText(true); HSSFFont font = ((HSSFWorkbook)workbook).createFont();
Object fColor = sconfig.getFontColor();
if(fColor instanceof byte[]){
byte[] frgb = (byte[])fColor;
font.setColor(HSSFColorPredefined.BLACK.getIndex());
style.setFillForegroundColor(HSSFColorPredefined.BLACK.getIndex());
HSSFPalette palette1 = ((HSSFWorkbook) workbook).getCustomPalette();
palette1.setColorAtIndex(HSSFColorPredefined.BLACK.getIndex(), frgb[0], frgb[1], frgb[2]);
}else{
short fIndex = (short)fColor;
if(fIndex == -1){
font.setColor(HSSFColorPredefined.BLACK.getIndex());
}else{
font.setColor(fIndex);
}
}
font.setFontHeightInPoints(sconfig.getHeight());
font.setFontName(sconfig.getFontName());
font.setBold(sconfig.getBlob()); style.setFont(font); return style;
}else{
XSSFCellStyle style = ((XSSFWorkbook)workbook).createCellStyle();
Object bgColor = sconfig.getBackground();
if(bgColor instanceof byte[]){
byte[] rgb = (byte[])bgColor;
XSSFColor color = new XSSFColor(rgb, new DefaultIndexedColorMap());
style.setFillForegroundColor(color);
}else{
short bgIndex = (short)bgColor;
if(bgIndex == -1){
style.setFillForegroundColor(HSSFColorPredefined.GREY_40_PERCENT.getIndex());
}else{
style.setFillForegroundColor(bgIndex);
}
} style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
style.setBorderBottom(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);
style.setBorderTop(BorderStyle.THIN);
style.setAlignment(HorizontalAlignment.CENTER);
style.setWrapText(true);
XSSFDataFormat format = ((XSSFWorkbook)workbook).createDataFormat();
style.setDataFormat(format.getFormat("@")); XSSFFont font = ((XSSFWorkbook)workbook).createFont();
Object fColor = sconfig.getFontColor();
if(fColor instanceof byte[]){
byte[] frgb = (byte[])fColor;
XSSFColor color1 = new XSSFColor(frgb,new DefaultIndexedColorMap());
style.setFillForegroundColor(color1);
}else{
short fIndex = (short)fColor;
if(fIndex == -1){
font.setColor(HSSFColorPredefined.BLACK.getIndex());
}else{
font.setColor(fIndex);
}
}
font.setFontHeightInPoints(sconfig.getHeight());
font.setFontName(sconfig.getFontName());
font.setBold(sconfig.getBlob());
style.setFont(font); return style;
}
} public CellStyle getDefaultStyle(){
if(version == 0){
HSSFCellStyle style = ((HSSFWorkbook)workbook).createCellStyle();
style.setBorderBottom(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);
style.setBorderTop(BorderStyle.THIN);
style.setAlignment(HorizontalAlignment.CENTER);
HSSFDataFormat format = ((HSSFWorkbook)workbook).createDataFormat();
style.setDataFormat(format.getFormat("@"));
style.setWrapText(true); HSSFFont font = ((HSSFWorkbook)workbook).createFont();
font.setFontHeightInPoints(sconfig.getHeight());
font.setFontName(sconfig.getFontName());
font.setBold(sconfig.getBlob()); style.setFont(font); return style;
}else{
XSSFCellStyle style = ((XSSFWorkbook)workbook).createCellStyle();
style.setBorderBottom(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);
style.setBorderTop(BorderStyle.THIN);
style.setAlignment(HorizontalAlignment.CENTER);
style.setWrapText(true);
XSSFDataFormat format = ((XSSFWorkbook)workbook).createDataFormat();
style.setDataFormat(format.getFormat("@")); XSSFFont font = ((XSSFWorkbook)workbook).createFont();
font.setFontHeightInPoints(sconfig.getHeight());
font.setFontName(sconfig.getFontName());
font.setBold(sconfig.getBlob());
style.setFont(font); return style;
}
}
}

结语

导出代码量比较大,贴出来两个比较核心的类,完整项目地址为:https://gitee.com/vvxtoys/vhelper

封装poi导出篇的更多相关文章

  1. 封装poi导入篇

    前言 有封装的想法好久了,项目中有不少地方需要使用导入功能,导入虽说不能,但是每次都要为了特定类写一个特定方法,很麻烦,我很讨厌一直写这种东西了,正好趁着这次机会就写一个可以解决这种问题的小项目. m ...

  2. 使用POI导出excel基础篇

    最近搞了下POI导出Excel,听说很多次,却是第一次搞. 在pom.xml中引入依赖 <dependency> <groupId>org.apache.poi</gro ...

  3. 重构:以Java POI 导出EXCEL为例

    重构 开头先抛出几个问题吧,这几个问题也是<重构:改善既有代码的设计>这本书第2章的问题. 什么是重构? 为什么要重构? 什么时候要重构? 接下来就从这几个问题出发,通过这几个问题来系统的 ...

  4. 使用Apache POI导出Excel小结--导出XLS格式文档

    使用Apache POI导出Excel小结 关于使用Apache POI导出Excel我大概会分三篇文章去写 使用Apache POI导出Excel小结--导出XLS格式文档 使用Apache POI ...

  5. poi导出excel

    Java使用poi组件导出excel报表,能导出excel报表的还可以使用jxl组件,但jxl想对于poi功能有限,jxl应该不能载excel插入浮动层图片,poi能很好的实现输出excel各种功能, ...

  6. POI导出EXCEL经典实现

    1.Apache POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能. .NET的开发人员则 ...

  7. Java POI 导出EXCEL经典实现 Java导出Excel

    转自http://blog.csdn.net/evangel_z/article/details/7332535 在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者 ...

  8. 重构:以Java POI 导出EXCEL为例2

    前言 上一篇博文已经将一些对象抽象成成员变量以及将一些代码块提炼成函数.这一节将会继续重构原有的代码,将一些函数抽象成类,增加成员变量,将传入的参数合成类等等. 上一篇博文地址:http://www. ...

  9. POI导出时写一份到ftp服务器,一份下载给客户端

    导语: 昨天接到项目经理这么一个需求,让我在POI导出Excel的时候写一份到我之前搭建的ftp服务器上.所以就有了这篇博客首先我们来分析下之前的业务逻辑:我们创建并构造了一个workbook,然后构 ...

随机推荐

  1. JVM 性能调优 -Xmx、-Xms、-Xss

    1. -Xmx  设置应用程序(不是JVM)内存可用大小 ( 如果程序要花很大内存的话,可以修改缺省配置,但是不能超过机器的内存),即最大可用Heap的大小. 2. -Xms  设置初始Heap的大小 ...

  2. switch_case注意事项

    1.switch 语句有至少一个 case 代码块和一个可选的 default 代码块. 这里的 switch 从第一个 case 分支比较 a 的值,值为 3 匹配失败.然后比较 4.匹配,所以从  ...

  3. 锋利的jQuery初学(1)

    引包: 1,首先将文件放进项目里面: 2,再在项目里面进行引用jQuery; (书写方式:<script src="jquery-x.xx.1.min.js">< ...

  4. 关于jstl中碰到的Property 'username' not found on type java.lang.String异常

    在jstl的forEach循环的时候总是有异常,刚开始以为是把类的属性名打错了,因为显示的是Property not found,但就算从类文件里面复制属性名过来依然显示的是Property not ...

  5. java jdk jre

    Java11新特性: https://www.cnblogs.com/eric-shao/p/10025180.html java的一些基本概念——java11.jdk.jre.jvm: https: ...

  6. 一个简单的定向python爬虫爬取指定页面的jpg图片

    import requests as r import re resul=r.get("http://www.imooc.com/course/list") urlinfo=re. ...

  7. django模型二

    django模型二 常用模型字段类型 IntegerField   →    int CharField   →   varchar TextField  →    longtext DateFiel ...

  8. 明令禁止下,哪些APP在违规获取用户信息?

    2019年4月28日消息  移动互联网时代各大APP大行其道,用户为了更便捷地享受互联网服务,常常需要让渡部分个人信息.在信息获取不透明的情况下,不少APP运营企业出现过度获取乃至违规获取用户信息的情 ...

  9. db2 varchar字段类型太大问题

    [DB2]SQL1585N 由于没有具有兼容页面大小的可用系统临时表空间,因此无法创建临时表.SQLSTATE=54048 自己写了一段SQL,SQL中包含ORDER BY 字句,但是在执行的时候报错 ...

  10. Go 常用命令

    Go 常用命令 含义 go run file_name.go