JAVA 导出 Excel,带多重表头

使用poi方式进行导出,可以进行多种设计

1.下载poi jar包

2.页面中制作一个按扭,其中代码如下

window.location.href = 'equipmentLedger.do?reqCode=exportExcel&temp_num='+temp_num+'&temp_head='+temp_head;

3. 在相应的java方法中写入如下代码

public ActionForward exportExcel(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		BaseActionForm aForm = (BaseActionForm) form;
		Dto inDto = aForm.getParamAsDto(request);
		String temp_num = inDto.getAsString("temp_num");// 二级标题序号
		String[] temp_head = inDto.getAsString("temp_head").split(",");// 二级标题名

		/**
		 * excel组织结构开始
		 */
		HSSFWorkbook wb = new HSSFWorkbook(); // 创建一个excel文件
		HSSFSheet sheet = wb.createSheet("sheet1");   // 创建了一个工作簿
		
		/***第一行样式start****/
		HSSFCellStyle style = wb.createCellStyle(); // 样式对象 
		//设置标题字体格式  
        HSSFFont font = wb.createFont();     
        //设置字体样式   
        font.setFontHeightInPoints((short)16);   //--->设置字体大小  
        font.setFontName("Courier New");   // 设置字体,是什么类型例如:宋体  
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);	// 字体加粗
        style.setFont(font);
//        style.setWrapText(true);	// 是否自动换行
        style.setBorderLeft((short)1);
        style.setBorderRight((short)1);
        style.setBorderBottom((short)1);
        style.setBorderTop((short)1);
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平  
        /***end****/
        
        
        /***第二行样式start****/
        HSSFCellStyle style2 = wb.createCellStyle(); // 样式对象
        HSSFFont font2 = wb.createFont();  
        font2.setFontHeightInPoints((short)13);   //--->设置字体大小  
        font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);	// 字体加粗
        style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平  
        style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 垂直局中
        style2.setBorderLeft((short)1);
        style2.setBorderRight((short)1);
        style2.setBorderBottom((short)1);
        style2.setBorderTop((short)1);
        style2.setFont(font2);
        /***end****/
        
        /***第三行样式start****/
        HSSFCellStyle style3 = wb.createCellStyle(); // 样式对象
        HSSFFont font3 = wb.createFont();  
        font3.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);	// 字体加粗
        style3.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平  
        style3.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 垂直局中
        style3.setBorderLeft((short)1);
        style3.setBorderRight((short)1);
        style3.setBorderBottom((short)1);
        style3.setBorderTop((short)1);
        style3.setFont(font3);
        /***end****/
        
        /** 表格第三行  start**/
        HSSFRow row3 = sheet.createRow(2);   // 创建一行 
        
        // 第三行第一列,第二行中进行合并,需要在第三行中把边框显示,否则边框显示不全
        HSSFCell cell3_1 = row3.createCell((short)0);   // 创建一个单元格  
        cell3_1.setCellStyle(style3);
        // 所有列
        for(int i = 1;i < temp_head.length; i++){
        	HSSFCell cell3_2 = row3.createCell((short)i);   // 创建一个单元格  
            cell3_2.setCellValue(temp_head[i-1]);
            cell3_2.setCellStyle(style3);
        }
        /** 表格第三行 end **/
        
        /** 表格第二行 start**/
        HSSFRow row2 = sheet.createRow(1);   // 创建一行  
        // 创建第二行所有用到的格子,然后把边框设为有边框,合并单元格也必须创建,不创建则不会有边框
        for(int i = 1;i < temp_head.length; i++){
        	HSSFCell cell = row2.createCell((short)i);   // 创建一个单元格  
        	cell.setCellStyle(style2);
        }
        
        // 跨两行表头
        sheet.addMergedRegion(new Region(1, (short) 0, 2, (short)0));  
        HSSFCell cell2_0 = row2.createCell((short)0);   // 创建一个单元格  
        cell2_0.setCellValue("序号");		// 缺省字段
        cell2_0.setCellStyle(style3);
        
        for(int i = 1;i < temp_head.length; i++) {
        	if(temp_head[i].equals("专用线单位名称")) {
        		sheet.addMergedRegion(new Region(1, (short) (i+1), 2, (short)(i+1)));  
        		HSSFCell cell = row2.createCell((short)(i+1));   // 创建一个单元格  
                cell.setCellValue(temp_head[i]);		// 缺省字段
                cell.setCellStyle(style3);
        	}
        	if(temp_head[i].equals("接轨点")) {
        		sheet.addMergedRegion(new Region(1, (short) (i+1), 2, (short)(i+1)));  
        		HSSFCell cell = row2.createCell((short)(i+1));   // 创建一个单元格  
                cell.setCellValue(temp_head[i]);		// 缺省字段
                cell.setCellStyle(style3);
        	}
        }
        
        // 判断股道名称是否存在
        // 创建两个变量,一个用来记录开始点,一个用来记录数量
        int startPoint = 0;
        int endCount = 0;
        for(int i = 1;i < temp_head.length; i++) {
        	if(temp_head[i].equals("股道名称")) {
        		// 如果查到,则记录开始
        		if(startPoint == 0) {
        			startPoint = i+1;
        		}
        		endCount ++;
        	} else if(temp_head[i].equals("股道长度")) {
        		if(startPoint == 0) {
        			startPoint = i+1;
        		}
        		endCount ++;
        	} else if(temp_head[i].equals("钢轨类型")) {
        		if(startPoint == 0) {
        			startPoint = i+1;
        		}
        		endCount ++;
        	} else if(temp_head[i].equals("专用线总延长公里")) {
        		if(startPoint == 0) {
        			startPoint = i+1;
        		}
        		endCount ++;
        	}
        }
        int count = startPoint + endCount - 1;
        if(count > 0) {
	        // 四个参数分别是:起始行,起始列,结束行,结束列 (拥有长度减一)
	        sheet.addMergedRegion(new Region(1, (short) startPoint, 1, (short) (count)));  
	        HSSFCell cell2_1 = row2.createCell((short)startPoint);
	        cell2_1.setCellValue("股道");
	        cell2_1.setCellStyle(style2);
        }
        
        int startPoint2 = 0;
        int endCount2 = 0;
        for(int i = 1;i < temp_head.length; i++) {
        	if(temp_head[i].equals("道岔编号")) {
        		// 如果查到,则记录开始
        		if(startPoint2 == 0) {
        			startPoint2 = i+1;
        		}
        		endCount2 ++;
        	} else if(temp_head[i].equals("左右开")) {
        		if(startPoint2 == 0) {
        			startPoint2 = i+1;
        		}
        		endCount2 ++;
        	} else if(temp_head[i].equals("岔枕类型")) {
        		if(startPoint2 == 0) {
        			startPoint2 = i+1;
        		}
        		endCount2 ++;
        	} else if(temp_head[i].equals("道岔型号")) {
        		if(startPoint2 == 0) {
        			startPoint2 = i+1;
        		}
        		endCount2 ++;
        	}
        }
        int count2 = startPoint2 + endCount2 - 1;
        
        if(count2 > 0) {
	        // 四个参数分别是:起始行,起始列,结束行,结束列 (拥有长度减一)
	        sheet.addMergedRegion(new Region(1, (short) startPoint2, 1, (short) (count2)));  
	        HSSFCell cell2_2 = row2.createCell((short)startPoint2);
	        cell2_2.setCellValue("道岔");
	        cell2_2.setCellStyle(style2);
        }
        /** 表格第二行 end**/
        
        /** 表格第一行(标题)合并数据根据第三行数据而定 **/
        HSSFRow row1 = sheet.createRow(0);   // 创建一行  
        // 四个参数分别是:起始行,起始列,结束行,结束列 (拥有长度减一)
        sheet.addMergedRegion(new Region(0, (short) 0, 0, (short) (temp_head.length-1)));  
        row1.setHeightInPoints(20);  // 行高
        HSSFCell cell1 = row1.createCell((short)0);   // 创建一个单元格  
        cell1.setCellStyle(style);  
        cell1.setCellValue("专用线设备台账");  
        // 创建第一行所有用到的格子,然后把边框设为有边框
        for(int i = 1;i < temp_head.length; i++){
        	HSSFCell cell = row1.createCell((short)i);   // 创建一个单元格  
        	cell.setCellStyle(style);
        }
        /** 表格第一行 end **/
        
        // 算法结束
        try{              
        	response.reset();
        	response.setContentType("application/msexcel;charset=UTF-8");
        	response.addHeader("Content-Disposition", "attachment;filename=\""
                    + new String(("专用线设备台账" + ".xls").getBytes("GBK"),
                            "ISO8859_1") + "\"");
            OutputStream out = response.getOutputStream();
        	
        	wb.write(out);
        	out.flush();
        	out.close();
        }catch(Exception e){  
            e.printStackTrace();  
        } 
		return mapping.findForward(null);
	}

poi基本使用方式为:

一个excel表格:

HSSFWorkbook wb = new HSSFWorkbook();

一个工作表格(sheet):

HSSFSheet sheet = wb.createSheet("测试表格");

一行(row):

HSSFRow row1 = sheet.createRow(0);

一个单元格(cell):

HSSFCell cell2 = row2.createCell((short)0)

单元格格式(cellstyle):

HSSFCellStyle style4 = wb.createCellStyle()

单元格内容格式()

HSSFDataFormat format= wb.createDataFormat();


 

猜你喜欢

转载自llyilo.iteye.com/blog/2267475