【问题标题】:How to make a report page direction to change to "rtl"?如何使报表页面方向更改为“rtl”?
【发布时间】:2014-02-04 13:13:15
【问题描述】:

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

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

我google了很多,终于找到了一个属性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();

但不允许设置此参数,我得到错误。
如果您对如何更改报告页面方向(或换句话说,在特定区域设置整个报告)进行更改有任何经验,请提供帮助。

【问题讨论】:

  • 我想知道您想要实现什么...当您导出到 Excel 时,您的期望是什么?我在问,因为我真的看不到它。显然,单元格不会从右到左翻转和计数,这没有多大意义。图表?我相信 Axis 应该保持不变。好吧,也许数字可能会改变,但这与 RTL 无关......或者我对轴有误?您不会翻转其他类型的图表...那么到底是什么问题?
  • 例如,在 LTR 语言中,如果您有一个用于计数的列,最好位于左侧的第一列,但在 RTL 语言中,最好位于最右侧的列中。我想要类似excel的页面布局->从右到左整个页面。
  • 我明白了。问题是,它在 Excel 本身中并不像这样工作。还是我错了?无论如何,您似乎需要(至少)创建两个报告模板(一个用于 LTR,一个用于 RTL)并在运行时选择有效的一个。我看不到任何对 Excel 报告中的列重新排序的方法。也许是一些自定义出口商?

标签: java internationalization jasper-reports


【解决方案1】:

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

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版的一个bug),你必须JRXlsExporter

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多