java 操作 Excel ——WritableWorkbook

/**
	 * 三层级打印
	 * @author jq.Li
	 * @date Feb 13, 20196:59:41 PM
	 * 
	 * @param bt 底部显示的名称:"Sheet1"
	 * @param fileName 导出文件的名称;
	 * @param Title 列名;
	 * @param name  数据Map分装对应的Key;
	 * @param listContent 打印数据集合(需要拆封,涉及到单元格合并数量),格式定义好的
	 * @param response
	 * @return
	 */
	public final static String exportExcel(String bt,String fileName, String[] Title,
			String[] name, List<Object> listContent, 
			HttpServletResponse response) {
		String result = "系统提示:Excel文件导出成功!";
		// 以下开始输出到EXCEL
		try {
			// 定义输出流,以便打开保存对话框______________________begin
			OutputStream os = response.getOutputStream();// 取得输出流
			response.reset();// 清空输出流
			//response.setContentType("application/octet-stream; charset=UTF-8");
			fileName=fileName+new SimpleDateFormat("yyyyMMddHH:mm:ss").format(new Date())+".xls";
			response.setHeader("Content-disposition", "attachment; filename="
					+ new String(fileName.getBytes("GB2312"), "ISO8859-1"));
			// 设定输出文件头
			response.setContentType("application/msexcel");// 定义输出类型
			// 定义输出流,以便打开保存对话框_______________________end

			/** **********创建工作簿************ */
			WritableWorkbook workbook = Workbook.createWorkbook(os);

			/** **********创建工作表************ */
			WritableSheet sheet = workbook.createSheet(bt, 0);
			/** **********设置纵横打印(默认为纵打)、打印纸***************** */
			jxl.SheetSettings sheetset = sheet.getSettings();
			sheetset.setProtected(false);
			/** ************设置单元格字体************** */
			WritableFont NormalFont = new WritableFont(WritableFont.ARIAL, 10);
			WritableFont BoldFont = new WritableFont(WritableFont.ARIAL, 10,
					WritableFont.BOLD);
			/** ************以下设置两种种单元格样式,灵活备用************ */
			// 用于标题居中
			WritableCellFormat wcf_center = new WritableCellFormat(BoldFont);
			wcf_center.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条
			wcf_center.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
			wcf_center.setAlignment(Alignment.CENTRE); // 文字水平对齐
			wcf_center.setWrap(false); // 文字是否换行
			// 用于正文居左
			WritableCellFormat wcf_left = new WritableCellFormat(NormalFont);
			wcf_left.setBorder(Border.NONE, BorderLineStyle.THIN); // 线条
			wcf_left.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
			wcf_left.setAlignment(Alignment.LEFT); // 文字水平对齐
			wcf_left.setWrap(false); // 文字是否换行

			/** ***************以下是EXCEL开头大标题,暂时省略********************* */
			// sheet.mergeCells(0, 0, colWidth, 0);
			// sheet.addCell(new Label(0, 0, "XX报表", wcf_center));
			/** ***************以下是EXCEL第一行列标题********************* */
			for (int i = 0; i < Title.length; i++) {
				sheet.addCell(new Label(i, 0, Title[i], wcf_center));
			}
			/** ***************以下是EXCEL正文数据********************* */
			
			// 0.根据下面需要的数据定义集合
			List hyDataList = new ArrayList(); // 行业数据集合
			List hyXlDataList = new ArrayList(); // 行业小类数据集合
			int hyHyxlCount=0; // 某个行业下的小类数量
			int hyAllXlCount=0; // 全部的行业小类数量
			int hyLastXlCount=0;// 当前循环的之前的所有行业小类数量
			// 1.拆分 listContent   
			for (int i = 0; i < listContent.size(); i++) {
				// { CONTENT=分局, xlList= [] }
				Map map = (Map) listContent.get(i);
				if(map!=null){
					hyDataList = (List)map.get("xlList");
					if(hyDataList!=null&&hyDataList.size()>0){
						for (int j = 0; j < hyDataList.size(); j++) {
							// { CONTENT=某行业, xlList=[]}
							Map map2 = (Map) hyDataList.get(j);
							if(map2!=null&&map2.size()>0){
								hyXlDataList = (List)map2.get("xlList");
								if(hyXlDataList!=null){
									for (int k = 0; k < hyXlDataList.size(); k++) {
										hyAllXlCount++;
										// 真正要导出的数据内容: { CONTENT=特大型 }
										Map map3 = (Map) hyXlDataList.get(k);
										// 2.绘制好Excel固定格式的 Label( column<x轴>, row<y轴>, value )
										// 绘制区域:分局
										sheet.addCell(new Label(0, hyAllXlCount, 
												map.get("CONTENT")==null?"":""+map.get("CONTENT"), wcf_left));
										// 绘制行业大类:行业
										sheet.addCell(new Label(1, hyAllXlCount, 
												map2.get("CONTENT")==null?"":""+map2.get("CONTENT"), wcf_left));
										for(int s=2;s<name.length;s++){
											// 绘制行业小类:特大型
											sheet.addCell(new Label(s, hyAllXlCount, map3.get(name[s])==null?"":""+map3.get(name[s]),wcf_left));
										}
									}
									sheet.mergeCells(1, 1+hyHyxlCount, 1, hyHyxlCount+hyXlDataList.size());
									hyHyxlCount+=hyXlDataList.size();
								}
							}
						}
					}
				}
				
				// 合并单元格,
				// 第一个参数:要合并的单元格最左上角的列号,
				// 第二个参数:要合并的单元格最左上角的行号,
				// 第三个参数:要合并的单元格最右角的列号,
				// 第四个参数:要合并的单元格最右下角的行号,
				sheet.mergeCells(0, 1+hyLastXlCount, 0, hyAllXlCount);
				hyLastXlCount=hyAllXlCount;
				
				
			}
			
			/** **********将以上缓存中的内容写到EXCEL文件中******** */
			workbook.write();
			/** *********关闭文件************* */
			workbook.close();

		} catch (Exception e) {
			result = "系统提示:Excel文件导出失败,原因:" + e.toString();
			System.out.println(result);
			e.printStackTrace();
		}
		return result;
	}

注:数据格式

map{
	CONTENT=江干分局, 
	xlList=[
		{ CONTENT=餐饮行业, 
		  xlList=[
				{CONTENT=特大型(>3000M2)}, 
			]
		}
	]
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值