All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.belier.jxls.view.JxlsView Maven / Gradle / Ivy

There is a newer version: 1.2.0
Show newest version
package cn.belier.jxls.view;

import cn.belier.jxls.config.JxlsConfig;
import cn.belier.jxls.encoder.ContentDispositionHandler;
import cn.belier.jxls.filename.FilenameGenerate;
import cn.belier.jxls.filename.JxlsFilenameUtils;
import lombok.Cleanup;
import org.apache.commons.jexl2.JexlEngine;
import org.jxls.common.Context;
import org.jxls.expression.JexlExpressionEvaluator;
import org.jxls.transform.Transformer;
import org.jxls.util.JxlsHelper;
import org.jxls.util.TransformerFactory;
import org.springframework.beans.factory.BeanFactoryUtils;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.http.HttpStatus;
import org.springframework.util.ResourceUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.view.AbstractTemplateView;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;

/**
 * Jxls 视图
 *
 * @author belier
 * @date 2018/11/30
 */

public class JxlsView extends AbstractTemplateView {

    private PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();

    private ContentDispositionHandler contentDispositionHandler;

    private JxlsConfig config;

    private FilenameGenerate filenameGenerate;

    private JxlsHelper jxlsHelper;

    @Override
    protected void initServletContext(ServletContext servletContext) {

        this.config = BeanFactoryUtils.beanOfTypeIncludingAncestors(
                obtainApplicationContext(), JxlsConfig.class, true, false);

        this.jxlsHelper = BeanFactoryUtils.beanOfTypeIncludingAncestors(
                obtainApplicationContext(), JxlsHelper.class, true, false);

        this.contentDispositionHandler = BeanFactoryUtils.beanOfTypeIncludingAncestors(
                obtainApplicationContext(), ContentDispositionHandler.class, true, false);

        this.filenameGenerate = BeanFactoryUtils.beanOfTypeIncludingAncestors(
                obtainApplicationContext(), FilenameGenerate.class, true, false);
    }

    @Override
    protected void renderMergedTemplateModel(Map model
            , HttpServletRequest request, HttpServletResponse response) throws Exception {

        response.setStatus(HttpStatus.CREATED.value());

        // 创建Jxls的上下文
        Context context = new Context(model);

        String contentDisposition = this.contentDispositionHandler.getContentDisposition(request, getFilename(context));

        response.setHeader("Content-Disposition", contentDisposition);

        // 获取对应的模板
        @Cleanup
        InputStream template = getTemplate();

        Transformer transformer = TransformerFactory.createTransformer(template, response.getOutputStream());

        JexlExpressionEvaluator expressionEvaluator = (JexlExpressionEvaluator) transformer
                .getTransformationConfig().getExpressionEvaluator();

        JexlEngine jexlEngine = expressionEvaluator.getJexlEngine();

        // 设置方法列表
        jexlEngine.setFunctions(this.config.getFunctions());

        // 静默模式配置
        jexlEngine.setSilent(this.config.isSilent());

        // 输出渲染后的数据
        this.jxlsHelper.processTemplate(context, transformer);

    }

    /**
     * 获取文件名称
     *
     * @param context jxls上下文
     * @return 文件名称
     */
    private String getFilename(Context context) {

        // 获取设置的文件名称
        String filename = JxlsFilenameUtils.getFilename(context);

        // 获取扩展名称
        String extension = this.getUrl().substring(this.getUrl().lastIndexOf("."));

        // 没有设置就使用默认的
        if (StringUtils.isEmpty(filename)) {
            filename = this.filenameGenerate.generate();
        }

        return filename + extension;
    }


    /**
     * 获取模板
     *
     * @return {@link InputStream}
     * @throws IOException IO异常
     */
    private InputStream getTemplate() throws IOException {

        for (String path : this.config.getTemplateLoaderPath()) {

            // 模板全路径
            String templatePath = path + getUrl();

            // 加载模板
            InputStream inputStream = templatePath.startsWith(ResourceUtils.CLASSPATH_URL_PREFIX)
                    ? this.patternResolver.getResource(templatePath).getInputStream()
                    : new FileInputStream(templatePath);

            if (inputStream != null) {
                return inputStream;
            }
        }

        return null;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy