表格导出解决方案,包括延时导出和即时导出
报表导出解决方案,包括延时导出和即时导出
/** * 根据sql,csv标题,csv内容,csv名称,报表名称,报表编号,报表压缩文件夹名称,返回报表地址(本地导出、延迟导出) * * @param sql * 需导出、统计SQL * @param csvTitle * csv文档中标题 * @param classProperty * csv文档中标题 * @param rpt_nm * 报表名称 * @param rpt_cd * 报表编号 * @param args * Class * @return String */ public String exprotCvs(String sql, String csvTitle, String classProperty, String rpt_nm, String rpt_cd, Class args) { String filePath = ""; int iTotalCount = baseDao.getResultCount(sql); if (iTotalCount >= iBatchSize) { // 导出条数大于需批量导出条数时,记录该SQL,转为延迟处理 UserRpt userRpt = new UserRpt(); long id = SequenceManager.getKey(UserRpt.SEQUENCE); // 报表ID userRpt.setId(id); userRpt.setUser_cd("test"); // test userRpt.setStatus("0"); // 运行状态-"0未运行" userRpt.setRpt_nm(rpt_nm); // 报表名称 userRpt.setRpt_cd(rpt_cd); // 报表编号 userRpt.setCrt_dt(AQPDateUtil.generateTime()); // 创建时间 userRpt.setRpt_desc("记录数:" + String.valueOf(iTotalCount)); // 备注描述 baseDao.insertRpt(userRpt); // 新增一条用户报表信息 insertRptSql(sql, id); // 新增若干条用户报表SQL信息 return "@" + id; } List totalResult = baseDao.queryAllBySql(sql, args); if (iTotalCount <= iPageSize) { // 导出条数小于CSV最大条数时,导出单个CSV filePath = getCsvPath(totalResult, csvTitle, classProperty, rpt_cd); return filePath; } List result = AQPUtil.getListResult(totalResult, iPageSize); // 根据单个CSV最大条数,将总结果集拆分为若干个封装在List中 String[] sFilePath = new String[result.size()]; for (int i = 0; i < result.size(); i++) { sFilePath[i] = this.getCsvPath((List) result.get(i), csvTitle, classProperty, rpt_cd); } filePath = FilePathUtil.zipFiles(sFilePath, AQPDateUtil.generateTime() + "_" + rpt_cd + ".zip"); return filePath; } /** * 根据sql,csv标题,csv内容,csv名称,报表编号,报表压缩文件夹名称,返回报表地址(联机导出) * * @param sql * 需导出、统计SQL * @param csvTitle * csv文档中标题 * @param classProperty * csv文档中标题 * @param rpt_cd * 报表编号 * @param args * Class * @return String */ public String exprotTP(String sql, String csvTitle, String classProperty, String rpt_cd, Class args) { String filePath = ""; List result = null; int iTotalCount = baseDao.getResultCount(sql); int iCsvSize = iTotalCount / iPageSize; if (iTotalCount % iPageSize > 0) {// 如果不能取整,则总页数加一 iCsvSize++; } String[] sFilePath = new String[iCsvSize]; for (int i = 0; i < iCsvSize; i++) { result = new ArrayList(); String pageSql = baseDao.getQueryPageSql(sql, i + 1, iPageSize); result = baseDao.queryAllBySql(pageSql, args); sFilePath[i] = this.getCsvPath(result, csvTitle, classProperty, rpt_cd); } filePath = FilePathUtil.zipFiles(sFilePath, AQPDateUtil.generateTime() + "_" + rpt_cd + ".zip"); return filePath; } /** * 根据List结果集,csv标题,csv内容,csv名称,返回导出csv本地路径 * * @param result * 查询出List列表 * @param csvTitle * csv文档中标题 * @param classProperty * csv标题内容 * @param csvCode * 导出csv名称 * @return String 导出csv本地路径 */ public String getCsvPath(List result, String csvTitle, String classProperty, String csvCode) { FileObject fileObject = FilePathUtil.getFileObject(csvCode + ".csv"); try { fileObject.writeLine(csvTitle); CsvLineUtil csvLine = new CsvLineUtil(); Object obj = null; Collection<String> collection = AQPUtil .getCollectionPeroperty(classProperty); if (collection.size() != csvTitle.split(",").length) { throw new DpcaRuntimeException("", "CSV中标题及内容长度不一致!"); } int idx = 1; for (int i = 0; i < result.size(); i++) { obj = new Object(); obj = (Object) result.get(i); csvLine.initFieldsData(collection.size()); String strProperty = null; for (Iterator<String> iter = collection.iterator(); iter .hasNext();) { strProperty = iter.next(); csvLine.setFieldData(idx, (String) AQPUtil .getObjectProperty(obj, strProperty)); idx++; if (idx - 1 == collection.size()) { fileObject.writeLine(csvLine.getData()); idx = 1; } } } } catch (Exception e) { e.printStackTrace(); throw new DpcaRuntimeException("", e.getMessage()); } finally { fileObject.close(); } return fileObject.getAbsolutepath(); }