江湖开发者 | Java粉
网站地图
首页> Java> java导出Excel带下拉菜单-POI
2017
02-20

java导出Excel带下拉菜单-POI

java导出Excel带下拉菜单-POI

代码示列分为两种情况:


1.下拉数据少的情况

2.下拉数据多的情况(创建一个sheet页来存放下拉数据)

>.以行的方式存放下拉数据

>.以列的方式存放下拉数据


poi jar包下载:

链接: http://pan.baidu.com/s/1mhOPgZe 密码: 1xc2

import org.apache.poi.hssf.usermodel.DVConstraint;
import org.apache.poi.hssf.usermodel.HSSFDataValidation;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
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.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationHelper;
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;
	@RequestMapping("/test/excel")
	public String excel(HttpServletRequest request,HttpServletResponse response){
		System.out.println("Excel导出测试");
		/**
		 * 设置响应头
		 */
		try {
			response.setContentType("application/octet-stream;charset=iso-8859-1");
			response.setHeader("Content-Disposition", "attachment;filename="
					+ java.net.URLEncoder.encode("java江湖.xls", "UTF-8"));
			// 客户端不缓存
			//	response.addHeader("Pargam", "no-cache");
			//response.addHeader("Cache-Control", "no-cache");
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		Workbook book = new HSSFWorkbook();
		Sheet sheet = book.createSheet("Excel导出");
		//设置红色字体
		CellStyle redstyle = book.createCellStyle();
		HSSFFont red = (HSSFFont) book.createFont();
		red.setColor(HSSFColor.RED.index);
		redstyle.setFont(red);
		Row row = sheet.createRow(0);
		Cell createCell0 = row.createCell(0);
		createCell0.setCellValue("标题");     //第一列
		createCell0.setCellStyle(redstyle);
		Cell createCell1 = row.createCell(1);
		createCell1.setCellStyle(redstyle);
		createCell1.setCellValue("工单流水号");  //第二列
		Row ro = sheet.createRow(1);
		ro.createCell(0).setCellValue("EXCEL导出测试");
		ro = sheet.createRow(2);
		ro.createCell(1).setCellValue("000001");
		
		Cell createCell2 = row.createCell(2);
		createCell2.setCellStyle(redstyle);
		createCell2.setCellValue("下拉菜单");  //第三列
		
		/**
		 * 第三列 -下拉菜单
		 */
		String[] frames = {"spring","spring mvc","spring secruity","spring boot","hibernate","struts2","mybatis","jpa","shiro","lunce"};
		if(frames.length<255){
			//这种方式不会把下拉数据存放到sheet中,用于下拉数据少于255的情况
			sheet.addValidationData(setDataValidation(sheet, frames, 1, 1000, 2, 2)); 
		}else{
			/**
			 * 把下列菜单的数据存放到一个隐藏的sheet中
			 */
			
			//把下拉数据存放到隐藏sheet中的一行(两个方法选其一)
			createDataInRow(book,sheet,frames);
			//把下拉数据存放到隐藏sheet中的一列(两个方法选其一)
//			createDataInColumn(book,sheet,frames);
		}
		try {
			sheet.setColumnWidth((short) 0, (short) 4000); //设置宽度
			sheet.setColumnWidth((short) 1, (short) 4000);
			sheet.setColumnWidth((short) 2, (short) 4000);
			book.write(response.getOutputStream());
			OutputStream os = response.getOutputStream();
			os.flush();
			os.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
	/**
	 * 下拉列表元素不多的情况(255以内的下拉) 
	 * 这种方式不需要创建一个隐藏的sheet存放下拉数据
	 */
	private static DataValidation setDataValidation(Sheet sheet, String[] textList, int firstRow, int endRow, int firstCol, int endCol) {

        DataValidationHelper helper = sheet.getDataValidationHelper();
        //加载下拉列表内容
        DataValidationConstraint constraint = helper.createExplicitListConstraint(textList);
        //DVConstraint constraint = new DVConstraint();
        constraint.setExplicitListValues(textList);
        //设置数据有效性加载在哪个单元格上。四个参数分别是:起始行、终止行、起始列、终止列 
        //(org.apache.poi.ss.util.CellRangeAddressList;)
        CellRangeAddressList regions = new CellRangeAddressList((short) firstRow, (short) endRow, (short) firstCol, (short) endCol);
        //数据有效性对象
        DataValidation data_validation = helper.createValidation(constraint, regions);
        
        return data_validation;
    }
	/**
	 * 下拉元素很多的情况
	 */
	private static HSSFDataValidation SetDataValidation(String strFormula, 
	            int firstRow, int endRow, int firstCol, int endCol) {
        // 设置数据有效性加载在哪个单元格上。四个参数分别是:起始行、终止行、起始列、终止列
        CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
        DVConstraint constraint = DVConstraint.createFormulaListConstraint(strFormula);
        HSSFDataValidation dataValidation = new HSSFDataValidation(regions,constraint);
        dataValidation.createErrorBox("Error", "Error");
        dataValidation.createPromptBox("", null);
        return dataValidation;
	}
	/**
	 * 把下列数据存放到一行
	 * @param book
	 */
	
	private void createDataInRow(Workbook book,Sheet sheet,String[] frames){
		//创建一个隐藏的sheet 用于存放下拉菜单的数据
		Sheet hideSheet = book.createSheet("hideSheet");
		Row createRow = hideSheet.createRow(0);
		for(int i=0;i<frames.length;i++){
			createRow.createCell(i).setCellValue(frames[i]);
		}
		//1、设置有效性
        //String strFormula = "hideSheet!$A$1:$A$1000" ; //hideSheet第A1到A1000作为下拉列表来源数据
		String strFormula = "hideSheet!$A$1:$R$1"; //hideSheet第一行的 A列到R列
        //设置数据有效性加载在哪个单元格上,参数分别是:从hideSheet获取A1到A1000作为一个下拉的数据、起始行、终止行、起始列、终止列
		//2代表加载到第3列上
        sheet.addValidationData(SetDataValidation(strFormula, 1, 1000, 2, 2)); //下拉元素很多的情况
        
        //隐藏hideSheet
        book.setSheetHidden(book.getSheetIndex("hideSheet"), true);
	}
	
	/**
	 * 把下列数据存放到一列
	 * @param book
	 */
	private void createDataInColumn(Workbook book,Sheet sheet,String[] frames){
		//创建一个隐藏的sheet 用于存放下拉菜单的数据
		Sheet hideSheet = book.createSheet("hideSheet");
		int  columnIndex=0;  //第一列
		for(int i=0;i<frames.length;i++){
			
		    if(columnIndex==0){ //第一列
		    	Row createRow = hideSheet.createRow(i);
		    	createRow.createCell(columnIndex).setCellValue(frames[i]);
		    }else{ 
		    	//其它列,(此程序有一列下拉菜单)如果以经创建过行了,直接获取
		    	int rowCount = hideSheet.getLastRowNum();
		    	if(i<=rowCount){ ////前面创建过的行,直接获取行,创建列
		    		 hideSheet.getRow(i).createCell(columnIndex).setCellValue(frames[i]); //设置对应单元格的值
		    	}else{//未创建过的行,直接创建行、创建列
		    		 hideSheet.createRow(i).createCell(columnIndex).setCellValue(frames[i]); //设置对应单元格的值
		    	}
		    }
			
		}
		//1、设置有效性
        String strFormula = "hideSheet!$A$1:$A$1000" ; //hideSheet第A1到A1000作为下拉列表来源数据
        //设置数据有效性加载在哪个单元格上,参数分别是:从hideSheet获取A1到A1000作为一个下拉的数据、起始行、终止行、起始列、终止列
		//2代表加载到第3列上
        sheet.addValidationData(SetDataValidation(strFormula, 1, 1000, 2, 2)); //下拉元素很多的情况
        
        //隐藏hideSheet
        book.setSheetHidden(book.getSheetIndex("hideSheet"), true);
	}

效果图

1.png

2.png

3.png



Java江湖     
全部评论:

表情验证码,看不清楚,换一张

随机文章

云标签

公众号

微信

分享:分享我们的知识;专注:专注个人技术的提升;