如何使报表页面方向更改为“rtl”?

时间:2014-02-04 13:13:16

标签: java internationalization jasper-reports

我使用 iReport 生成的jrxml文件,使用 JasperReports 创建报告。

我的应用程序是多语言的(英语(LTR)和波斯语(RTL))。在生成的表格中,关于文本的方向,我需要交换整个页面方向。另外,我使用区域设置功能。

我搜索了很多内容,最后找到了一个属性JRXlsAbstractExporter.PROPERTY_SHEET_DIRECTION, "RTL",但在excel生成的格式中设置此属性对我的报告没有任何影响。

    params.put(JRXlsAbstractExporter.PROPERTY_SHEET_DIRECTION, "RTL");
    JasperPrint jasperPrint = JasperFillManager.fillReport(report,params, 
           dataSource != null ? new JRMapArrayDataSource(dataSource) : new JREmptyDataSource());    

我尝试的另一件事是在导出器参数中设置如下:

    JRExporter exporter = new JRXlsxExporter();
    exporter.setParameter(JRXlsAbstractExporter.PROPERTY_SHEET_DIRECTION, "RTL");
    exporter.exportReport();

但不允许设置此参数,我收到错误 如果您有任何关于如何制作报告页面方向的经验(或者换句话说,在特定区域设置中镜像整个报告),请改变请帮助。

1 个答案:

答案 0 :(得分:2)

据我搜索没有属性,你可以使用下面的util class:

package foo.bar.utils.export;

import java.util.Iterator;
import java.util.List;

import net.sf.jasperreports.engine.JRPrintElement;
import net.sf.jasperreports.engine.JRPrintFrame;
import net.sf.jasperreports.engine.JRPrintPage;
import net.sf.jasperreports.engine.JasperPrint;

/**
 * Report utilities
 * Please refer to: http://community.jaspersoft.com/questions/523041/right-left-arabic-reports
 * There is another solution at: http://jaspermirror.sourceforge.net/
 * which is not used here
 * @author AFattahi
 *
 */
public class ReportUtils {

    private ReportUtils(){

    }
    /**
     * mirror each page layout
     * @param print
     */
    public static void mirrorLayout(JasperPrint print) {
        int pageWidth = print.getPageWidth();
        for (Object element : print.getPages()) {
            JRPrintPage page = (JRPrintPage) element;
            mirrorLayout(page.getElements(), pageWidth);
        }
    }

    /**
     * mirror a list of elements
     * @param print
     */
    protected static void mirrorLayout(List<?> elements, int totalWidth) {
        for (Iterator<?> it = elements.iterator(); it.hasNext();) {
            JRPrintElement element = (JRPrintElement) it.next();
            int mirrorX = totalWidth - element.getX() - element.getWidth();
            element.setX(mirrorX);

            if (element instanceof JRPrintFrame) {
                JRPrintFrame frame = (JRPrintFrame) element;
                mirrorLayout(frame.getElements(), frame.getWidth());
            }
        }
    }
}

请注意JRXlsxExporter不支持RTL(似乎是版本6中的错误),您必须JRXlsExporter

exporter = new JRXlsExporter();
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(out));
SimpleXlsReportConfiguration xlsReportConfig = new SimpleXlsReportConfiguration();
xlsReportConfig.setSheetDirection(RunDirectionEnum.RTL);
exporter.setConfiguration(xlsReportConfig);