package com.sogou.qadev.service.cynthia.service; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFHyperlink; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor; import com.sogou.qadev.service.cynthia.bean.Data; import com.sogou.qadev.service.cynthia.bean.Filter; import com.sogou.qadev.service.cynthia.bean.Flow; import com.sogou.qadev.service.cynthia.bean.QueryCondition; import com.sogou.qadev.service.cynthia.bean.TagBean; import com.sogou.qadev.service.cynthia.bean.Template; import com.sogou.qadev.service.cynthia.bean.UUID; import com.sogou.qadev.service.cynthia.factory.DataAccessFactory; import com.sogou.qadev.service.cynthia.service.FilterQueryManager.ExportType; import com.sogou.qadev.service.cynthia.util.CommonUtil; import com.sogou.qadev.service.cynthia.util.ConfigUtil; import com.sogou.qadev.service.cynthia.util.CynthiaUtil; import com.sogou.qadev.service.cynthia.util.XMLUtil; /** * @description:export data processor (xml,excel,mail) * @author:liming * @mail:liming@sogou-inc.com * @date:2014-5-6 下午12:06:36 * @version:v1.0 */ public class ExportDataManager { private static String splitAndFilterString(String input) { if (input == null || input.trim().equals("")) { return ""; } String str = input.replaceAll("<[a-zA-Z]+[1-9]?[^><]*>", "").replaceAll("</[a-zA-Z]+[1-9]?>", ""); return str; } /** * @description:get mail header * @date:2014-5-6 下午12:06:58 * @version:v1.0 * @return */ private static String getMailHtmlHeader(){ StringBuffer header = new StringBuffer(); header.append("<html>"); header.append("<head>"); header.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=GBK\"/>"); header.append("<style type=\"text/css\">"); header.append("table{border-collapse: collapse; border: 1px solid #CCCCCC; font-size: 100%;margin-top: 0em; margin-left: 5px; margin-bottom: 0em;width: 800px;table-layout:fixed;}"); header.append("th{border-right: 1px solid #CCCCCC;text-align: center; white-space:nowrap; background: #4EA9E4; margin: .25em;vertical-align: center;}"); header.append("tr{vertical-align: center; background: #eeeeff;}"); header.append("td{border-right: 1px solid #CCCCCC; margin: .25em;vertical-align: center; border-bottom: 1px solid #CCCCCC; word-wrap: break-word;word-break:break-all;max-width: 120px;display : table-cell;}"); header.append("body{margin: 0;padding: 0;background: #f6f6f6;}"); header.append("body,div,p,span{margin-top:0px; margin-bottom:0px; color: #333;font-size: 12px;line-height: 150%;font-family: Verdana, Arial, Helvetica, sans-serif;}"); header.append("</style>"); header.append("</head>"); header.append("<body>"); return header.toString(); } /** * @description:get mail footer * @date:2014-5-6 下午12:07:07 * @version:v1.0 * @return */ private static String getMailHtmlFooter(){ StringBuffer footer = new StringBuffer(); footer.append("</body>"); footer.append("</html>"); return footer.toString(); } private static String getTableHeader(Map<String, String> displayNamesMap){ StringBuffer tableHeaderBuffer = new StringBuffer(); tableHeaderBuffer.append("<tr>"); tableHeaderBuffer.append("<th style=\"width:60px;\">").append("序号").append("</th>"); for (String fieldName : displayNamesMap.keySet()) { if(fieldName.equals("标题") || fieldName.equals("描述")){ tableHeaderBuffer.append("<th style='width:" + (displayNamesMap.get(fieldName) != null && !displayNamesMap.get(fieldName).equals("") ? displayNamesMap.get(fieldName) : "500px" ) + ";'>").append(XMLUtil.toSafeXMLString(fieldName)).append("</th>"); }else{ tableHeaderBuffer.append("<th style='width:" + (displayNamesMap.get(fieldName) != null && !displayNamesMap.get(fieldName).equals("") ? displayNamesMap.get(fieldName) : "140px" ) + ";'>").append(XMLUtil.toSafeXMLString(fieldName)).append("</th>"); } } tableHeaderBuffer.append("</tr>"); return tableHeaderBuffer.toString(); } private static String getMailHtmlData(Data[] allDatas , Map<String, String> displayNameMap , String indentFieldName, DataAccessSession das , boolean isSysFilter){ String[] displayNames = displayNameMap.keySet().toArray(new String[0]); if (allDatas == null || allDatas.length == 0) { return "<p style=\"color:red\">过滤器没有筛选出任何数据</p>"; } StringBuffer dataBuffer = new StringBuffer(); String tableHeader = getTableHeader(displayNameMap); Map<UUID, Template> templateMap = new HashMap<UUID, Template>(); Map<UUID, Flow> flowMap = new HashMap<UUID, Flow>(); Map<String, String> userAliasMap = new HashMap<String, String>(); if (indentFieldName == null || indentFieldName.length() == 0) { dataBuffer.append("<table>"); dataBuffer.append(tableHeader); } String currentIndentFieldValue = ""; //当前分组字段值 //内容 for (int i = 0; i < allDatas.length; i++) { Data task = allDatas[i]; if (task == null) { continue; } if (templateMap.get(task.getTemplateId()) == null) { Template template = das.queryTemplate(task.getTemplateId()); if (template != null) { templateMap.put(task.getTemplateId(), template); } } Template template = templateMap.get(task.getTemplateId()); if (flowMap.get(template.getFlowId()) == null) { Flow flow = das.queryFlow(template.getFlowId()); if (flow != null) { flowMap.put(flow.getId(), flow); } } Flow flow = flowMap.get(template.getFlowId()); List<String> allShowList = new ArrayList<String>(); allShowList.addAll(Arrays.asList(displayNames)); allShowList.add(indentFieldName); Map<String, String> displayMap = FilterQueryManager.getShowFieldValueMap(allShowList.toArray(new String[0]), task , template ,flow ,das ,ExportType.html , userAliasMap , isSysFilter); //有分组字段情况 if (indentFieldName != null && indentFieldName.length() >0) { if (i == 0) { currentIndentFieldValue = displayMap.get(indentFieldName); dataBuffer.append("<h5>").append(indentFieldName + " : " + currentIndentFieldValue).append("</h5>"); dataBuffer.append("<table>"); dataBuffer.append(tableHeader); }else { if (!currentIndentFieldValue.equals(displayMap.get(indentFieldName))) { currentIndentFieldValue = displayMap.get(indentFieldName); //下一个分组 dataBuffer.append("</table>"); dataBuffer.append("<h5>").append(indentFieldName + " : " + currentIndentFieldValue).append("</h5>"); dataBuffer.append("<table>"); dataBuffer.append(tableHeader); } } } dataBuffer.append("<tr>"); dataBuffer.append("<td>").append(String.valueOf(i+1)).append("</td>"); for (int j = 0; j < displayNames.length; j++) { if (displayNames[j] != null && displayNames[j].equals("标题")) { dataBuffer.append("<td align=\"left\">").append("<a href=\"" + ConfigUtil.getCynthiaWebRoot() + "taskManagement.html?operation=read&taskid=" + task.getId().getValue() + "\"") .append(">" + XMLUtil.toSafeXMLString(displayMap.get(displayNames[j])) + "</a>").append("</td>"); }else { dataBuffer.append("<td>").append(XMLUtil.toSafeXMLString(displayMap.get(displayNames[j]))).append("</td>"); } } dataBuffer.append("</tr>"); } dataBuffer.append("</table>"); return dataBuffer.toString(); } /** * @description:return mail string of filter * @date:2014-5-6 下午12:07:44 * @version:v1.0 * @param das * @param keyId * @param filter * @param userName * @return */ public static String exportMailHtmlFilter(DataAccessSession das, Long keyId, Filter filter,String userName){ boolean isSysFilter = FilterQueryManager.isSysFilter(filter.getId().getValue()); if (isSysFilter) { try { FilterQueryManager.initFilterEnv(filter,keyId, userName, null, das); } catch (Exception e) { e.printStackTrace(); } } StringBuffer htmlBuffer = new StringBuffer(); htmlBuffer.append(getMailHtmlHeader().toString()); Map<String, String> displayNameMap = FilterQueryManager.getDisplayFieldAndWidth(filter.getXml(), das); Data[] allDatas = das.getDataFilter().queryDatas(filter.getXml(), 1, 100, null, null,null); //取前100条 String indentFieldName = FilterQueryManager.getFilterIndentFieldName(filter.getXml(), das); htmlBuffer.append(getMailHtmlData(allDatas, displayNameMap ,indentFieldName, das ,isSysFilter)); htmlBuffer.append("<br><a href=\"" + ConfigUtil.getCynthiaWebRoot() + "index.html?filterId=" + filter.getId().getValue() + "\">过滤器:" + filter.getName() +"</a><br/>"); // htmlBuffer.append("<a href=\"" + ConfigUtil.getCynthiaWebRoot() + "filter/exportFilter.jsp?filterId=" + filter.getId().getValue() + "\">Excel下载地址</a>"); htmlBuffer.append(getMailHtmlFooter().toString()); String html = htmlBuffer.toString(); html = html.replace("</td>", "</td>\n").replace("</tr>", "</tr>\n"); //邮件发送系统bug return html; } /** * @description:return xml string of filter export * @date:2014-5-6 下午12:07:59 * @version:v1.0 * @param filterIdStr * @return */ public static String exportXmlDataFilter(String filterIdStr){ DataAccessSession das = DataAccessFactory.getInstance().getSysDas(); Filter filter = das.queryFilter(DataAccessFactory.getInstance().createUUID(filterIdStr)); boolean isSysFilter = FilterQueryManager.isSysFilter(filter.getId().getValue()); if (isSysFilter) { try { FilterQueryManager.initFilterEnv(filter,ConfigUtil.magic, ConfigUtil.sysEmail, null, das); } catch (Exception e) { e.printStackTrace(); } } Map<UUID, Template> templateMap = new HashMap<UUID, Template>(); Map<UUID, Flow> flowMap = new HashMap<UUID, Flow>(); Map<String, String> userAliasMap = new HashMap<String, String>(); Data[] allDatas = das.getDataFilter().queryDatas(filter.getXml(),null); //取过滤器所有数据 String[] displayNames = FilterQueryManager.getDisplayNamesFilter(filter.getXml(), das); //显示字段名 StringBuffer plainBuffer = new StringBuffer(); plainBuffer.append("<root>"); for (int i = 0; i < allDatas.length; i++) { Data task = allDatas[i]; if (task == null) { continue; } plainBuffer.append("<data>"); if (templateMap.get(task.getTemplateId()) == null) { Template template = das.queryTemplate(task.getTemplateId()); if (template != null) { templateMap.put(task.getTemplateId(), template); } } Template template = templateMap.get(task.getTemplateId()); if (flowMap.get(template.getFlowId()) == null) { Flow flow = das.queryFlow(template.getFlowId()); if (flow != null) { flowMap.put(flow.getId(), flow); } } Flow flow = flowMap.get(template.getFlowId()); Map<String, String> displayMap = FilterQueryManager.getShowFieldValueMap(displayNames , task , template ,flow ,das ,ExportType.excel , userAliasMap ,isSysFilter); for(int j=0;j<displayNames.length;j++) { plainBuffer.append("<fieldname>").append(XMLUtil.toSafeXMLString(displayNames[j])).append("</fieldname>"); plainBuffer.append("<fieldvalue>").append(XMLUtil.toSafeXMLString(displayMap.get(displayNames[j]))).append("</fieldvalue>"); } plainBuffer.append("</data>"); } plainBuffer.append("</root>"); return plainBuffer.toString(); } /** * @description:export excel of filter * @date:2014-5-6 下午12:08:13 * @version:v1.0 * @param das * @param filter * @param keyId * @param userName * @param dataIds * @param beforeNum * @param outputStream * @throws Exception */ @SuppressWarnings("deprecation") public static void excelExport(DataAccessSession das, Filter filter, Long keyId , String userName, String[] dataIds, int beforeNum, OutputStream outputStream) throws Exception { boolean isSysFilter = FilterQueryManager.isSysFilter(filter.getId().getValue()); if (isSysFilter) { try { FilterQueryManager.initFilterEnv(filter,keyId, userName, null, das); } catch (Exception e) { e.printStackTrace(); } } Data[] allDatas = null; if(dataIds != null && dataIds.length > 0){ List<QueryCondition> allQueryConditions = new ArrayList<QueryCondition>(); QueryCondition qc = new QueryCondition("id", "in", "(" + dataIds[0] +")"); allQueryConditions.add(qc); allDatas = das.getDataFilter().queryDatas(filter.getXml(), 1, 10000, allQueryConditions); //取选中的数据 }else if (beforeNum > 0) { allDatas = das.getDataFilter().queryDatas(filter.getXml(), 1, beforeNum,null); //取前beforeNum条 }else { allDatas = das.getDataFilter().queryDatas(filter.getXml(), 1, 10000 ,null); //默认取前10000条 } String[] displayNames = FilterQueryManager.getDisplayFields(filter.getXml(), das); Map<String,String> userClassifyDataMap = das.getUserClassifyDataMap(userName); List<TagBean> allTagList = das.getAllTag(userName); Map<String, String> tagMap = new HashMap<String, String>(); for (TagBean tagBean : allTagList) { tagMap.put(tagBean.getId(), tagBean.getTagName()); } getExcelOutputStream(allDatas, displayNames, isSysFilter,userClassifyDataMap, tagMap,outputStream); } /** * @description:return outputstream of filter export * @date:2014-5-6 下午12:08:27 * @version:v1.0 * @param allDatas * @param displayNames * @param isSysFilter * @param userClassifyDataMap * @param tagMap * @param outputStream * @throws IOException */ public static void getExcelOutputStream(Data[] allDatas, String[] displayNames, boolean isSysFilter,Map<String,String> userClassifyDataMap,Map<String, String> tagMap,OutputStream outputStream) throws IOException{ DataAccessSession das = DataAccessFactory.getInstance().getSysDas(); Map<UUID, Template> templateMap = new HashMap<UUID, Template>(); Map<UUID, Flow> flowMap = new HashMap<UUID, Flow>(); Map<String, String> userAliasMap = new HashMap<String, String>(); HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet("sheet1"); HSSFRow firstRow = sheet.createRow((short)0); HSSFCell cell = firstRow.createCell((short)0); cell.setCellValue("编号"); for(int j=0;j<displayNames.length;j++) { HSSFCell tempCell = firstRow.createCell((short)(j+1)); tempCell.setCellValue(displayNames[j]); } HSSFCellStyle linkStyle = wb.createCellStyle(); HSSFFont cellFont= wb.createFont(); cellFont.setUnderline((byte) 1); cellFont.setColor(HSSFColor.BLUE.index); linkStyle.setFont(cellFont); boolean hasTag = false; for(int i = 0 ;i < allDatas.length ; i++) { Data task = allDatas[i]; if (task == null) { continue; } if (templateMap.get(task.getTemplateId()) == null) { Template template = das.queryTemplate(task.getTemplateId()); if (template != null) { templateMap.put(task.getTemplateId(), template); } } Template template = templateMap.get(task.getTemplateId()); if (flowMap.get(template.getFlowId()) == null) { Flow flow = das.queryFlow(template.getFlowId()); if (flow != null) { flowMap.put(flow.getId(), flow); } } Flow flow = flowMap.get(template.getFlowId()); Map<String, String> displayMap = FilterQueryManager.getShowFieldValueMap(displayNames , task , template ,flow ,das ,ExportType.excel , userAliasMap ,isSysFilter); HSSFRow dataRow = sheet.createRow((short)(i+1)); //编号 HSSFCell displayCellId = dataRow.createCell((short)(0)); displayCellId.setCellType(HSSFCell.CELL_TYPE_STRING); displayCellId.setCellValue(task.getId().getValue()); for(int j=0;j<displayNames.length;j++) { try { if (displayNames[j] != null && displayNames[j].equals("标题")) { //标题以超链接形式展示 HSSFHyperlink link = new HSSFHyperlink(HSSFHyperlink.LINK_URL); link.setAddress(ConfigUtil.getCynthiaWebRoot() + "taskManagement.html?operation=read&taskid=" + task.getId().getValue()); HSSFCell numberCell = dataRow.createCell((short)(j+1)); numberCell.setCellStyle(linkStyle); numberCell.setCellValue(task.getTitle()); numberCell.setHyperlink(link);// 设定单元格的链接 }else { HSSFCell displayCell = dataRow.createCell((short)(j+1)); String cellValue = splitAndFilterString(CynthiaUtil.getXMLStr(displayMap.get(displayNames[j]))); if(cellValue.length()>32760) continue; if (CommonUtil.isPosNum(cellValue) || (cellValue != null && cellValue.equals("0"))) { //设置为数字格式 try{ displayCell.setCellValue(Integer.parseInt(cellValue)); }catch(Exception e){ displayCell.setCellValue(cellValue); } }else { displayCell.setCellValue(cellValue); } } }catch(Exception e) { e.printStackTrace(); } } if (userClassifyDataMap.get(task.getId().getValue()) != null) { hasTag = true; HSSFCell displayCell = dataRow.createCell((short)(displayNames.length+1)); StringBuffer tagBuffer = new StringBuffer(); String[] allTag = userClassifyDataMap.get(task.getId().getValue()).split(","); for (String tagId : allTag) { tagBuffer.append(tagBuffer.length() > 0 ? "," : "").append(tagMap.get(tagId)); } displayCell.setCellValue(tagBuffer.toString()); } } //有标签数据才添加标签列 if (hasTag) { HSSFCell tempCell = firstRow.createCell((short)(displayNames.length+1)); tempCell.setCellValue("标签"); } wb.write(outputStream); } /** * @function:copy data to Clipbrd * @modifyTime:2013-10-23 下午7:35:22 * @author:李明 * @email: liming@sogou-inc.com * @param das * @param filter * @param keyId * @param userName * @param copyNumStr :copy data count,if null copy all data * @return */ public static String copyFilterDataToClipbrd(DataAccessSession das, Filter filter, Long keyId , String userName, String copyNumStr){ boolean isSysFilter = FilterQueryManager.isSysFilter(filter.getId().getValue()); if (isSysFilter) { try { FilterQueryManager.initFilterEnv(filter,keyId, userName, null, das); } catch (Exception e) { e.printStackTrace(); } } Data[] allDatas = null; Map<UUID, Template> templateMap = new HashMap<UUID, Template>(); Map<UUID, Flow> flowMap = new HashMap<UUID, Flow>(); Map<String, String> userAliasMap = new HashMap<String, String>(); if (copyNumStr == null) { allDatas = das.getDataFilter().queryDatas(filter.getXml() , 1 , 10000,null); //取过滤器所有数据 }else { int copyNum = 0; copyNum = Integer.valueOf(copyNumStr); if (copyNum == 0) { return ""; }else { allDatas = das.getDataFilter().queryDatas(filter.getXml() , 1 , copyNum ,null); } } String[] displayNames = FilterQueryManager.getDisplayNamesFilter(filter.getXml(), das); //显示字段名 StringBuffer plainBuffer = new StringBuffer(); plainBuffer.append(filter.getName()); plainBuffer.append("\r\n"); plainBuffer.append("编号"); for (int i = 0; i < displayNames.length; i++) { plainBuffer.append(" ").append(displayNames[i]); } plainBuffer.append("\r\n"); for (int i = 0; i < allDatas.length; i++) { Data task = allDatas[i]; if (task == null) { continue; } if (templateMap.get(task.getTemplateId()) == null) { Template template = das.queryTemplate(task.getTemplateId()); if (template != null) { templateMap.put(task.getTemplateId(), template); } } Template template = templateMap.get(task.getTemplateId()); if (flowMap.get(template.getFlowId()) == null) { Flow flow = das.queryFlow(template.getFlowId()); if (flow != null) { flowMap.put(flow.getId(), flow); } } Flow flow = flowMap.get(template.getFlowId()); Map<String, String> displayMap = FilterQueryManager.getShowFieldValueMap(displayNames , task , template ,flow ,das ,ExportType.excel , userAliasMap ,isSysFilter); plainBuffer.append(task.getId().getValue()); for(int j=0;j<displayNames.length;j++) { String cellValue = splitAndFilterString(CynthiaUtil.getXMLStr(displayMap.get(displayNames[j]))); if(cellValue.equals("-2147483648") || cellValue.equals("-9223372036854775808") || cellValue.equals("1.4E-45") || cellValue.equals("4.9E-324")){ cellValue = "-"; }else{ cellValue = cellValue.replaceAll("\\<.*?>",""); cellValue = cellValue.replaceAll("\\s*", ""); } plainBuffer.append(" ").append(cellValue); } plainBuffer.append("\r\n"); } return plainBuffer.toString(); } }