`
duan10jun
  • 浏览: 22479 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jxl导出excel

阅读更多

 1.要做这个动态的东西首先要一个基础组整出来,然后对应着它把数据进行循环

	/**
	 * 导出日统计数据
	 * @return
	 */
	public String exportForDataDay(){
		try {
			getRequest().setCharacterEncoding("utf-8");
			getResponse().setCharacterEncoding("utf-8");
			getResponse().setContentType("application/x-download;charset=utf-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		String fname = Utils.getBytes(getRequest().getParameter("exportOss_date"));
		String filename = fname+"DataDay.xls";
		String filePath = getRequest().getRealPath("")+"/"+filename;
		String sessionKey = getRequest().getParameter("key");
		String title= getRequest().getParameter("title");
		sessionKey =Utils.getBytes(sessionKey);
		title = Utils.getBytes(title); 
		try {
			if(filePath == null || filePath.trim().length() < 1 || sessionKey == null || sessionKey.length() < 1){
				return LIST_ACTION;
			}
		    String[][] data = (String[][])getRequest().getSession().getAttribute(sessionKey); 
			if(exportFormatDD(filePath,title,data)){ 
				 getResponse().setHeader("Content-Disposition", "attachment;filename=" +filename);  
					OutputStream out = getResponse().getOutputStream();
					try { 	BufferedInputStream br = new BufferedInputStream(new FileInputStream(filePath));             
					byte[] buf = new byte[1024];             
					int len = 0;    
					while((len = br.read(buf)) >0)              
					out.write(buf,0,len); 
					} catch (IOException e) { 
						e.printStackTrace();
					}finally{
						if( out != null){
							out.flush(); 
							out.close();
						}
					}
					deleteFile(filePath);// 清楚缓存文件
			}else{
				return LIST_ACTION;
			}   
		} catch (IOException e) { 
		 e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 对日统计数据进行格式化输出到excel
	 * @param filePath 路径
	 * @param title sheet名称
	 * @param data excel内容
	 * @return 是否生成
	 */
	public boolean exportFormatDD(String filePath, String title, String[][] data) {
		try {
			if (data == null) {
				return false;
			}
			WritableWorkbook wbook = Workbook.createWorkbook(new File(filePath)); // 建立excel文件
			String tmptitle = title; // 标题
			if (tmptitle == null || tmptitle.trim().length() < 1)
				tmptitle = "OSS统计报表";
			WritableSheet wsheet = wbook.createSheet(tmptitle, 0); // sheet名称

			// 设置excel标题
			WritableFont wfont = new WritableFont(WritableFont.ARIAL, 12, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
			WritableCellFormat wcfFC = new WritableCellFormat(wfont);
			wcfFC.setAlignment(jxl.format.Alignment.CENTRE);
			wcfFC.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
			wcfFC.setBackground(Colour.ORANGE);
			wsheet.addCell(new Label(0, 0, tmptitle, wcfFC));
			wsheet.mergeCells(0, 0, 6, 0);
			//设置首行
			wfont = new jxl.write.WritableFont(WritableFont.ARIAL, 10, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
			wcfFC = new WritableCellFormat(wfont);
			wcfFC.setAlignment(jxl.format.Alignment.CENTRE);
			wcfFC.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
			
			wsheet.addCell(new Label(0, 1, data[0][0], wcfFC));//推广渠道
	        wsheet.setColumnView(0,20);
			wsheet.mergeCells(0, 1, 0, 2);
			
			wsheet.addCell(new Label(1, 1, data[0][1], wcfFC));//推广子渠道
	        wsheet.setColumnView(1,20);
			wsheet.mergeCells(1, 1, 0, 2);
			
			wsheet.addCell(new Label(2, 1, data[0][2], wcfFC));//业务类型
	        wsheet.setColumnView(2,10);
			wsheet.mergeCells(2, 1, 0, 2);
			
			wsheet.addCell(new Label(3, 1, "", wcfFC));//空白行
			wsheet.mergeCells(3, 1, 6, 1);
			
			wsheet.addCell(new Label(3, 2, data[0][3], wcfFC));//当日开通
	        wsheet.setColumnView(3,10);
			
			wsheet.addCell(new Label(4, 2, data[0][4], wcfFC));//当日展示
	        wsheet.setColumnView(4,10);
			
			wsheet.addCell(new Label(5, 2, data[0][5], wcfFC));//72H活跃用户量
	        wsheet.setColumnView(5,15);
			
			wsheet.addCell(new Label(6, 2, data[0][6], wcfFC));//72H独立展示用户量
	        wsheet.setColumnView(6,18);
	        Map<String, List<String[]>> detail = proceData(data);
	        detail.remove("子渠道名");
	        
	        Set<String> mySetD = new HashSet<String>();//存放最后合计用的D列单元格坐标
	        int row = 3;
	        
			WritableFont contentFont = new jxl.write.WritableFont(WritableFont.createFont("宋体"), 10, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
			WritableCellFormat contentCF = new WritableCellFormat(contentFont);
			contentCF.setAlignment(jxl.format.Alignment.RIGHT);
			contentCF.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
			
	        for (String strings : detail.keySet()) {
	        	List<String[]> list = detail.get(strings);
	        	wsheet.addCell(new Label(0, row, ((String[])list.get(0))[0], wcfFC));//推广渠道  : 企业名片(百阅)
	 	        wsheet.mergeCells(0, row, 0, row+list.size());
				for (String[] dataStrs : list) {
					int col = 0;
					for (int i=1;i<dataStrs.length;i++) {
						// 行数据
						if (col <= 1) {
							if (col==1) {//区分来显或者来显+点
								String last = dataStrs[1].substring(dataStrs[1].length()-1, dataStrs[1].length());
								if (last.equals("1")) {
									wsheet.addCell(new Label(col + 1, row, "来显", wcfFC));
								}else {
									wsheet.addCell(new Label(col + 1, row, "来显+点", wcfFC));
								}
							}else {
								wsheet.addCell(new Label(col + 1, row, dataStrs[i], wcfFC));
							}
						} else {
							wsheet.addCell(new jxl.write.Number(col + 1, row, Integer.valueOf(dataStrs[i].trim()), contentCF));
						}
						col++;
					}
					row++;
				}
		        //小计行
//				wfont = new jxl.write.WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
//				wcfFC = new WritableCellFormat(wfont);
//				wcfFC.setAlignment(jxl.format.Alignment.CENTRE);
//				wcfFC.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
//				wcfFC.setBackground(Colour.YELLOW);
				
		        wsheet.addCell(new Label(1, row , "小计" ));
		        wsheet.mergeCells(1, row , 2, row );
		        if (list.size()>1) {//应需求要求修改成特殊的小计
			        wsheet.addCell(new Formula(3, row, "SUM(D"+(row-(list.size()-1))+":D"+(row-(list.size()-1))+")", contentCF ));
			        wsheet.addCell(new Formula(4, row, "SUM(E"+(row-(list.size()-1))+":E"+(row-(list.size()-1))+")", contentCF ));
			        wsheet.addCell(new Formula(5, row, "SUM(F"+(row-(list.size()-1))+":F"+(row-(list.size()-1))+")", contentCF ));
			        wsheet.addCell(new Formula(6, row, "SUM(G"+(row-(list.size()-1))+":G"+(row-(list.size()-1))+")", contentCF ));
				}else {//正确的小计
			        wsheet.addCell(new Formula(3, row, "SUM(D"+(row-(list.size()-1))+":D"+(row)+")", contentCF ));
			        wsheet.addCell(new Formula(4, row, "SUM(E"+(row-(list.size()-1))+":E"+(row)+")", contentCF ));
			        wsheet.addCell(new Formula(5, row, "SUM(F"+(row-(list.size()-1))+":F"+(row)+")", contentCF ));
			        wsheet.addCell(new Formula(6, row, "SUM(G"+(row-(list.size()-1))+":G"+(row)+")", contentCF ));
				}
		        //添加需要合计的单元格
		        if (0==(row-(row-(list.size()-1)))) {
		        	mySetD.add(""+row);
				}else {
					mySetD.add(""+row);
					mySetD.add(""+(row-(list.size()-1)));
				}
		        row++;
			}

			wsheet.addCell(new Label(0, row, "来显合计", wcfFC));//来显合计		
			wsheet.mergeCells(0, row, 2, 1);
			wsheet.addCell(new Formula(3, row, "SUM("+makeXY("D",mySetD)+")", wcfFC));
			wsheet.addCell(new Formula(4, row, "SUM("+makeXY("E",mySetD)+")", wcfFC));
			wsheet.addCell(new Formula(5, row, "SUM("+makeXY("F",mySetD)+")", wcfFC));
			wsheet.addCell(new Formula(6, row, "SUM("+makeXY("G",mySetD)+")", wcfFC));
			
			//wsheet.addCell(new Label(0, data.length+3, "来显+点合计", wcfFC));//来显+点合计		
	        //wsheet.setColumnView(2,10);
			//wsheet.mergeCells(0, data.length+3, 2, 1);
			
			
			// 主体内容生成结束
			wbook.write(); // 写入文件
			wbook.close();
		} catch (Exception ex) {
			ex.printStackTrace();
			return false;
		}
		return true;
	}
	
	/**
	 * 拼接合计的单元格坐标
	 * @param string
	 * @param mySetD
	 * @return
	 */
	private String makeXY(String string, Set<String> mySetD) {
		StringBuilder xy = new StringBuilder("");
		for (String str : mySetD) {
			xy.append(","+string+str);
		}
		return xy.toString().substring(1);
	}
	
	/**
	 * 处理数据格式 
	 * @param data[企业名片(百阅A1), 100151, 来显/点, 15878, 81034, 1353028 , 123607 ] ;串1
	 *  		  [企业名片(百阅S2), 100154, 来显/点, 0, 0, 0 , 0 ];串2
	 * @return Map<10015, List[串1,串2]>
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public Map<String, List<String[]>> proceData(String data[][]){
		Map<String, List<String[]>> detail = new LinkedHashMap<String, List<String[]>>();
		for (String[] strings : data) {
			String key = strings[1].substring(0, strings[1].length()-1);
			if (detail.get(key)!=null) {
				List list = (List)detail.get(key);
				list.add(strings);
			}else {
				List<String[]> list = new ArrayList<String[]>();
				list.add(strings);
				detail.put(key, list);
			}
		}
		return detail;
	}

 

  • 大小: 112.4 KB
分享到:
评论

相关推荐

    jxl导出excel 完整例子工程

    jxl导出excel 完整例子工程jxl导出excel 完整例子工程jxl导出excel 完整例子工程 jxl导出excel 完整例子工程jxl导出excel 完整例子工程jxl导出excel 完整例子工程

    jxl导出excel加水印.zip

    本教程将详细介绍如何使用`jxl`库在导出Excel时添加水印,以及涉及的核心类`WritableWorkbook`、`WritableSheet`和`WritableCellFormat`。 `jxl`库提供了一套完整的API来操作Excel文件,包括创建新的工作簿、添加...

    jxl导出excel工具类

    总结起来,`jxl导出excel工具类`是一个强大的工具,它能够帮助开发者快速实现数据到Excel的导出功能,减少重复代码,提高开发效率。通过合理的封装和设计,可以使得这类工具类在不同的项目中重用,降低维护成本。...

    使用jxl导出Excel表的好例子

    在Java编程环境中,导出数据到Excel表格是一个常见的需求,特别是在数据分析、报表生成或数据交换时。`jxl`库是Java中一个广泛使用的库,它允许开发者方便地读取和写入Microsoft Excel文件。本篇文章将深入探讨如何...

    jxl导出excel总结

    《jxl导出Excel的深度解析与应用》 在信息化高度发展的今天,Excel作为数据处理和分析的重要工具,被广泛应用于各个领域。Java作为一种强大的编程语言,如何与Excel进行交互,成为了许多开发者关注的焦点。jxl库...

    java利用jxl生成excel文件

    Java使用JXL库生成Excel文件是一项常见的任务,特别是在数据处理、报表生成或导出时。JXL是一个开源的Java库,允许我们读取、写入和修改Excel文件。以下将详细讲解如何使用JXL库来生成Excel文件。 首先,我们需要在...

    jxl 导出 excel

    在Java编程环境中,JXL库是一个非常流行...总之,使用JXL库在Java中导出Excel文件是一项常见的任务,尤其在数据分析和报表生成场景下。通过熟悉JXL的API,你可以轻松地定制化Excel文件的格式和内容,满足各种业务需求。

    JXL导出Excel数据表

    通过这个库,我们可以方便地在程序中动态生成Excel工作表,包括设置单元格格式、添加公式以及处理图像等复杂操作。在描述中提到的"封装了一个简单易用、通用、动态的方法",指的是开发者可以通过自定义方法,根据...

    jxl导出Excel基础

    jxl导出Excel基础,非常有用的一个东西,漫漫看

    JXL导出excel的示例及文档

    在本示例中,我们将探讨如何使用JXL导出Excel以及JXL的API文档。 1. **JXL的基本用法** - **创建工作簿(Workbook)**: 使用`Workbook.createWorkbook()`方法创建一个新的Excel工作簿对象。 - **创建工作表...

    jxl导出excel文件简单示例

    标题中的“jxl导出excel文件简单示例”是指使用jxl库来创建和导出Excel文件的一个基本操作。jxl是一个Java库,它允许开发者读取、写入和修改Excel文件,尤其在处理批量数据时非常方便。在这个示例中,我们将探讨如何...

    jxl生成excel的通用方法

    使用jxl生成excel的通用方法,参数List&lt;?&gt;数据,LinkedHashMap,String&gt;实体类属性名和中文列名的键值对

    jxl导出excel.zip

    "jxl导出excel.zip"是一个包含工具类的压缩包,用于帮助开发者便捷地将数据导出为Excel格式,主要利用了JXL库。JXL是Java Excel API的一个简称,它是一个开源的Java库,支持读取、写入以及修改Microsoft Excel文件。...

    struts2+jxl导出excel

    在"struts2+jxl导出excel"的场景中,我们将讨论如何利用Struts2框架与JXL库配合,实现从web应用中导出数据到Excel的工作。 首先,我们需要理解Struts2的动作(Action)和结果(Result)。动作是处理用户请求的核心...

    利用JXL导出Excel的代码示例

    以下是一个基本的代码示例,展示了如何利用JXL导出Excel的步骤: 1. 创建工作簿对象: ```java WorkbookSettings ws = new WorkbookSettings(); // 如果需要设置编码(例如中文字符),可以这样: ws.set...

    jxl对excel添加水印(含有setWaterMarkImage方法).zip

    在Java编程环境中,处理Excel文件是一项常见的任务,特别是在数据导入导出、报表生成等领域。`jxl`库是一个广泛使用的开源库,它允许开发者用Java读取、写入和修改Excel文件。在这个特定的场景中,我们将探讨如何...

    java操作jxl生成excel的简化jar包

    自己封装的方法,调用 XlHelper.getXl(List&lt;?&gt; voList , Object head , OutputStream ops)方法,直接返回需要的excel,而不需要再去写jxl的方法。第一个参数voList 是excel里的内容,第二个参数head是excel表头。第...

    jxl导入导出excel

    本文将深入探讨如何使用JXL进行Excel的导入与导出。 一、JXL库介绍 JXL是一个开源的Java库,它支持读取和写入多种Excel文件格式,包括老版本的.BIFF8格式和较新的.XLSX格式。这个库不仅提供了对单元格、工作表和...

Global site tag (gtag.js) - Google Analytics