加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

flex AdvanceDatagrid 通用导出到excel

发布时间:2020-12-15 04:39:16 所属栏目:百科 来源:网络整理
导读:先说说思路:flex端把表头(包含:dataField、headText、children)组织成json格式传到后台。后台提供ListMapString,Object格式的数据源(Map的key值和dataField一一对应)调用通用导出模块。 下面上代码: 前台提供的json: [{"children":"","dataField":"i

先说说思路:flex端把表头(包含:dataField、headText、children)组织成json格式传到后台。后台提供List<Map<String,Object>>格式的数据源(Map的key值和dataField一一对应)调用通用导出模块。

下面上代码:

前台提供的json:

[{"children":"","dataField":"index","headerText":"序号"},{"children":[{"children":"","dataField":"name","headerText":"昵称"},{"children":"","dataField":"userName","headerText":"用户名"}],"dataField":"","headerText":"用户信息"},"dataField":"requestUri","headerText":"URI"},"dataField":"ip","headerText":"IP"},"dataField":"accessDate","headerText":"日期"}]

通过调用servlet传到后台

package?com.sddl.action;

import?java.io.IOException;
import?java.io.InputStream;
import?java.io.OutputStream;
import?java.util.List;
import?java.util.Map;

import?javax.servlet.ServletException;
import?javax.servlet.http.HttpServlet;
import?javax.servlet.http.HttpServletRequest;
import?javax.servlet.http.HttpServletResponse;

import?net.sf.json.JSONArray;
import?org.springframework.util.StringUtils;

import?com.sddl.bean.ExpSimpleAdvanceDataGridBean;
import?com.sddl.util.Tool;

public?class?ExpSimpleAdvanceDataGridAction?extends?HttpServlet?{
	private?static?final?long?serialVersionUID?=?1L;
	public?void?service(HttpServletRequest?req,?HttpServletResponse?rep)
			throws?ServletException,?IOException?{
		rep.setContentType("text/xml;charset=utf-8");
		
		String?tmp?=?req.getParameter("header");//前台传过来的json表头
		JSONArray?ja?=?JSONArray.fromObject(tmp);
		
		List<Map<String,?Object>>?dataProvideList?=?DAO.findAll("from?LogBook");//伪代码。。。
		ExpSimpleAdvanceDataGridBean?bean?=?new?ExpSimpleAdvanceDataGridBean(ja);
		bean.setExcelHeaderTitle("日志列表");//表头
		bean.setWorkSheetTitle("日志");//sheet?name
		bean.setDataProvideList(dataProvideList);
		//bean.getExcelInputStream();
		
		InputStream?in?=?bean.getExcelInputStream();
		OutputStream?out?=?rep.getOutputStream();
		byte[]?by?=?new?byte[1024];
		int?len?=?-1;
		while((len=in.read(by))!=-1){
			out.write(by,?0,?len);
		}
		in.close();
		out.close();
	}
	
	private?String?checkString(String?str){
		if(StringUtils.hasLength(str)?&&?!str.trim().equals("null"))
			return?str;
		return?null;
	}
}
package?com.sddl.bean;

import?java.io.ByteArrayInputStream;
import?java.io.ByteArrayOutputStream;
import?java.io.InputStream;
import?java.text.DecimalFormat;
import?java.util.ArrayList;
import?java.util.HashMap;
import?java.util.List;
import?java.util.Map;
import?java.util.regex.Pattern;

import?org.springframework.util.StringUtils;

import?com.sddl.util.Tool;

import?net.sf.json.JSONArray;
import?net.sf.json.JSONObject;

import?jxl.Workbook;
import?jxl.format.Alignment;
import?jxl.format.VerticalAlignment;
import?jxl.write.Label;
import?jxl.write.Number;
import?jxl.write.WritableCellFormat;
import?jxl.write.WritableFont;
import?jxl.write.WritableSheet;
import?jxl.write.WritableWorkbook;

public?class?ExpSimpleAdvanceDataGridBean?{
	private?List<AdvanceDataGridColumnBean>?headerList;
	private?List<Map<String,?Object>>?dataProvideList;
	private?String?excelHeaderTitle;
	private?String?workSheetTitle;
	private?int?maxLevel;
	
	Map<String,?Integer>?maxLevelMap?=?new?HashMap<String,?Integer>();
	public?ExpSimpleAdvanceDataGridBean(JSONArray?ja){
		this.headerList?=?getHeaderList(ja,?null);
		maxLevelMap.put("level",?0);
		getMaxLevel(ja);
		this.maxLevel?=?maxLevelMap.get("level");
	}
	
	public?InputStream?getExcelInputStream()?{
		ByteArrayOutputStream?out?=?new?ByteArrayOutputStream();
		exportPassedData(out);
		return?new?ByteArrayInputStream(out.toByteArray());
	}	

	WritableCellFormat?format1?=?null;
	Map<String,?RowColumnBean>?rangeMap?=?null;
	private?void?exportPassedData(ByteArrayOutputStream?os)?{
		try?{
			????WritableWorkbook?workbook?=?Workbook.createWorkbook(os);
			
			????//定义格式
			????WritableFont?font?=?new?WritableFont(WritableFont.TIMES,?14,?WritableFont.BOLD);
		????????WritableCellFormat?format?=?new?WritableCellFormat(font);
		????????format.setAlignment(Alignment.CENTRE);

??		????????WritableFont?font1?=?new?WritableFont(WritableFont.TIMES,?10,?WritableFont.BOLD);
		????????format1?=?new?WritableCellFormat(font1);
		????????format1.setVerticalAlignment(VerticalAlignment.CENTRE);
		????????format1.setAlignment(Alignment.CENTRE);

		????????WritableCellFormat?format4?=?new?WritableCellFormat();
		????????format4.setAlignment(Alignment.LEFT);
		????????format4.setVerticalAlignment(VerticalAlignment.BOTTOM);
		????????format4.setWrap(false);
		??????
		????????WritableSheet?sheet?=?workbook.createSheet(workSheetTitle,?0);
		??????
		????????Label?labelTitle?=?new?Label(0,?excelHeaderTitle,?format);
		????????
		????????int?columnIndex?=?0;
		????????int?rowIndex?=?1;
		????????rangeMap?=?getRangeList(headerList,?columnIndex,?rowIndex);
		????????setLabel(sheet,?headerList,?rowIndex);

		????????//设置表头的长度
		????????for?(AdvanceDataGridColumnBean?columnBean:?headerList)?{
		????????	columnIndex?+=?columnBean.getColumnSize();
		????????}
		????????sheet.mergeCells(0,?columnIndex?-?1,?0);
		????????sheet.addCell(labelTitle);

		????????Pattern?pa?=?Pattern.compile("[0-9.]*");
		????????rowIndex?=?maxLevel+1;
		????????for(int?i=0;?i<dataProvideList.size();?i++){
			????	??Label?dataLabel?=?null;
			????	??Number?cellNum?=?null;
			????	??Map<String,?Object>?dpMap?=?dataProvideList.get(i);
			????	??for(int?j=0;?j<matchMap.size();?j++){
			????		??Object?data?=?dpMap.get(matchMap.get(j));
			????		??String?cellStr?=?stringTool(data);
//			????		??if(StringUtils.hasLength(cellStr)?&&?pa.matcher(cellStr).matches()){
//			????			??DecimalFormat?df?=?new?DecimalFormat("0.##");
//		????				??cellNum?=?new?Number(j,?rowIndex,?Tool.sToF(df.format(Tool.sToF(cellStr,?0)),?0),?format4);
//		????				??sheet.addCell(cellNum);
//			????		??}?else?{
			????			??dataLabel?=?new?Label(j,?cellStr,?format4);
		????				??sheet.addCell(dataLabel);
//			????		??}
			????	??}
			????	??rowIndex++;
			??????}
		????????
		???????workbook.write();
		???????workbook.close();
		}?catch?(Exception?e)?{
			e.printStackTrace();
		}
		
	}
	
	/***
	?*?为非首行设置“坐标”
	?*?@param?columnBean
	?*/
	private?void?setRange(AdvanceDataGridColumnBean?columnBean){
		AdvanceDataGridColumnBean?parent?=?columnBean.getParent();
		if(rangeMap.get(parent.getHeaderText()+parent.getDataField())?==?null){?//递归
			setRange(parent);
		}?else?{
			RowColumnBean?range?=?rangeMap.get(parent.getHeaderText()+parent.getDataField());
			for(int?i=0;?i<parent.getChildren().size();?i++){
				AdvanceDataGridColumnBean?childrenBean?=?parent.getChildren().get(i);
				int?childrenIndex?=?parent.getChildren().indexOf(childrenBean);
				
				if(childrenIndex?==?0){//?判断子节点在父节点的位置:老大还是老二?
					RowColumnBean?rangeBean?=?getRange(childrenBean.getColumnSize(),?range.getBeginColumnIndex(),?range.getBeginRowIndex()+1);?//?判断子节点在父节点的位置:老大还是老二?
					rangeMap.put(childrenBean.getHeaderText()+childrenBean.getDataField(),?rangeBean);
				}?else?{
					range?=?rangeMap.get(parent.getChildren().get(i-1).getHeaderText()+?parent.getChildren().get(i-1).getDataField());?//得到哥哥的“坐标”,弟弟排在哥哥后面!
					RowColumnBean?rangeBean?=?getRange(childrenBean.getColumnSize(),?range.getEndColumnIndex()+1,?range.getEndRowIndex());
					rangeMap.put(childrenBean.getHeaderText()+childrenBean.getDataField(),?rangeBean);
				}
				
				if(childrenBean.getChildren()?!=?null){?//如果有子节点,就再调用以给子节点赋值
					for(AdvanceDataGridColumnBean?childrenChildrenBean?:childrenBean.getChildren()){
						if(rangeMap.get(childrenChildrenBean.getHeaderText()+childrenChildrenBean.getDataField())?==?null){
							setRange(childrenChildrenBean);
						}
					}
				}
			}
		}
	}
	
	/***
	?*?写入excel
	?*?@param?sheet
	?*?@param?headerList
	?*?@param?rowIndex
	?*?@return
	?*?@throws?Exception
	?*/
	private?List<Label>?setLabel(WritableSheet?sheet,?List<AdvanceDataGridColumnBean>?headerList,?int?rowIndex)?throws?Exception{
		List<Label>?list?=?new?ArrayList<Label>();
		Label?label?=?null;
		for?(AdvanceDataGridColumnBean?columnBean?:?headerList)?{
????		RowColumnBean?range?=?rangeMap.get(columnBean.getHeaderText()+columnBean.getDataField());
????		if(range?==?null){
????			setRange(columnBean);
????			range?=?rangeMap.get(columnBean.getHeaderText()+columnBean.getDataField());
????		}
????		sheet.mergeCells(range.getBeginColumnIndex(),?range.getBeginRowIndex(),?range.getEndColumnIndex(),?range.getEndRowIndex());
????		label?=?new?Label(range.getBeginColumnIndex(),?columnBean.getHeaderText(),?format1);

????		sheet.addCell(label);
	????	if(columnBean.getChildren()?!=?null){
	????		setLabel(sheet,?columnBean.getChildren(),?rowIndex++);
	????	}
		}
		return?list;
	}
	
	/***
	?*?获取首行的”坐标“
	?*?@param?headerList
	?*?@param?columnIndex
	?*?@param?rowIndex
	?*?@return?Map<String,?RowColumnBean>
	?*/
	private?Map<String,?RowColumnBean>?getRangeList(List<AdvanceDataGridColumnBean>?headerList,?int?columnIndex,?int?rowIndex){
		Map<String,?RowColumnBean>?map?=?new?HashMap<String,?RowColumnBean>();
		
		for?(AdvanceDataGridColumnBean?columnBean?:?headerList)?{
			List<AdvanceDataGridColumnBean>?childrenColumnList?=?columnBean.getChildren();
	????	if?(childrenColumnList?==null?||?!childrenColumnList.isEmpty())?{
????			map.put(columnBean.getHeaderText()+columnBean.getDataField(),?getRange(columnBean.getColumnSize(),?rowIndex));
	????		columnIndex?+=?columnBean.getColumnSize();
	????	}
		}
		return?map;?
	}
	
	/***
	?*?设置“坐标”
	?*?@param?columnSize
	?*?@param?columnIndex
	?*?@param?rowIndex
	?*?@return?RowColumnBean
	?*/
	private?RowColumnBean?getRange(int?columnSize,?int?rowIndex){
		RowColumnBean?bean?=?new?RowColumnBean();
		bean.setBeginColumnIndex(columnIndex);
		bean.setBeginRowIndex(rowIndex);
		bean.setEndColumnIndex(columnIndex?+?columnSize?-?1);
		if(columnSize==1){
			bean.setEndRowIndex(maxLevel);
		}?else?{
			bean.setEndRowIndex(rowIndex);
		}
		return?bean;
	}
	
	/***
	?*?获取单元格的长度
	?*?@param?jb
	?*?@return?Integer
	?*/
	private?Integer?getColumnSize(JSONObject?jb){
		int?columnSize?=?0;
		if(StringUtils.hasLength(jb.get("children").toString())?&&?!jb.get("children").toString().equals("null")){
			JSONArray?childrenJA?=?jb.getJSONArray("children");
			for(int?i=0;?i<childrenJA.size();?i++){
				columnSize?+=?getColumnSize(JSONObject.fromObject(childrenJA.get(i)));	
			}
		}?else?{
			++columnSize;
		}
		return?columnSize;?
	}
	
	/**
	?*?表头最多有多少“级别”
	?*?@param?JSONArray?ja
	?*?@return?Integer
	?*/
	private?Integer?getMaxLevel(JSONArray?ja){
		int?level?=?1;
		for(int?i=0;?i<ja.size();?i++){
			JSONObject?jb?=?JSONObject.fromObject(ja.get(i));
			int?tmp?=?1;
			
			if(StringUtils.hasLength(jb.get("children").toString())?&&?!jb.get("children").toString().equals("null")){
				tmp?+=?getMaxLevel(jb.getJSONArray("children"));
				level?=?tmp;
			}?
			if(maxLevelMap.get("level")<?level){
				maxLevelMap.put("level",?level);
			}
		}
		return?level;
	}
	
	
	Map<Integer,?String>?matchMap?=?new?HashMap<Integer,?String>();?//用于和数据源对应的map
	int?matchIndex?=?0;
	/***
	?*?遍历表头
	?*?@param?JSONArray?ja?需要遍历的数据源
	?*?@param?AdvanceDataGridColumnBean?parent?父节点
	?*?@return??List<AdvanceDataGridColumnBean>
	?*/
	private?List<AdvanceDataGridColumnBean>?getHeaderList(JSONArray?ja,?AdvanceDataGridColumnBean?parent){
		List<AdvanceDataGridColumnBean>?headerList?=?new?ArrayList<AdvanceDataGridColumnBean>();
		for(int?i=0;?i<ja.size();?i++){
			AdvanceDataGridColumnBean?bean?=?new?AdvanceDataGridColumnBean();
			JSONObject?jb?=?JSONObject.fromObject(ja.get(i));
			bean.setHeaderText(jb.getString("headerText"));
			bean.setDataField(jb.getString("dataField"));
			bean.setColumnSize(getColumnSize(jb));
			
			if(StringUtils.hasLength(jb.get("children").toString())?&&?!jb.get("children").toString().equals("null")){
				bean.setChildren(getHeaderList(jb.getJSONArray("children"),?bean));
			}?else?{
				matchMap.put(matchIndex++,?bean.getDataField());?//设置dataField和列的对应关系
			}
			if(parent?!=?null){
				bean.setParent(parent);
			}
			headerList.add(bean);
		}
		return?headerList;
	}
	
	public?String?stringTool(Object?obj){
		if(obj?==?null){
			return?null;
		}?else?{
			return?obj.toString();
		}
	}
	
	public?List<Map<String,?Object>>?getDataProvideList()?{
		return?dataProvideList;
	}

	public?void?setDataProvideList(List<Map<String,?Object>>?dataProvideList)?{
		this.dataProvideList?=?dataProvideList;
	}

	public?String?getExcelHeaderTitle()?{
		return?excelHeaderTitle;
	}

	public?void?setExcelHeaderTitle(String?excelHeaderTitle)?{
		this.excelHeaderTitle?=?excelHeaderTitle;
	}
	public?String?getWorkSheetTitle()?{
		return?workSheetTitle;
	}

	public?void?setWorkSheetTitle(String?workSheetTitle)?{
		this.workSheetTitle?=?workSheetTitle;
	}

	public?List<AdvanceDataGridColumnBean>?getHeaderList()?{
		return?headerList;
	}

	public?void?setHeaderList(List<AdvanceDataGridColumnBean>?headerList)?{
		this.headerList?=?headerList;
	}
	protected?class?RowColumnBean{
		private?Integer?BeginColumnIndex;
		private?Integer?BeginRowIndex;
		private?Integer?endColumnIndex;
		private?Integer?endRowIndex;
		public?Integer?getBeginColumnIndex()?{
			return?BeginColumnIndex;
		}
		public?void?setBeginColumnIndex(Integer?beginColumnIndex)?{
			BeginColumnIndex?=?beginColumnIndex;
		}
		public?Integer?getBeginRowIndex()?{
			return?BeginRowIndex;
		}
		public?void?setBeginRowIndex(Integer?beginRowIndex)?{
			BeginRowIndex?=?beginRowIndex;
		}
		public?Integer?getEndColumnIndex()?{
			return?endColumnIndex;
		}
		public?void?setEndColumnIndex(Integer?endColumnIndex)?{
			this.endColumnIndex?=?endColumnIndex;
		}
		public?Integer?getEndRowIndex()?{
			return?endRowIndex;
		}
		public?void?setEndRowIndex(Integer?endRowIndex)?{
			this.endRowIndex?=?endRowIndex;
		}
	}
	public?int?getMaxLevel()?{
		return?maxLevel;
	}

	public?void?setMaxLevel(int?maxLevel)?{
		this.maxLevel?=?maxLevel;
	}

}
package?com.sddl.bean;

import?java.util.List;

public?class?AdvanceDataGridColumnBean?{
	private?String?dataField;
	private?String?headerText;
	private?AdvanceDataGridColumnBean?parent;
	private?List<AdvanceDataGridColumnBean>?children;
	private?Integer?columnSize;
	
	public?String?getDataField()?{
		return?dataField;
	}

	public?void?setDataField(String?dataField)?{
		this.dataField?=?dataField;
	}

	public?String?getHeaderText()?{
		return?headerText;
	}

	public?void?setHeaderText(String?headerText)?{
		this.headerText?=?headerText;
	}

	public?List<AdvanceDataGridColumnBean>?getChildren()?{
		return?children;
	}

	public?void?setChildren(List<AdvanceDataGridColumnBean>?children)?{
		this.children?=?children;
	}

	public?AdvanceDataGridColumnBean?getParent()?{
		return?parent;
	}

	public?void?setParent(AdvanceDataGridColumnBean?parent)?{
		this.parent?=?parent;
	}

	public?Integer?getColumnSize()?{
		return?columnSize;
	}

	public?void?setColumnSize(Integer?columnSize)?{
		this.columnSize?=?columnSize;
	}

}

导出的数据:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读