`
zhys513
  • 浏览: 26604 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

java poi3.7实现excel下拉联动

    博客分类:
  • Java
阅读更多
/**
 *  
 * @File name:  CreateExcelMoBusiness.java 
 * @Create on:  2011-02-12 11:48:453
 * @Author   :  zhys513
 * @ChangeList
 * ---------------------------------------------------
 * Date         Editor              ChangeReasons
 *
 */
 
import java.io.FileOutputStream;
import java.util.HashMap;

import org.apache.poi.hssf.usermodel.DVConstraint;
import org.apache.poi.hssf.usermodel.HSSFDataValidation;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Name;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddressList;
 
 
 

public class CreateExcelMoBusiness {

	private static String EXCEL_HIDE_SHEET_NAME = "excelhidesheetname"; 
	private static String HIDE_SHEET_NAME_SEX = "sexList";   
	private static String HIDE_SHEET_NAME_PROVINCE = "provinceList";  

	private HashMap map = new HashMap();
    //设置下拉列表的内容   
	private static String[] sexList = {"男","女"};   
	private static String[] provinceList = {"浙江","山东","江西","江苏","四川"};     
	private static String[] zjProvinceList = {"浙江","杭州","宁波","温州"};   
	private static String[] sdProvinceList = {"山东","济南","青岛","烟台"};   
	private static String[] jxProvinceList = {"江西","南昌","新余","鹰潭","抚州"};   
	private static String[] jsProvinceList = {"江苏","南京","苏州","无锡"};  
	private static String[] scProvinceList = {"四川","成都","绵阳","自贡"}; 
	
	public static void main(String[] args) {
		//使用事例
	    Workbook wb = new HSSFWorkbook();   
		createExcelMo(wb);
		creatExcelHidePage(wb);   
		setDataValidation(wb);  
        FileOutputStream fileOut;
		try {
			fileOut = new FileOutputStream("d://excel_template.xls");
	        wb.write(fileOut);   
	        fileOut.close();
		} catch (Exception e) { 
			e.printStackTrace();
		}   
	}
	public static void  createExcelMo(Workbook wb){
	        Sheet sheet = wb.createSheet("用户分类添加批导");   
	        // Create a row and put some cells in it. Rows are 0 based.   
	        Row row = sheet.createRow(0);   
	        Cell cell = row.createCell(0);   
	        cell.setCellValue("手机号码");   
	        cell.setCellStyle(getTitleStyle(wb));   
	        cell = row.createCell(1);   
	        cell.setCellValue("所属父类");   
	        cell.setCellStyle(getTitleStyle(wb));   
	        cell = row.createCell(2);   
	        cell.setCellValue("所属子类");   
	        cell.setCellStyle(getTitleStyle(wb));   
	        cell = row.createCell(3);   
	} 
    /**  
     * 设置模板文件的横向表头单元格的样式  
     * @param wb  
     * @return  
     */  
    private static CellStyle getTitleStyle(Workbook wb){   
        CellStyle style = wb.createCellStyle();   
        //对齐方式设置   
        style.setAlignment(CellStyle.ALIGN_CENTER);   
        //边框颜色和宽度设置   
        style.setBorderBottom(CellStyle.BORDER_THIN);   
        style.setBottomBorderColor(IndexedColors.BLACK.getIndex());   
        style.setBorderLeft(CellStyle.BORDER_THIN);   
        style.setLeftBorderColor(IndexedColors.BLACK.getIndex());   
        style.setBorderRight(CellStyle.BORDER_THIN);   
        style.setRightBorderColor(IndexedColors.BLACK.getIndex());   
        style.setBorderTop(CellStyle.BORDER_THIN);   
        style.setTopBorderColor(IndexedColors.BLACK.getIndex());   
        style.setFillBackgroundColor(IndexedColors.GREY_25_PERCENT.getIndex());   
        //设置背景颜色   
        style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());   
        style.setFillPattern(CellStyle.SOLID_FOREGROUND);   
        //粗体字设置   
        Font font = wb.createFont();   
        font.setBoldweight(Font.BOLDWEIGHT_BOLD);   
        style.setFont(font);   
        return style;   
    }  
    /**  
     * 设置模板文件的横向表头单元格的样式  
     * @param wb  
     * @return  
     */ 
    public static void creatExcelHidePage(Workbook workbook){   
        Sheet hideInfoSheet = workbook.createSheet(EXCEL_HIDE_SHEET_NAME);//隐藏一些信息   
        //在隐藏页设置选择信息   
        //第一行设置性别信息   
        Row sexRow = hideInfoSheet.createRow(0);   
        creatRow(sexRow, sexList);   
        //第二行设置省份名称列表   
        Row provinceNameRow = hideInfoSheet.createRow(1);   
        creatRow(provinceNameRow, provinceList);   
        //以下行设置城市名称列表   
        Row cityNameRow = hideInfoSheet.createRow(2);   
        creatRow(cityNameRow, zjProvinceList);   
        
        cityNameRow = hideInfoSheet.createRow(3);   
        creatRow(cityNameRow, sdProvinceList);   
           
        cityNameRow = hideInfoSheet.createRow(4);   
        creatRow(cityNameRow, jxProvinceList);   
           
        cityNameRow = hideInfoSheet.createRow(5);   
        creatRow(cityNameRow, jsProvinceList);   
           
        cityNameRow = hideInfoSheet.createRow(6);   
        creatRow(cityNameRow, scProvinceList);
        //名称管理   
        //第一行设置性别信息   
        creatExcelNameList(workbook, HIDE_SHEET_NAME_SEX, 1, sexList.length, false);   
        //第二行设置省份名称列表   
        creatExcelNameList(workbook, HIDE_SHEET_NAME_PROVINCE, 2, provinceList.length, false);   
        //以后动态大小设置省份对应的城市列表   
        creatExcelNameList(workbook, provinceList[0], 3, zjProvinceList.length, true);   
        creatExcelNameList(workbook, provinceList[1], 4, sdProvinceList.length, true);   
        creatExcelNameList(workbook, provinceList[2], 5, jxProvinceList.length, true);   
        creatExcelNameList(workbook, provinceList[3], 6, jsProvinceList.length, true);   
        creatExcelNameList(workbook, provinceList[4], 7, scProvinceList.length, true);   
        //设置隐藏页标志   
        workbook.setSheetHidden(workbook.getSheetIndex(EXCEL_HIDE_SHEET_NAME), true);   
    }  
    
    /**  
     * 创建一个名称  
     * @param workbook  
     */  
    private static void creatExcelNameList(Workbook workbook,String nameCode,int order,int size,boolean cascadeFlag){   
        Name name;   
        name = workbook.createName();   
        name.setNameName(nameCode);   
        name.setRefersToFormula(EXCEL_HIDE_SHEET_NAME+"!"+creatExcelNameList(order,size,cascadeFlag));   
    }   
    
    /**  
     * 名称数据行列计算表达式  
     * @param workbook  
     */  
    private static String creatExcelNameList(int order,int size,boolean cascadeFlag){   
        char start = 'A';   
        if(cascadeFlag){   
            start = 'B';   
            if(size<=25){   
                char end = (char)(start+size-1);   
                return "$"+start+"$"+order+":$"+end+"$"+order;   
            }else{   
                char endPrefix = 'A';   
                char endSuffix = 'A';   
                if((size-25)/26==0||size==51){//26-51之间,包括边界(仅两次字母表计算)   
                    if((size-25)%26==0){//边界值   
                        endSuffix = (char)('A'+25);   
                    }else{   
                        endSuffix = (char)('A'+(size-25)%26-1);   
                    }   
                }else{//51以上   
                    if((size-25)%26==0){   
                        endSuffix = (char)('A'+25);   
                        endPrefix = (char)(endPrefix + (size-25)/26 - 1);   
                    }else{   
                        endSuffix = (char)('A'+(size-25)%26-1);   
                        endPrefix = (char)(endPrefix + (size-25)/26);   
                    }   
                }   
                return "$"+start+"$"+order+":$"+endPrefix+endSuffix+"$"+order;   
            }   
        }else{   
            if(size<=26){   
                char end = (char)(start+size-1);   
                return "$"+start+"$"+order+":$"+end+"$"+order;   
            }else{   
                char endPrefix = 'A';   
                char endSuffix = 'A';   
                if(size%26==0){   
                    endSuffix = (char)('A'+25);   
                    if(size>52&&size/26>0){   
                        endPrefix = (char)(endPrefix + size/26-2);   
                    }   
                }else{   
                    endSuffix = (char)('A'+size%26-1);   
                    if(size>52&&size/26>0){   
                        endPrefix = (char)(endPrefix + size/26-1);   
                    }   
                }   
                return "$"+start+"$"+order+":$"+endPrefix+endSuffix+"$"+order;   
            }   
        }   
    } 
    
    /**  
     * 创建一列数据  
     * @param currentRow  
     * @param textList  
     */  
    private static void creatRow(Row currentRow,String[] textList){   
        if(textList!=null&&textList.length>0){   
            int i = 0;   
            for(String cellValue : textList){   
                Cell userNameLableCell = currentRow.createCell(i++);   
                userNameLableCell.setCellValue(cellValue);   
            }   
        }   
    }/**  
     * 添加数据验证选项  
     * @param sheet  
     */  
    public static void setDataValidation(Workbook wb){   
        int sheetIndex = wb.getNumberOfSheets();   
        if(sheetIndex>0){   
            for(int i=0;i<sheetIndex;i++){   
                Sheet sheet = wb.getSheetAt(i);   
                if(!EXCEL_HIDE_SHEET_NAME.equals(sheet.getSheetName())){
                	DataValidation data_validation_list = null;
                    //省份选项添加验证数据    
                	for(int a=2;a<3002;a++){
	                    data_validation_list = getDataValidationByFormula(HIDE_SHEET_NAME_PROVINCE,a,2);   
	                    sheet.addValidationData(data_validation_list);   
	                    //城市选项添加验证数据     
	                    data_validation_list = getDataValidationByFormula("INDIRECT(B"+a+")",a,3);   
	                    sheet.addValidationData(data_validation_list);   
	                    //性别添加验证数据     
	                    data_validation_list = getDataValidationByFormula(HIDE_SHEET_NAME_SEX,a,1);   
	                    sheet.addValidationData(data_validation_list);     
                	}
                }   
            }   
        }   
    }  
    /**  
     * 使用已定义的数据源方式设置一个数据验证  
     * @param formulaString  
     * @param naturalRowIndex  
     * @param naturalColumnIndex  
     * @return  
     */  
    private static DataValidation getDataValidationByFormula(String formulaString,int naturalRowIndex,int naturalColumnIndex){   
        //加载下拉列表内容     
        DVConstraint constraint = DVConstraint.createFormulaListConstraint(formulaString);    
        //设置数据有效性加载在哪个单元格上。     
        //四个参数分别是:起始行、终止行、起始列、终止列     
        int firstRow = naturalRowIndex-1;   
        int lastRow = naturalRowIndex-1;   
        int firstCol = naturalColumnIndex-1;   
        int lastCol = naturalColumnIndex-1;   
        CellRangeAddressList regions=new CellRangeAddressList(firstRow,lastRow,firstCol,lastCol);     
        //数据有效性对象    
        DataValidation data_validation_list = new HSSFDataValidation(regions,constraint);   
        //设置输入信息提示信息   
        data_validation_list.createPromptBox("下拉选择提示","请使用下拉方式选择合适的值!");   
        //设置输入错误提示信息   
        data_validation_list.createErrorBox("选择错误提示","你输入的值未在备选列表中,请下拉选择合适的值!");   
        return data_validation_list;   
    }   
    
    private static DataValidation getDataValidationByDate(int naturalRowIndex,int naturalColumnIndex){   
        //加载下拉列表内容     
        DVConstraint constraint = DVConstraint.createDateConstraint(DVConstraint.OperatorType.BETWEEN,"1900-01-01", "5000-01-01", "yyyy-mm-dd");    
        //设置数据有效性加载在哪个单元格上。     
        //四个参数分别是:起始行、终止行、起始列、终止列     
        int firstRow = naturalRowIndex-1;   
        int lastRow = naturalRowIndex-1;   
        int firstCol = naturalColumnIndex-1;   
        int lastCol = naturalColumnIndex-1;   
        CellRangeAddressList regions=new CellRangeAddressList(firstRow,lastRow,firstCol,lastCol);     
        //数据有效性对象    
        DataValidation data_validation_list = new HSSFDataValidation(regions,constraint);   
        //设置输入信息提示信息   
        data_validation_list.createPromptBox("日期格式提示","请按照'yyyy-mm-dd'格式输入日期值!");   
        //设置输入错误提示信息   
        data_validation_list.createErrorBox("日期格式错误提示","你输入的日期格式不符合'yyyy-mm-dd'格式规范,请重新输入!");   
        return data_validation_list;   
    }    
}

 该示例参考了网上的代码,只是把代码整合在了一起,添加了可测试的main方法方便测试,以便没有成功实现联动的朋友只要把类拷贝到自己的工程里并引入需要的包就能直接看到效果。生成的EXCEL文件放在D盘根目录。 

参考的版本 poi3.7  下载请到http://www.apache.org/下载最新版本

 

 来源:优特产     个人博客:优特品

分享到:
评论
4 楼 蒙奇奇846452787 2016-11-23  
您好,请教个问题 您这款导出  在excel2003上看没有问题,但在 2007以上更高版本的excel里 级联的下拉框 在excel中就不显示数据了  还请帮忙看看是哪方面出了问题
3 楼 294252623jyq 2015-01-08  
我原封不动的执行了代码,“所属父类”选择的情况下,“所属子类”全部是空的,不知道怎么回事~~
2 楼 liuqiao_0702 2012-06-25  
,我试了n级联动都可以的,一楼再试试,差点误导我
1 楼 heisq1an 2011-09-08  
这里面才是俩级关联。。如果是多级关联怎么做啊~~有例子吗~~想了好久都想不出来~~
heisq1an@163.COM

相关推荐

    Excel操作java后台poi3.7包

    标题提到的“Excel操作java后台poi3.7包”是指使用Apache POI 3.7版本来处理Excel文件的Java后端技术。 Apache POI项目始于2001年,旨在提供一种跨平台的方式来创建、修改和读取Microsoft Office文件。在3.7版本中...

    poi3.7(excel)

    【标题】"poi3.7(excel)"是一个关于使用Apache POI 3.7版本处理Excel文件的知识点。Apache POI是开源项目,专门用于Java应用程序读取和写入Microsoft Office格式的文件,特别是Excel(.xls)和Word(.doc)文档。 ...

    POI3.7Excel解析

    标题“POI3.7Excel解析”提示我们将重点讨论使用Apache POI 3.7版本处理Excel文件的相关知识点。 1. **Apache POI简介** Apache POI 是Apache软件基金会的一个项目,它提供了Java API,使得开发者可以使用Java处理...

    java POI 3.7

    总之,Java POI 3.7是一个强大的工具,它使Java开发者无需依赖Microsoft Office,就能方便地创建和处理Excel和Word文档。虽然现在有更新的版本提供更多的功能,但3.7版本仍然是许多项目中的可靠选择。通过熟练掌握...

    java_poi实现excel导入导出

    Java POI 实现 Excel 导入导出 Java POI 是一个流行的 Java 库,用于处理 Microsoft Office 文件格式,包括 Excel 文件。在本文中,我们将详细介绍如何使用 Java POI 实现 Excel 导入导出功能。 1. 什么是 Java ...

    POI3.7读写excel相关jar包

    标题提到的是"POI3.7读写excel相关jar包",这表明我们关注的是POI 3.7版本对于Excel文件的操作功能。 Apache POI 3.7是该项目的一个稳定版本,发布于2010年,它支持对Excel 97-2003 (.xls) 和 Excel 2007 (.xlsx) ...

    POI3.7 Eexcel的jar包

    POI3.7是该项目的一个版本,它提供了对Excel文件的强大支持。在这个压缩包中,包含了处理Excel文件所需的多个核心库和依赖库。 1. **poi-ooxml-schemas-3.7-20101029.jar**:这个库包含了Open XML(OOXML)的模式...

    poi3.7完整包

    1. **Apache POI 3.7**: 这个版本的POI主要关注于HSSF(Horrible Spreadsheet Format)和XSSF(XML Spreadsheet Format),分别用于处理旧版的BIFF8 Excel格式和OOXML的XLSX格式。通过POI,开发者可以创建新的Excel...

    poi3.7和对应依赖jar包操作excel

    Apache POI 是一款开源的Java库,用于读写Microsoft Office格式的文件,特别是Excel(.xls和.xlsx)文件。在给定的资源中,我们有五个相关的jar包,包括两个版本的poi-3.7.jar,两个不同部分的OOXML支持(poi-ooxml-...

    java-poi3.7

    这里的"java-poi3.7"指的是Java POI的3.7版本,它是一个较早的版本,但仍然被许多开发者用于处理Excel数据。 POI项目提供了API,使得开发者可以使用纯Java代码来操作Excel文件。在3.7版本中,主要包含以下几个关键...

    poi 3.7 jar包

    poi 3.7 jar包, 包括poi-3.7-20101029、poi-ooxml-3.7-20101029、poi-ooxml-schemas-3.7-20101029、poi-scratchpad-3.7-20101029

    poi3.7_jdk1.4 jar与poi3.7 api(chm)

    标题中的"poi3.7_jdk1.4 jar"指的是该版本的POI库已经过优化,能够兼容较旧的JDK 1.4版本,而官方推荐的最低版本是JDK 1.5。这对于那些仍使用较低JDK版本的项目来说是非常有益的。 "poi-3.7-jdk1.4-20110417-rc1....

    Java Poi3.7帮助文档 chm格式

    使用javadoc2chm制作,自己使用官方的文档制作而成,没有任何的关于页面。

    POI3.7用于处理word

    POI3.7用于处理word.POI3.7用于处理word

    poi3.7 3.8 3.9 3.10

    这里提到的"poi3.7 3.8 3.9 3.10"是指Apache POI的四个不同版本,每个版本都有其特定的改进和新特性。 1. **Apache POI 3.7**: - Apache POI 3.7 是一个较早的版本,发布于2011年。这个版本引入了一些基础功能,...

    Java 实现导出excel表 POI所需包

    本篇文章将深入讲解如何使用Apache POI在Java中实现Excel的导出功能。 首先,你需要在项目中引入Apache POI的相关依赖。Apache POI包含多个模块,对于处理Excel,主要涉及`poi-ooxml`和`poi-ooxml-schemas`这两个包...

    poi 3.7 jar 整合版 jar包 java读取excel文件

    描述中提到的"整合poi3.7所有jar包 能够完美的解析出2007和2003版本"意味着这个版本的POI能够兼容两种不同版本的Excel文件格式:.xls(2003及更早版本)和.xlsx(2007及更高版本)。.xlsx文件是基于Open XML标准的,...

    poi3.7 poi3.6解析excel2007全jar包

    "poi3.7 poi3.6解析excel2007全jar包"指的是包含了Apache POI 3.7和3.6版本中用于解析Excel 2007 (.xlsx)文件的所有必需的JAR库。 Apache POI 3.6 和 3.7 版本之间的主要区别可能在于修复了一些已知的bug,增加了新...

    Struts2+POI3.7做excel导入

    在本项目中,“Struts2+POI3.7做excel导入”意味着我们将利用Struts2的文件上传功能结合POI库,实现用户从网页上选择Excel文件并将其数据导入到系统中的功能。 首先,我们需要在Struts2的配置文件(struts.xml)中...

    poi3.7jar包

    标题“poi3.7jar包”指的是 Apache POI 的 3.7 版本的 JAR 文件,这是一个包含所有 POI 类和方法的可执行库。JAR(Java Archive)文件是 Java 平台的标准归档格式,它允许将多个类文件打包到单个文件中,便于分发和...

Global site tag (gtag.js) - Google Analytics