struts2 导出excel

做项目中需要用到导出excel的功能,记录一下。

1、使用jxl导出。

这个是从网上找的。这个不需要params inputName参数。

[java]  view plain copy
  1. @Action(value = "vsealFileDepts.export1", results = { @Result(name = "success", type = "stream") })  
  2.     // , params = {  
  3.     // "contentType", "text/html;charset=UTF-8" }  
  4.     // ,params={  
  5.     // "contentType","application/octet-stream",  
  6.     // "inputName","fileInputStream",  
  7.     // "contentDisposition","attachment;filename=${fileName}.xls",  
  8.     // "bufferSize","1024"  
  9.     // }  
  10.     public String export1() throws Exception {  
  11.   
  12.         HttpServletResponse response = ServletActionContext.getResponse();  
  13.         // 定义request ,response.  
  14.         // 查询下载附件.  
  15.         // 设置下载头信息.begin  
  16.         response.setCharacterEncoding("UTF-8");  
  17.         response.setContentType("application/vnd.ms-excel");  
  18.         response.setHeader("Content-Disposition""attachment; filename="  
  19.                 + new String("用户通讯录.xls".getBytes("GB2312"), "iso8859-1"));  
  20.         response.setHeader("Pragma""No-cache");  
  21.         response.setHeader("Cache-Control""No-cache");  
  22.         response.setDateHeader("Expires"0);  
  23.         // 这个地方一定要进行编码的转换要不然中文字符会出现乱码.  
  24.         // 设置下载头信息.end,  
  25.         OutputStream output = null;  
  26.         InputStream fis = null;  
  27.         try {  
  28.             output = response.getOutputStream();  
  29.             jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(output);  
  30.             jxl.write.WritableSheet ws = wwb.createSheet("用户通讯录"0);  
  31.             // 设置标题.ws.addCell(new jxl.write.Label(列, 行, 内容.));  
  32.             ws.addCell(new Label(00"编号"));  
  33.             ws.addCell(new Label(10"登录名称"));  
  34.             ws.addCell(new Label(20"联系人"));  
  35.             ws.addCell(new Label(30"电话"));  
  36.             ws.addCell(new Label(40"email"));  
  37.             ws.addCell(new Label(50"单位名称"));  
  38.             ws.addCell(new Label(60"单位邮编"));  
  39.             ws.addCell(new Label(70"单位地址"));  
  40.             // 设置显示长度.  
  41.             ws.setColumnView(115);  
  42.             // 登录名长度  
  43.             ws.setColumnView(215);  
  44.             ws.setColumnView(315);  
  45.             ws.setColumnView(420);  
  46.             ws.setColumnView(520);  
  47.             ws.setColumnView(620);  
  48.             ws.setColumnView(720);  
  49.             ws.setColumnView(840);  
  50.             int i = 1;  
  51.             List list1 = new ArrayList();  
  52.             for (int j = 0; j < list1.size(); j++) {  
  53.                 User user = (User) list1.get(j);  
  54.                 ws.addCell(new jxl.write.Number(0, i + 1, i));  
  55.                 // 这里设置是自增的序号而不是ID号.也可以改成ID号.  
  56.                 // ws.addCell(new jxl.write.Label(1, i + 1, ""  
  57.                 // + user.getUserId()));  
  58.                 ws.addCell(new Label(1, i + 1"" + user.getAddress()));  
  59.                 // 登录名  
  60.                 ws.addCell(new Label(2, i + 1"" + user.getAddress()));  
  61.                 // 联系人  
  62.                 ws.addCell(new Label(3, i + 1"" + user.getPhone()));  
  63.                 // 联系电话.  
  64.                 ws.addCell(new Label(4, i + 1"" + user.getEmail()));  
  65.                 // email.  
  66.                 if (null != user.getAddress()) {  
  67.                     ws.addCell(new Label(5, i + 1"" + user.getAddress()));  
  68.                     if (user.getAddress() != null) {  
  69.                         ws.addCell(new Label(6, i + 1"" + user.getAddress()));  
  70.                     } else {  
  71.                         ws.addCell(new Label(6, i + 1""));  
  72.                         // 增加邮编为""的判断.因为这个是Integer的类型.  
  73.                     }  
  74.                     ws.addCell(new Label(7, i + 1"" + user.getAddress()));  
  75.                 } else {  
  76.                     ws.addCell(new Label(5, i + 1""));  
  77.                     ws.addCell(new Label(6, i + 1""));  
  78.                     ws.addCell(new Label(7, i + 1""));  
  79.                 }  
  80.                 i++;  
  81.             }  
  82.             wwb.write();  
  83.             wwb.close();  
  84.         } catch (Exception e) {  
  85.             System.out.println("Error!");  
  86.             e.printStackTrace();  
  87.         } finally {// 正常关闭输入输出流.  
  88.             try {  
  89.                 if (fis != null) {  
  90.                     fis.close();  
  91.                     fis = null;  
  92.                 }  
  93.             } catch (Exception e) {  
  94.                 e.printStackTrace();  
  95.             }  
  96.             try {  
  97.                 if (output != null) {  
  98.                     output.close();  
  99.                     output = null;  
  100.                 }  
  101.             } catch (Exception e) {  
  102.                 e.printStackTrace();  
  103.             }  
  104.         }  
  105.         return null;  
  106.     }  

前端jsp页面能调用这个action即可。

2、使用poi导出。

这种方法必须要使用struts2的注解中的params  inputName 参数。

首先在action中声明变量,并写明get/set方法

因为是自己项目的代码,所以不便放出这里还是只放出关键代码,poi的生成写的有点乱,因为需要针对特定excel做排版美化的处理,所以就没有单独封装到一个工具类去生成,后面再想想这块。

@Results(value = {
		@Result(name = "depositExcel", type = "stream", params = {  
	            "contentType", "application/vnd.ms-excel", "inputName",  
	            "excelFile", "contentDisposition",  
	            "attachment;filename=${filename}.xls", "bufferSize", "1024" }),
        @Result(name = "returnExcel", type = "stream", params = { "contentType",
				"application/vnd.ms-excel", "contentDisposition",
				"attachment;filename=${filename}.xls", "inputName",
				"excelFile" }),
		@Result(name = "balanceExcel", type = "stream", params = { "contentType",
				"application/vnd.ms-excel", "contentDisposition",
				"attachment;filename=${filename}.xls", "inputName",
				"excelFile" })
})
这里的文件名是在方法中初始化的,返回的时候就可以取到想要的文件名了,注意这里的文件名要编码成ISO8859-1,不然下载的文件会缺少文件名或文件名乱码。
private InputStream excelFile;
	public InputStream getExcelFile() {
		return excelFile;
	}

	public void setExcelFile(InputStream excelFile) {
		this.excelFile = excelFile;
	}
	
	private String filename;
	
    public String getFilename() {
    	 String encodeFileName = null;
         try {  
        	 encodeFileName = new String(filename.getBytes(),  
                     "ISO8859-1");  
         } catch (UnsupportedEncodingException e) {  
             e.printStackTrace();  
         }  
         return encodeFileName;  
	}

	public void setFilename(String filename) {
		this.filename = filename;
	}


/**
	 * 导出入住明细报表
	 * @return
	 * @throws UnsupportedEncodingException 
	 */
	public String exportDepositReport() throws UnsupportedEncodingException{
		String inDateStartStr=this.getRequest().getParameter("inDateStart");
		String inDateEndStr=this.getRequest().getParameter("inDateEnd");
		StayDormQueryVO vo=new StayDormQueryVO();
		if(StringUtils.isNotBlank(inDateStartStr)&&StringUtils.isNotBlank(inDateEndStr)){
			DateTime inDateStart = new DateTime(inDateStartStr);
			DateTime inDateEnd = new DateTime(inDateEndStr); 
			vo.setInDateStart(inDateStart.getDate());
			vo.setInDateEnd(inDateEnd.getDate());
		}else{
			DateTime inDateEnd = new DateTime();
			//减一个月
			inDateEnd.plusMonth(-1);
			vo.setInDateStart(inDateEnd.getDate());
			vo.setInDateEnd(new Date());
		}
		List<StayDormListVO> dormListVOs=this.stayDormService.findDepositReport(vo);

		HSSFWorkbook wb = new HSSFWorkbook();
		HSSFSheet sheet = wb.createSheet("first sheet");
		wb.createSheet("second sheet");
		 sheet.setColumnWidth( (short) 0, (short) ( 4*50*32) );
		 sheet.setColumnWidth( (short) 1, (short) ( 4*50*32) );
		 sheet.setColumnWidth( (short) 2, (short) ( 4*50*32) );
		 sheet.setColumnWidth( (short) 3, (short) ( 4*50*32) );
		 
		//字体
		  HSSFFont fontTitle=wb.createFont();
		  fontTitle.setFontHeightInPoints((short)14);			//字体大小
		  fontTitle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);		//字体粗
		  HSSFFont fonttext=wb.createFont();
		  fonttext.setFontHeightInPoints((short)12);			//字体大小
		//  fonttext.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		  HSSFFont fontTitle2=wb.createFont();
		  fontTitle2.setFontHeightInPoints((short)13);			//教师的字体大小
		  HSSFFont fontTable=wb.createFont();
		  fontTable.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);		//字体粗
		  fontTable.setFontHeightInPoints((short)14);			//字体大小
			
		  HSSFFont fontTableClass=wb.createFont();
		  fontTableClass.setFontHeightInPoints((short)14);			//字体大小
		  HSSFCellStyle cellStyle = wb.createCellStyle();   
			cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中    
			cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
			cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
			cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
			cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
			cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中    
			cellStyle.setWrapText(true);
			cellStyle.setFont(fontTitle);
			cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
			
			  HSSFCellStyle cellStyle2 = wb.createCellStyle();   
				cellStyle2.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中    
				cellStyle2.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
				cellStyle2.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
				cellStyle2.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
				cellStyle2.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
				cellStyle2.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中    
				cellStyle2.setWrapText(true);
				cellStyle2.setFont(fonttext);
				cellStyle2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
				
				  HSSFRow rows = sheet.createRow(0);
				  sheet.addMergedRegion(new CellRangeAddress(
				            0, //first row (0-based)
				            0, //last row  (0-based)
				            0, //first column (0-based)
				            3  //last column  (0-based)
				    ));
				 
				  rows.createCell(0).setCellValue("入住明细统计结果("+inDateStartStr+"  "+inDateEndStr+")");
				  rows.getCell(0).setCellStyle(cellStyle);
				  rows.setHeightInPoints((float) 30);//行高
		 HSSFRow row = sheet.createRow(1);
		 row.createCell(0).setCellValue("员工");
		 row.createCell(1).setCellValue("姓名");
		 row.createCell(2).setCellValue("押金金额");
		 row.createCell(3).setCellValue("时间");
		 row.getCell(0).setCellStyle(cellStyle);
		 row.getCell(1).setCellStyle(cellStyle);
		 row.getCell(2).setCellStyle(cellStyle);
		 row.getCell(3).setCellStyle(cellStyle);
		
		  row.setHeightInPoints((float) 30);//行高
		  double totalDeposit=0.00;
		  if(dormListVOs!=null){
			  int j=0;
			  for(int i=0;i<dormListVOs.size();i++){
				  	 dormListVOs.get(i).setInDateStr(dormListVOs.get(i).getInDate());
					 totalDeposit+=dormListVOs.get(i).getDeposit();
					 HSSFRow row2 = sheet.createRow(i+2);
					 row2.createCell(0).setCellValue(dormListVOs.get(i).getUserNo());
					 row2.createCell(1).setCellValue(dormListVOs.get(i).getName());
					 row2.createCell(2).setCellValue(dormListVOs.get(i).getDeposit());
					 row2.createCell(3).setCellValue(dormListVOs.get(i).getInDateStr());
					 row2.getCell(0).setCellStyle(cellStyle2);
					 row2.getCell(1).setCellStyle(cellStyle2);
					 row2.getCell(2).setCellStyle(cellStyle2);
					 row2.getCell(3).setCellStyle(cellStyle2);
					 j++;
				 }
			  HSSFCellStyle cellStyle3 = wb.createCellStyle();   
			  cellStyle3.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中    
			  cellStyle3.setWrapText(true);
			  cellStyle3.setFont(fontTitle);
			  cellStyle3.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
			  HSSFRow row3 = sheet.createRow(j+2);
			  row3.createCell(3).setCellValue("总计:"+totalDeposit);
			  row3.getCell(3).setCellStyle(cellStyle3);
		  }
		  
		  ByteArrayOutputStream baos = new ByteArrayOutputStream();
		  try {
			wb.write(baos);
			baos.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		  this.filename=inDateStartStr+"至"+inDateEndStr+"入住明细统计报表";
		  
		 excelFile = new ByteArrayInputStream(baos.toByteArray());
		 return "depositExcel";
	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值