Jasper报告如何使用RTL表创建excel xlsx文件?

时间:2015-12-06 11:31:00

标签: java jasper-reports export-to-excel

我们正在使用jasper版本6.我们可以导出到EXCEL(XLS和XLSX)。

以下代码适用于XLS并创建RTL表:

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

但是,当我尝试使用相同的代码制作XLSX文件时,工作表方向不会更改为RTL:

exporter = new JRXlsxExporter();
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(out));
SimpleXlsxReportConfiguration xlsxReportConfiguration =  new SimpleXlsxReportConfiguration();
xlsxReportConfiguration.setSheetDirection(RunDirectionEnum.RTL);
exporter.setConfiguration(xlsxReportConfiguration);

3 个答案:

答案 0 :(得分:1)

使用 v 6.1.1 测试的 jasper报告库中的错误,在导出后添加以下代码,它将正常工作(poi库包含在jasper报告中,因此POI中没有错误......)。

ng-include

Current bug report tracker on jaspersoft community

答案 1 :(得分:0)

我在最新版本的JasperReports 6.1中在XLSX中生成报告时出现问题,但此代码适用于我:

首先,我配置了jasper print

<thing_list>

之后,我为生成的报告配置输出,在我的情况下,报告将由ByteArrayOutputStream在内存中管理:

    JRSwapFile swapFile = new JRSwapFile(".", 1024, 1024);
    JRVirtualizer virtualizer = new JRSwapFileVirtualizer(100, swapFile, true);
    parameters.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);

    JasperPrint print = JasperFillManager.fillReport(stream, parameters, dbConnection);
    List<JasperPrint> prints = new ArrayList<JasperPrint>();
    prints.add(print);

我创建一个JRXlsxExporter实例,用于生成扩展名为.xslx的文件,并放置打印机和输出:

    ByteArrayOutputStream output = new ByteArrayOutputStream();

下一步是为导出器创建报告配置,当我把这段代码放到我的报告中时!所以你必须使用它!:

    JRXlsxExporter exporter = new JRXlsxExporter();
    exporter.setExporterInput(SimpleExporterInput.getInstance(prints));
    exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(output));

最后,生成报告并关闭outputStream:

    SimpleXlsxReportConfiguration xlsxReportConfiguration =  new SimpleXlsxReportConfiguration();
    xlsxReportConfiguration.setSheetDirection(RunDirectionEnum.RTL);
    exporter.setConfiguration(xlsxReportConfiguration);

我希望这对你有用

答案 2 :(得分:0)

我最终使用了下面的代码(它很昂贵但有效),在 https://community.jaspersoft.com/questions/523041/right-left-arabic-reports

中提到
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());
            }
        }
    }
}

像这样使用:

Exporter exporter;

ByteArrayOutputStream out = new ByteArrayOutputStream();
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(out));

JasperPrint jasperPrint = JasperFillManager.fillReport(report,
                    params, dataSource != null ? new JRMapArrayDataSource(
                            dataSource) : new JREmptyDataSource());
ReportUtils.mirrorLayout(jasperPrint);

exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
exporter.exportReport();
return out.toByteArray();