SmartBi报表工具二次开发

1,324 阅读2分钟

导出bi报表为 PNG、EXECEL、PDF、Word等格式保存至本地

打开服务器部署文件smartbi.war,解压后将smartbi.war\WEB-INF\lib\目录下的smartbi-SDK.jar、smartbi-Common.jar、commons-logging-1.1.jar、ezmorph-0.8.1.jar、commons-beanutils.jar、commons-collections-3.2.jar 包加入到您的JAVA项目的classpath中去。

package ******.utils;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import smartbi.sdk.ClientConnector;
import smartbi.sdk.service.spreadsheetreport.SSReport;
import smartbi.sdk.service.simplereport.Parameter;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;


public class JavaGetSmartbi {
    private static Logger logger = LogManager.getLogger(JavaGetSmartbi.class);
    private String REPORT_ID;
    private String FILE_PATH;
    private String EXPORT_TYPE;

    private ClientConnector conn = null;
    private SSReport ssReport = null;

    private final String URL = "https://smartbitest.*****.com.cn";
    private final String USER = "admin";
    private final String PASSWORD = "***123456*";

    /*
        设置报表的参数默认值
        report.setParamValue(String id, String value, String displayValue);
    */
    private ArrayList<String[]> ARRAY_PARAM_VALUES;

    public JavaGetSmartbi() {
    }

    /**
     * @param reportId   smartBi报表资源id
     *                   在bi页面选中报表后右击属性 {节点ID即为资源id}
     * @param filePath   保存文件路径
     *                   eg: /work/Directory/smartbi.png
     *                   eg: D:work/Directory/smartbi.png
     * @param exportType 导出类型
     *                   eg: PNG、PDF、EXCEL(xlsx)、EXCEL2007(xls)、WORD
     */
    public JavaGetSmartbi(String reportId, String filePath, String exportType) {
        open();
        setExportType(exportType);
        setFilePath(filePath);
        setReportId(reportId);
    }

    /**
     * @param reportId         smartBi报表资源id
     *                         在bi页面选中报表后右击属性 {节点ID即为资源id}
     * @param filePath         保存文件路径
     *                         eg: /work/Directory/smartbi.png
     *                         eg: D:work/Directory/smartbi.png
     * @param exportType       导出类型
     *                         eg: PNG、PDF、EXCEL(xlsx)、EXCEL2007(xls)、WORD
     * @param arrayParamValues 报表参数
     *                         eg: ArrayList<String[]> arrayParamValues = new ArrayList<>();
     *                         arrayParamValues.set(1,new String[]{"区域","东北虎","默认值 不知道传什么就传跟第二个参数相同的"});
     *                         arrayParamValues.set(1,new String[]{"片区","跳跳虎","默认值 不知道传什么就传跟第二个参数相同的"});
     */
    public JavaGetSmartbi(String reportId, String filePath, String exportType, ArrayList<String[]> arrayParamValues) {
        open();
        setExportType(exportType.toUpperCase());
        setFilePath(filePath);
        setReportId(reportId);
        setArrayParamValues(arrayParamValues);
    }


    /**
     * 运行入口
     */
    public void run() {

        String reportId = this.REPORT_ID;
        String filePath = this.FILE_PATH;
        String exportType = this.EXPORT_TYPE;
        ArrayList<String[]> arrayParamValues = this.ARRAY_PARAM_VALUES;

        logger.info("reportId:" + reportId);
        logger.info("filePath:" + filePath);
        logger.info("exportType:" + exportType);
        logger.info("arrayParamValues:" + arrayParamValues);


        //功能实现
        try {
            running(REPORT_ID, FILE_PATH, EXPORT_TYPE, ARRAY_PARAM_VALUES);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }

    public ArrayList getParamList() {
        ssReport.open(this.REPORT_ID);

        //声明一个空的list,用于存放 reportId 所属报表的调用参数id
        ArrayList<String> parid = new ArrayList();
        List<Parameter> list = ssReport.getParamList();
        if (null != list) {
            for (Parameter parameter : list) {
                //将参数的id填写到集合中
                parid.add(parameter.getId());
            }
        }
        logger.info("parid:" + parid);
        return parid;
    }

    /**
     * @param reportId 报表ID
     */
    private void running(String reportId, String filePath, String exportType, ArrayList<String[]> arrayParamValues) {
        try {
            ssReport.open(reportId);

            if (null != arrayParamValues) {
                for (String[] arrayParamValue : arrayParamValues) {
                    ssReport.setParamValue(arrayParamValue[0], arrayParamValue[1], arrayParamValue[2]);
                    logger.info("参数 " + arrayParamValue[0] + ":" + arrayParamValue[1] + " 设置成功");
                }
            }

            //获取输出流
            File pngFile = new File(filePath);
            logger.info("本地目录文件创建成功!");

            FileOutputStream os = getFileOutputStream(pngFile);
            logger.info("IO流初始化完成,开始执行SmartBi文件写入IO流");

            ssReport.doExport(exportType, os);
            logger.info("SmartBi文件写入IO流执行成功");
            os.flush();
            os.close();

        } catch (Exception e){
            e.printStackTrace();
        }
    }

    /**
     * 传入路径获取文件流
     *
     * @param fileContext 文件
     * @return
     */
    private FileOutputStream getFileOutputStream(File fileContext) throws FileNotFoundException {
            return new FileOutputStream(fileContext);
    }

    /**
     * 创建应用连接器。
     * 在跟Smartbi服务器进行任何通信之前必须先创建一个ClientConnector对象,即应用链接器。
     * 客户代码仅需要创建一个ClientConnector实例。
     *
     * @return 应用连接器
     */
    private ClientConnector createClientConnector(String url, String user, String password) {
        ClientConnector conn = new ClientConnector(url);
        boolean loginOK = conn.open(user, password);
        if (loginOK) {
            return conn;
        } else {
            conn.close();
            return null;
        }
    }

    /**
     * 连接初始化
     */
    private void open(){
        try {
            logger.info("开始创建SmartBi链接...");
            conn = createClientConnector(URL, USER, PASSWORD);
            logger.info("SmartBi创建链接成功.");

            logger.info("开始创建SmartBi报表链接...");
            ssReport = new SSReport(conn);
            logger.info("SmartBi创建报表连接器成功.");
        }catch (RuntimeException e){
            logger.warn("创建应用连接器或报表连接器失败,请检查"连接url、用户名、密码"是否正确及网络是否畅通!");
        }
    }

    /**
     * 关闭SmartBi连接
     */
    public void close(){
        ssReport.close();
        logger.info("关闭报表连接");
        conn.close();
        logger.info("关闭SmartBi连接");
    }

    public void setFilePath(String FILE_PATH) {
        this.FILE_PATH = FILE_PATH;
    }

    public void setExportType(String EXPORT_TYPE) {
        this.EXPORT_TYPE = EXPORT_TYPE;
    }

    public void setArrayParamValues(ArrayList<String[]> arrayParamValues) {
        this.ARRAY_PARAM_VALUES = arrayParamValues;
    }

    public void setReportId(String REPORT_ID) {
        this.REPORT_ID = REPORT_ID;
    }
}