⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 excelreportservlet.java

📁 Excel Report是一款基于Excel的报表生成工具
💻 JAVA
字号:
/*
 * Created on 2006-8-7
 *
 * TODO 
 */
package net.excel.report;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.HashMap;
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.excel.report.config.DataSourceConfig;
import net.excel.report.config.ReportConfig;
import net.excel.report.datasource.BaseDataSource;
import net.excel.report.datasource.DBConnection;


/**
 * <b>&nbsp;&nbsp;&nbsp;&nbsp;TODO:</b> 
 * ExcelReportServlet 是报表生成器在Web服务器上的一个应用封装,通过这个封装好的Servlet
 * 用户就不需要再去封装自己的Servlet。只需将该Servlet部署到相应的应用中去,即可以在页面直接请求报表
 * 打印。<br>
 * &nbsp;&nbsp;&nbsp;&nbsp;<b>如何配置该Servlet:</b>(该servlet支持以下几个输入参数)<br>
 * &nbsp;&nbsp;&nbsp;&nbsp;
 * 1. TempletFilePath:设定模板文件和配置文件(ReportConfig.xml)目录(相对于webroot目录的逻辑目录名).<br>
 * &nbsp;&nbsp;&nbsp;&nbsp;
 * 2. DSImplDataBase: 配置数据库类型数据源实现类,(用户自定义的实现,该类必须继承至DBDataSource类)<br>
 * &nbsp;&nbsp;&nbsp;&nbsp;
 * 3. DSImplStatic:配置静态类型数据源实现类.(用户自定义的实现,该类必须继承至BaseDataSource类)<br>
 * &nbsp;&nbsp;&nbsp;&nbsp;
 * 4. JNDI:如果用户没有配置‘DSImplDataBase’可以配置JNDI来使用默认的数据库类型数据源来实现数据检索。<br>
 * &nbsp;&nbsp;&nbsp;&nbsp;
 * 5. Logger: 配置Excel报表生成器的日志输出实现类,该类必须实现Logger接口
 * @author juny
 * @version 1.0
 * @since 1.0
 * @see net.excel.report.Logger
 * @see net.excel.report.datasource.DBDataSource
 * @see net.excel.report.datasource.BaseDataSource
 */
public class ExcelReportServlet extends HttpServlet {
    private static Logger log = Logger.getLogger(ExcelReportServlet.class);
    /** (non-Javadoc)
     * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
     */
    protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1)
            throws ServletException, IOException {
        this.process(arg0, arg1);
    }
    
    /**
     * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
     */
    protected void doPost(HttpServletRequest arg0, HttpServletResponse arg1)
            throws ServletException, IOException {
       this.process(arg0, arg1);
    }
    
    /**
     * @see javax.servlet.Servlet#destroy()
     */
    public void destroy() {
        super.destroy();
    }
    
    /**
     * @see javax.servlet.Servlet#init(javax.servlet.ServletConfig)
     */
    public void init() throws ServletException {
        Enumeration names = getServletConfig().getInitParameterNames();
        String name = null;
        while (names.hasMoreElements()) {
            name = (String)names.nextElement();
            setReportParam(name,
                getServletConfig().getInitParameter(name));
        }
    }
    
    /**
     * 设置报表参数
     * @param name:参数名称
     * @param value:参数值
     */
    private void setReportParam(String name, String value){
        if(name.equals("DSImplDataBase")){
            getInstance(value,DataSourceConfig.DS_TYPE_DATABASE);
        }else if( name.equals("DSImplStatic")){
            getInstance(value,DataSourceConfig.DS_TYPE_STATIC);
        }else if(name.equals("TempletFilePath")){
            path = value;
        }else if(name.equals("JNDI")){
            jndi = value;
        }else if(name.equals("Logger")){
            logger = value;
        }
    }
    
    /**
     * 处理报表打印请求。
     * @param request
     * @param response
     * @throws IOException
     */
    private void process(HttpServletRequest request, HttpServletResponse response) throws IOException{
        OutputStream os = response.getOutputStream();
        String reportName = (String)request.getParameter(ReportConfig.REPORT);
        
        response.setContentType("application/vnd.ms-excel;charset=gb2312");
        response.setHeader("Content-Disposition",
        		"attachment; filename=\"" + reportName + "\";");
        
        String reloadConfig = (String)request.getParameter("reloadConfig");
        boolean needReloadConfig = false;
        if(null != reloadConfig && reloadConfig.equalsIgnoreCase("true")){
            needReloadConfig = true;
            if(log.isDebugEnable()){
                log.debug("reload config");
            }
        }
        
        try{
            long curTime = System.currentTimeMillis();
	        ReportEngine r = getReportEngine(needReloadConfig);
	        //取得报表参数
	        Map params = getParamMap(request);
	        //生成报表
	        r.getReportAsExcel(os, params);
	        os.flush();
	        log.debug("Total time:" + String.valueOf(System.currentTimeMillis() - curTime) + " milliseconds");
	        //response.flushBuffer();
        }catch(Exception e){
            log.error(e.getMessage());
        }
    }
    
    /**
     * 根据Repuest来生成报表需要的参数信息。
     * @param request: HttpServletRequest对象,保存用户请求的信息。
     * @return 参数包装Map,该Map对象以报表生成器需要的格式封装用户请求的参数信息。
     */
    private Map getParamMap(HttpServletRequest request){
        Enumeration params = request.getParameterNames();
        String param = null;
        String value = "";
        String [] values = null;
        Map retMap = new HashMap();
        while(params.hasMoreElements()){
            param = (String)params.nextElement();
            value = (String)request.getParameter(param);
            retMap.put(param, value);
        }
        
        retMap.put("request", request);
        return retMap;
    }
    
    private ReportEngine reportEngine = null;
    /**
     * 取得报表引擎对象,报表引擎对象在应用中只有一个实例存在。
     * @param reload:标识是否需要强制重新装载报表配置信息。<br>
     * true:重新装载。
     * false:不需重新装载。
     * @return 返回报表引擎对象。
     */
    private synchronized ReportEngine getReportEngine(boolean reload){
        if(null != reportEngine && !reload){
            return reportEngine;
        }
        
        String path = getServletContext().getRealPath(this.path);
        
        //设置报表logger实现类
        if(null  != logger){
            ReportEngine.setLogger(logger);
        }
        
        //取得报表管理对象
        reportEngine = ReportEngine.getReportEngine(path + 
                File.separator + 
                "ReportConfig.xml",
                reload);
        
        //设置报表模板文件目录 
        reportEngine.setTempletFilePath(path);
        
        //设置数据连接属性
        if(null != this.jndi){
            reportEngine.setDBConnection(new DBConnection(jndi));
        }
        
        //设置数据源实现类。
        Object obj = null;
        if(null != dsImpl){
            obj = dsImpl.get(DataSourceConfig.DS_TYPE_DATABASE);
	        if(null != obj){
		        reportEngine.setDataSourceImplement(DataSourceConfig.DS_TYPE_DATABASE, 
		                (BaseDataSource)obj);
	        }
	        
	        obj = null;
	        if(null != (obj = dsImpl.get(DataSourceConfig.DS_TYPE_STATIC))){
		        reportEngine.setDataSourceImplement(DataSourceConfig.DS_TYPE_STATIC, 
		                (BaseDataSource)obj);
	        }
        }
        return reportEngine;
    }
    
    /**
     * 取得用户配置数据源类的实例。
     * @param className:要生成实例的class名称。
     * @param dsType:标识数据源的类型。
     * @return 返回生成的数据源对象。
     */
    private Object getInstance(String className, String dsType){
        Object obj = null;
        try{
            if(log.isDebugEnable()){
                log.debug("Excel report initializing: Create data source instance:" + className);
            }
            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
            if (classLoader == null) {
                classLoader = ExcelReportServlet.class.getClassLoader();
            }
            
            obj = classLoader.loadClass(className).newInstance();
            if(null != obj && obj instanceof BaseDataSource){
                if(null == dsImpl){
                    dsImpl = new HashMap();
                }
                dsImpl.put(dsType, obj);
                return obj;
            }
            
            log.error("Error: User defined data source must inherited from excel.report.datasource.BaseDataSource.");
        }catch(Exception e){
            log.error("Error: Catched an Exception when loads a datasource instance. --" 
                    + className
                    + " \n " + e.getMessage());
            
        }
        return null;
    }
    
    private Map dsImpl = null;
    private String path = "/WEB-INF/classes/ReportConfig";
    private String jndi = null;
    private String logger = null;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -