หน้าเว็บ

วันพุธที่ 18 ธันวาคม พ.ศ. 2556

JasperExporter (java)

อันนี้เป็น library สำหรับ export jasper ครับ ซึ่งผมเขียนสำหร็จรูปไว้ใช้งานเอง ก็เลยอยากเอามาแชร์ให้คนอื่นๆ ได้ใช้กันครับ


maven dependencies (pom.xml)
<dependencies>
    <!-- Jasper Report **************************************************-->
    <dependency>
        <groupId>net.sf.jasperreports</groupId>
        <artifactId>jasperreports</artifactId>
        <version>5.0.1</version>
    </dependency>
    <dependency>
        <groupId>net.sf.jasperreports</groupId>
        <artifactId>jasperreports-fonts</artifactId>
        <version>5.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <version>1.8.5</version>
    </dependency>
    <dependency>
        <groupId>net.sourceforge.jexcelapi</groupId>
        <artifactId>jxl</artifactId>
        <version>2.6.12</version>
    </dependency>
    <!-- Jasper Report **************************************************-->

    ...
    ...
    ...
</dependencies>
JasperExporter.java
package com.blogspot.na5cent.jasperlearning;

import java.io.File;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Map;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanArrayDataSource;
import net.sf.jasperreports.engine.export.JExcelApiExporter;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.JRRtfExporter;
import net.sf.jasperreports.engine.export.JRXlsExporterParameter;
import net.sf.jasperreports.engine.fill.JRFileVirtualizer;
import net.sf.jasperreports.engine.util.JRLoader;

/**
 *
 * @author redcrow create 18/12/2013 link
 * http://na5cent.blogspot.com/2013/12/jasperexporter-java.html
 */
public class JasperExporter {

    private static int jasperReportFileVirtualizerMaxSize = 2;
    private static String reportTemporaryPath = System.getProperty("java.io.tmpdir");

    public static void setJasperReportFileVirtualizerMaxSize(int virtualizerMaxSize) {
        jasperReportFileVirtualizerMaxSize = virtualizerMaxSize;
    }

    public static void setReportTemporaryPath(String path) {
        reportTemporaryPath = path;
    }

    public static int getJasperReportFileVirtualizerMaxSize() {
        return jasperReportFileVirtualizerMaxSize;
    }

    public static String getReportTemporaryPath() {
        return reportTemporaryPath;
    }

    private static abstract class ExecuteCaller {

        private Connection databaseConnection = null;

        public ExecuteCaller() {

        }

        public ExecuteCaller(Connection databaseConnection) {
            this.databaseConnection = databaseConnection;
        }

        /**
         * @param virtualizer
         * @throws Exception
         */
        public abstract void execute(JRFileVirtualizer virtualizer) throws Exception;

        public void call() throws Exception {
            JRFileVirtualizer virtualizer = null;
            try {
                //write report to temp file, protect out of memory (for big report)
                virtualizer = new JRFileVirtualizer(jasperReportFileVirtualizerMaxSize, reportTemporaryPath);
                execute(virtualizer);
            } finally {
                if (virtualizer != null) {
                    virtualizer.cleanup(); //clean up temp file
                }

                if (databaseConnection != null) {
                    databaseConnection.close(); //close database connection
                }
            }
        }
    }

    private static boolean fileIs(File file, String extension) {
        return file.getName().toLowerCase().endsWith(extension);
    }

    private static void exportToPdf(JasperPrint jasperPrint, File pdfFile) throws Exception {
        if (!fileIs(pdfFile, ".pdf")) {
            throw new IllegalArgumentException("require .pdf only");
        }

        JRPdfExporter exporter = new JRPdfExporter();
        exporter.setParameter(JRExporterParameter.OUTPUT_FILE, pdfFile);
        exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);

        exporter.exportReport();
    }

    private static void exportToExcel(JasperPrint jasperPrint, File excelFile) throws Exception {
        if (!fileIs(excelFile, ".xls")) {
            throw new IllegalArgumentException("require .xls only");
        }

        JExcelApiExporter exporter = new JExcelApiExporter();
        exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
        exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_COLUMNS, Boolean.TRUE);
        exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);
        exporter.setParameter(JRXlsExporterParameter.IS_IGNORE_GRAPHICS, Boolean.FALSE);
        //
        exporter.setParameter(JRXlsExporterParameter.OUTPUT_FILE, excelFile);
        exporter.setParameter(JRXlsExporterParameter.JASPER_PRINT, jasperPrint);

        exporter.exportReport();
    }

    private static void exportToWord(JasperPrint jasperPrint, File wordFile) throws Exception {
        if (!fileIs(wordFile, ".doc")) {
            throw new IllegalArgumentException("require .doc only");
        }

        JRRtfExporter exporter = new JRRtfExporter();
        exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
        exporter.setParameter(JRExporterParameter.OUTPUT_FILE, wordFile);

        exporter.exportReport();
    }

    /**
     * for export jasper report with database connection to output pdf file
     * (.pdf)
     *
     * @param jasper
     * @param databaseConnection
     * @param reportParam
     * @param pdfFile
     * @throws Exception
     */
    public static void exportWithConnectionToPdfFile(final JasperReport jasper, final Connection databaseConnection, final Map reportParam, final File pdfFile) throws Exception {
        new ExecuteCaller(databaseConnection) {

            @Override
            public void execute(JRFileVirtualizer virtualizer) throws Exception {
                reportParam.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
                JasperPrint jasperPrint = JasperFillManager.fillReport(jasper, reportParam, databaseConnection);
                exportToPdf(jasperPrint, pdfFile);
            }
        }.call();
    }

    /**
     * for export jasper report (.jasper input stream) with database connection
     * to output pdf file (.pdf)
     *
     * @param jasperInputStream
     * @param databaseConnection
     * @param reportParam
     * @param pdfFile
     * @throws Exception
     */
    public static void exportWithConnectionToPdfFile(final InputStream jasperInputStream, final Connection databaseConnection, final Map reportParam, final File pdfFile) throws Exception {
        try {
            JasperReport jasper = (JasperReport) JRLoader.loadObject(jasperInputStream);
            exportWithConnectionToPdfFile(jasper, databaseConnection, reportParam, pdfFile);
        } finally {
            if (jasperInputStream != null) {
                jasperInputStream.close();
            }
        }
    }

    /**
     * for export jasper report with database connection to output excel file
     * (.xls)
     *
     * @param jasper
     * @param databaseConnection
     * @param reportParam
     * @param excelFile
     * @throws Exception
     */
    public static void exportWithConnectionToExcelFile(final JasperReport jasper, final Connection databaseConnection, final Map reportParam, final File excelFile) throws Exception {
        new ExecuteCaller(databaseConnection) {

            @Override
            public void execute(JRFileVirtualizer virtualizer) throws Exception {
                reportParam.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
                JasperPrint jasperPrint = JasperFillManager.fillReport(jasper, reportParam, databaseConnection);
                exportToExcel(jasperPrint, excelFile);
            }
        }.call();
    }

    /**
     * for export jasper report (.jasper input stream) with database connection
     * to output excel file (.xls)
     *
     * @param jasperInputStream
     * @param databaseConnection
     * @param reportParam
     * @param excelFile
     * @throws Exception
     */
    public static void exportWithConnectionToExcelFile(final InputStream jasperInputStream, final Connection databaseConnection, final Map reportParam, final File excelFile) throws Exception {
        try {
            JasperReport jasper = (JasperReport) JRLoader.loadObject(jasperInputStream);
            exportWithConnectionToExcelFile(jasper, databaseConnection, reportParam, excelFile);
        } finally {
            if (jasperInputStream != null) {
                jasperInputStream.close();
            }
        }
    }

    /**
     * for export jasper report with database connection to output word file
     * (.doc)
     *
     * @param jasper
     * @param databaseConnection
     * @param reportParam
     * @param wordFile
     * @throws Exception
     */
    public static void exportWithConnectionToWordFile(final JasperReport jasper, final Connection databaseConnection, final Map reportParam, final File wordFile) throws Exception {
        new ExecuteCaller(databaseConnection) {

            @Override
            public void execute(JRFileVirtualizer virtualizer) throws Exception {
                reportParam.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
                JasperPrint jasperPrint = JasperFillManager.fillReport(jasper, reportParam, databaseConnection);
                exportToWord(jasperPrint, wordFile);
            }
        }.call();
    }

    /**
     * for export jasper report (.jasper input stream) with database connection
     * to output word file (.doc)
     *
     * @param jasperInputStream
     * @param databaseConnection
     * @param reportParam
     * @param wordFile
     * @throws Exception
     */
    public static void exportWithConnectionToWordFile(final InputStream jasperInputStream, final Connection databaseConnection, final Map reportParam, final File wordFile) throws Exception {
        try {
            JasperReport jasper = (JasperReport) JRLoader.loadObject(jasperInputStream);
            exportWithConnectionToWordFile(jasper, databaseConnection, reportParam, wordFile);
        } finally {
            if (jasperInputStream != null) {
                jasperInputStream.close();
            }
        }
    }

    /**
     * for export jasper report with beans to output pdf file (.pdf)
     *
     * @param jasper
     * @param models
     * @param reportParam
     * @param pdfFile
     * @throws Exception
     */
    public static void exportWithBeansToPdfFile(final JasperReport jasper, final Object[] models, final Map reportParam, final File pdfFile) throws Exception {
        new ExecuteCaller() {

            @Override
            public void execute(JRFileVirtualizer virtualizer) throws Exception {
                reportParam.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
                //pass models into jasper bean   
                JRBeanArrayDataSource beans = new JRBeanArrayDataSource(models);
                JasperPrint jasperPrint = JasperFillManager.fillReport(jasper, reportParam, beans);
                exportToPdf(jasperPrint, pdfFile);
            }
        }.call();
    }

    /**
     * for export jasper report (jasper input sream) with beans to output pdf
     * file (.pdf)
     *
     * @param jasperInputStream
     * @param models
     * @param reportParam
     * @param pdfFile
     * @throws Exception
     */
    public static void exportWithBeansToPdfFile(final InputStream jasperInputStream, final Object[] models, final Map reportParam, final File pdfFile) throws Exception {
        try {
            JasperReport jasper = (JasperReport) JRLoader.loadObject(jasperInputStream);
            exportWithBeansToPdfFile(jasper, models, reportParam, pdfFile);
        } finally {
            if (jasperInputStream != null) {
                jasperInputStream.close();
            }
        }
    }

    /**
     * for export jasper report with beans to output excel file (.xls)
     *
     * @param jasper
     * @param models
     * @param reportParam
     * @param excelFile
     * @throws Exception
     */
    public static void exportWithBeansToExcelFile(final JasperReport jasper, final Object[] models, final Map reportParam, final File excelFile) throws Exception {
        new ExecuteCaller() {

            @Override
            public void execute(JRFileVirtualizer virtualizer) throws Exception {
                reportParam.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
                JRBeanArrayDataSource beans = new JRBeanArrayDataSource(models);
                JasperPrint jasperPrint = JasperFillManager.fillReport(jasper, reportParam, beans);
                exportToExcel(jasperPrint, excelFile);
            }
        }.call();
    }

    /**
     * for export jasper report(.jasper input stream) with beans to output excel
     * file (.xls)
     *
     * @param jasperInputStream
     * @param models
     * @param reportParam
     * @param excelFile
     * @throws Exception
     */
    public static void exportWithBeansToExcelFile(final InputStream jasperInputStream, final Object[] models, final Map reportParam, final File excelFile) throws Exception {
        try {
            JasperReport jasper = (JasperReport) JRLoader.loadObject(jasperInputStream);
            exportWithBeansToExcelFile(jasper, models, reportParam, excelFile);
        } finally {
            if (jasperInputStream != null) {
                jasperInputStream.close();
            }
        }
    }

    /**
     * for export jasper report with beans to output word file (.doc)
     *
     * @param jasper
     * @param models
     * @param reportParam
     * @param wordFile
     * @throws Exception
     */
    public static void exportWithBeansToWordFile(final JasperReport jasper, final Object[] models, final Map reportParam, final File wordFile) throws Exception {
        new ExecuteCaller() {

            @Override
            public void execute(JRFileVirtualizer virtualizer) throws Exception {
                reportParam.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
                JRBeanArrayDataSource beans = new JRBeanArrayDataSource(models);
                JasperPrint jasperPrint = JasperFillManager.fillReport(jasper, reportParam, beans);
                exportToWord(jasperPrint, wordFile);
            }
        }.call();
    }

    /**
     * for export jasper report(.jasper input stream) with beans to output word
     * file (.doc)
     *
     * @param jasperInputStream
     * @param models
     * @param reportParam
     * @param wordFile
     * @throws Exception
     */
    public static void exportWithBeansToWordFile(final InputStream jasperInputStream, final Object[] models, final Map reportParam, final File wordFile) throws Exception {
        try {
            JasperReport jasper = (JasperReport) JRLoader.loadObject(jasperInputStream);
            exportWithBeansToWordFile(jasper, models, reportParam, wordFile);
        } finally {
            if (jasperInputStream != null) {
                jasperInputStream.close();
            }
        }
    }

    /**
     * for export jasper report with database connection to output jasper print
     * file (.jasperPrint)
     *
     * @param jasper
     * @param databaseConnection
     * @param reportParam
     * @param outputJasperPrintFile
     * @throws Exception
     */
    public static void exportJasperPrintWithConnectionToFile(final JasperReport jasper, final Connection databaseConnection, final Map reportParam, final File outputJasperPrintFile) throws Exception {
        new ExecuteCaller(databaseConnection) {

            @Override
            public void execute(JRFileVirtualizer virtualizer) throws Exception {
                reportParam.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
                JasperFillManager.fillReportToFile(jasper, outputJasperPrintFile.getPath(), reportParam, databaseConnection);
            }
        }.call();
    }

    /**
     * for export jasper report with database connection to output jasper print
     * file (.jasperPrint)
     *
     * @param jasperInputStream
     * @param databaseConnection
     * @param reportParam
     * @param outputJasperPrintFile
     * @throws Exception
     */
    public static void exportJasperPrintWithConnectionToFile(final InputStream jasperInputStream, final Connection databaseConnection, final Map reportParam, final File outputJasperPrintFile) throws Exception {
        new ExecuteCaller(databaseConnection) {

            @Override
            public void execute(JRFileVirtualizer virtualizer) throws Exception {
                try {
                    reportParam.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
                    JasperReport jasper = (JasperReport) JRLoader.loadObject(jasperInputStream);
                    JasperFillManager.fillReportToFile(jasper, outputJasperPrintFile.getPath(), reportParam, databaseConnection);
                } finally {
                    if (jasperInputStream != null) {
                        jasperInputStream.close();
                    }
                }
            }
        }.call();
    }

    /**
     * for export jasper report with beans to output jasper print file
     * (.jasperPrint)
     *
     * @param jasper
     * @param models
     * @param reportParam
     * @param outputJasperPrintFile
     * @throws Exception
     */
    public static void exportJasperPrintWithBeansToFile(final JasperReport jasper, final Object[] models, final Map reportParam, final File outputJasperPrintFile) throws Exception {
        new ExecuteCaller() {

            @Override
            public void execute(JRFileVirtualizer virtualizer) throws Exception {
                JRBeanArrayDataSource beans = new JRBeanArrayDataSource(models);
                JasperFillManager.fillReportToFile(jasper, outputJasperPrintFile.getPath(), reportParam, beans);
            }
        }.call();
    }

    /**
     * for export jasper print file to pdf file (.pdf)
     *
     * @param jasperPrintFile
     * @param pdfFile
     * @throws Exception
     */
    public static void exportFromJasperPrintFileToPdfFile(final File jasperPrintFile, final File pdfFile) throws Exception {
        new ExecuteCaller() {

            @Override
            public void execute(JRFileVirtualizer virtualizer) throws Exception {
                JasperPrint jasperPrint = JRLoader.loadJasperPrintFromFile(jasperPrintFile.getPath(), virtualizer);
                exportToPdf(jasperPrint, pdfFile);
            }
        }.call();
    }

    /**
     * for export jasper print file to excel file (.xls)
     *
     * @param jasperPrintFile
     * @param excelFile
     * @throws Exception
     */
    public static void exportFromJasperPrintFileToExcelFile(final File jasperPrintFile, final File excelFile) throws Exception {
        new ExecuteCaller() {

            @Override
            public void execute(JRFileVirtualizer virtualizer) throws Exception {
                JasperPrint jasperPrint = JRLoader.loadJasperPrintFromFile(jasperPrintFile.getPath(), virtualizer);
                exportToExcel(jasperPrint, excelFile);
            }
        }.call();
    }

    /**
     * for export jasper print file to word file (.doc)
     *
     * @param jasperPrintFile
     * @param wordFile
     * @throws Exception
     */
    public static void exportFromJasperPrintFileToWordFile(final File jasperPrintFile, final File wordFile) throws Exception {
        new ExecuteCaller() {

            @Override
            public void execute(JRFileVirtualizer virtualizer) throws Exception {
                JasperPrint jasperPrint = JRLoader.loadJasperPrintFromFile(jasperPrintFile.getPath(), virtualizer);
                exportToWord(jasperPrint, wordFile);
            }
        }.call();
    }
}
ใช้คู่กับตัว export สำเร็จรูป
package com.blogspot.na5cent.jasperlearning;

import java.io.File;
import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import org.apache.commons.io.FilenameUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

/**
 * @author redcrow
 * create 11/11/2014
 * link http://na5cent.blogspot.com/2013/12/jasperexporter-java.html
 */
public class ReportExporter {

    private static final Logger LOG = LoggerFactory.getLogger(ReportExporter.class);
    /**/
    private static final String JASPER_FILE_EXTENSION = ".jasper";
    private static final String JASPERPRINT_FILE_EXTENSION = ".jasperPrint";
    private static final String MSWORD_FILE_EXTENSION = ".doc";
    private static final String PDF_FILE_EXTENSION = ".pdf";
    private static final String EXCEL_FILE_EXTENSION = ".xls";
    /**/
    private final File jasperFile;
    private String exportFileName;
    private File exportFile;
    private File jasperPrintFile;
    private Map<String, Object> params;
    private File tempDirectory;
    private DataSource dataSource;
    private String lastestType;

    private ReportExporter(File jasperFile) {
        this.jasperFile = jasperFile;
        exportFileName = FilenameUtils.getBaseName(
                jasperFile.getName()
        );
    }

    private static boolean isJasperFile(File file) {
        return file.getName()
                .toLowerCase()
                .endsWith(JASPER_FILE_EXTENSION);
    }

    public static ReportExporter fromJasper(File jasperFile) {
        if (!isJasperFile(jasperFile) || !jasperFile.exists()) {
            throw new IllegalArgumentException(
                    "not " + JASPER_FILE_EXTENSION + " file"
            );
        }

        return new ReportExporter(jasperFile);
    }

    /**
     * root is class path
     *
     * @param jasperFilePath
     * @return
     */
    public static ReportExporter fromJasper(String jasperFilePath) {
        return fromJasper(new File(ReportExporter.class.getResource(
                jasperFilePath
        ).getPath()));
    }

    private Map<String, Object> getParams() {
        if (params == null) {
            params = new HashMap<>();
        }

        return params;
    }

    private File getTempDirectory() {
        if (tempDirectory == null) {
            String path = System.getProperty("java.io.tmpdir");
            tempDirectory = new File(path);
        }

        return tempDirectory;
    }

    public ReportExporter withTempDirectory(File tempDirectory) {
        this.tempDirectory = tempDirectory;
        return this;
    }

    public ReportExporter addParam(String key, Object value) {
        getParams().put(key, value);
        return this;
    }

    public ReportExporter setExportFileName(String fileName) {
        this.exportFileName = fileName;
        return this;
    }

    private File createJasperPrintFile() {
        return new File(
                getTempDirectory(),
                exportFileName + JASPERPRINT_FILE_EXTENSION
        );
    }

    public File getExportFile() {
        return exportFile;
    }

    public File getJasperPrintFile() {
        return jasperPrintFile;
    }

    public File getJasperFile() {
        return jasperFile;
    }

    public ReportExporter withDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
        return this;
    }

    private void filterReport2JasperPrint() {
        if (dataSource == null) {
            throw new NullPointerException("require dataSource.");
        }

        try {
            jasperPrintFile = createJasperPrintFile();
            JasperExporter.exportJasperPrintWithConnectionToFile(
                    new FileInputStream(jasperFile),
                    dataSource.getConnection(),
                    getParams(),
                    jasperPrintFile
            );
        } catch (Exception ex) {
            LOG.warn(null, ex);
            jasperPrintFile = null;
        }
    }

    private File newExportFile(String extension) {
        return new File(
                getTempDirectory(),
                exportFileName + extension
        );
    }

    private void print2WordFile() throws Exception {
        exportFile = newExportFile(MSWORD_FILE_EXTENSION);
        JasperExporter.exportFromJasperPrintFileToWordFile(
                jasperPrintFile,
                exportFile
        );
    }

    private void print2PdfFile() throws Exception {
        exportFile = newExportFile(PDF_FILE_EXTENSION);
        JasperExporter.exportFromJasperPrintFileToPdfFile(
                jasperPrintFile,
                exportFile
        );
    }

    private void print2ExcelFile() throws Exception {
        exportFile = newExportFile(EXCEL_FILE_EXTENSION);
        JasperExporter.exportFromJasperPrintFileToExcelFile(
                jasperPrintFile,
                exportFile
        );
    }

    /**
     * for clear export file caching
     */
    public void reset() {
        jasperPrintFile = null;
        exportFile = null;
    }

    private boolean match(String type) {
        if (!StringUtils.hasText(type)) {
            return false;
        }

        type = type.toLowerCase();
        return type.equals("word")
                || type.equals("excel")
                || type.equals("pdf");
    }

    /**
     * if export success will return true else false
     *
     * @return
     */
    public boolean isExported() {
        return exportFile != null;
    }

    private void exportFromType(String type) {
        try {
            type = type.toLowerCase();
            switch (type) {
                case "word":
                    print2WordFile();
                    break;
                case "excel":
                    print2ExcelFile();
                    break;
                default:
                    print2PdfFile();
                    break;
            }
        } catch (Exception ex) {
            LOG.warn(null, ex);
            exportFile = null;
        }
    }

    /**
     * @param type word, excel or pdf only
     * @return export file
     */
    public File export(String type) {
        if (!match(type)) {
            throw new IllegalArgumentException(
                    "type must word, excel or pdf only."
            );
        }

        if (jasperPrintFile == null) {
            filterReport2JasperPrint();
        }

        boolean useCache = type.equals(lastestType) && exportFile != null;
        if (jasperPrintFile != null && !useCache) {
            exportFromType(type);
            lastestType = type;
        }

        return exportFile;
    }
}
example
...
String JASPER_FILE = ...
DataSource dataSource = ...
...
...
ReportExporter exporter = ReportExporter.fromJasper(JASPER_FILE)
                .withDataSource(dataSource)
                .withTempDirectory(JasperReports.getTempDirectory());
...
...
exporter.addParam("hcodes", ...);
...
exporter.export("pdf");

ไม่มีความคิดเห็น:

แสดงความคิดเห็น