package com.uas.report.controller; import java.io.IOException; import java.io.OutputStream; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.ArrayUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.uas.report.core.exception.SystemError; import com.uas.report.service.PrintService; /** * 报表打印 * * @author sunyj * @since 2016年8月16日 下午3:49:02 */ @Controller @RequestMapping("/print") public class PrintController { private static Logger logger = Logger.getLogger(PrintController.class); @Autowired private PrintService printService; /** * 导出报表 * * @param userName * 不为null;当前账套用户名 * @param reportName * 不为null;需要导出的报表的名称,不带任何后缀(如导出采购单,即为"Purchase") * @param whereCondition * 可为null;where之后的条件(包括where) * @param otherParameters * 若模板已指定需要的参数,则不可为null;其他参数,区别于whereCondition,报表某些字段的值取决于这些参数; * JSON格式,数据为键值对 * @param exportFileType * 报表导出的格式,默认为pdf * @param request * @param response * @return */ @RequestMapping("/export") @ResponseBody public void export(String userName, String reportName, String whereCondition, String otherParameters, String exportFileType, HttpServletRequest request, HttpServletResponse response) { String message = ""; if (StringUtils.isEmpty(userName)) { message = "未传入当前账套用户名!"; logger.error(message); throw new SystemError(message); } if (StringUtils.isEmpty(reportName)) { message = "报表名称无效!"; logger.error(message); throw new SystemError(message); } logger.info("开始导出报表:" + reportName); if (StringUtils.isEmpty(exportFileType)) { exportFileType = "pdf"; } byte[] data = printService.export(userName, reportName, whereCondition, otherParameters, exportFileType); if (ArrayUtils.isEmpty(data)) { message = "报表导出失败:" + reportName; logger.error(message); throw new SystemError(message); } try { String exportFileName = reportName; if (exportFileType.equals("xls_with_only_data")) { exportFileName += ".xls"; } else { exportFileName += "." + exportFileType; } response.setHeader("Content-Disposition", "attachment;filename=" + exportFileName); OutputStream outputStream = response.getOutputStream(); outputStream.write(data); outputStream.flush(); outputStream.close(); } catch (IOException e) { logger.error("浏览器重复请求!"); } logger.info("报表导出完成:" + reportName); } /** * 报表预览时获取pdf流 * * @param userName * 不为null;当前账套用户名 * @param reportName * 不为null;需要预览的报表的名称,不带任何后缀(如预览采购单,即为"Purchase") * @param whereCondition * 可为null;where之后的条件(包括where) * @param otherParameters * 若模板已指定需要的参数,则不可为null;其他参数,区别于whereCondition,报表某些字段的值取决于这些参数; * JSON格式,数据为键值对 * @param pageIndex * 分页展示,当前页码,从0开始 * @return */ @RequestMapping(value = "/loadPdfData") @ResponseBody public Map loadPdfData(String userName, String reportName, String whereCondition, String otherParameters, Integer pageIndex, HttpServletResponse response) { String message = ""; if (StringUtils.isEmpty(userName)) { message = "未传入当前账套用户名!"; logger.error(message); throw new SystemError(message); } if (StringUtils.isEmpty(reportName)) { message = "报表名称无效!"; logger.error(message); throw new SystemError(message); } logger.info("开始预览报表:" + reportName); Map result = printService.preview(userName, reportName, whereCondition, otherParameters, pageIndex); byte[] data = null; if (result != null && result.get("data") != null) { data = (byte[]) result.get("data"); } if (data == null) { message = "获取预览数据失败"; logger.error(message); throw new SystemError(message); } String pdfPath = printService.writePdfFile(reportName, data); result.put("pdfPath", pdfPath); logger.info("预览报表成功:" + reportName); return result; } }