Экспорт пользовательского шаблона HTML

#html #jasper-reports #export

#HTML #jasper-отчеты #экспорт

Вопрос:

Справочная информация

Экспорт в HTML генерирует следующее:

 <html>
    <head>
        <title></title>
        <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
        <style type="text/css">
            a {text-decoration: none}
        </style>
    </head>
    <body vlink="#000000" text="#000000" link="#000000" alink="#000000">
        <table width="100%" border="0" cellspacing="0" cellpadding="0">
            <tbody>
                <tr>
                    <td width="50%">amp;nbsp;</td>
                    <td align="center">
                        <!-- The report -->
                    </td>
                    <td width="50%">amp;nbsp;</td>
                </tr>
            </tbody>
        </table>
    </body>
</html>
  

Проблема

Отчет располагается по центру страницы, но должен быть выровнен по левому краю.

Прежнее решение

Использование параметра HTML_HEADER от JRHtmlExporter выглядело многообещающе, но классы были устаревшими. Это было решением:

 JRHtmlExporter exporter = new JRHtmlExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRHtmlExporterParameter.HTML_HEADER, 
    "<html>" 
    "<head>" 
    "  <title></title>" 
    "  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>" 
    "  <link rel="stylesheet" type="text/css" href="css/jasper.css" />" 
    "  <style type="text/css">" 
    "    a {text-decoration: none}" 
    "  </style>" 
    "</head>" 
    "<body text="#000000" link="#000000" alink="#000000" vlink="#000000">" 
    "<table width="100%" cellpadding="0" cellspacing="0" border="0">" 
    "<tr><td width="50%">amp;nbsp;</td><td align="center">");
exporter.exportReport();
  

Теперь я должен использовать классы net.sf.jasperreports.export.HtmlExporter и net.sf.jasperreports.export.SimpleHtmlReportConfiguration таким образом:

 HtmlExporter exporterHTML = new HtmlExporter();
SimpleExporterInput exporterInput = new SimpleExporterInput(report.getJasperPrint());
exporterHTML.setExporterInput(exporterInput);
HtmlExporterOutput exporterOutput = new SimpleHtmlExporterOutput(out);
exporterHTML.setExporterOutput(exporterOutput );

SimpleHtmlReportConfiguration reportExportConfiguration = new SimpleHtmlReportConfiguration();
reportExportConfiguration.setWhitePageBackground(false);
reportExportConfiguration.setRemoveEmptySpaceBetweenRows(true);
exporterHTML.setConfiguration(reportExportConfiguration);

exporterHTML.exportReport(); 
  

Как бы вы это исправили?

Окружающая среда

  • JasperReports v5.5.2
  • Java v1.6.0_38

Ответ №1:

HTML_HEADER Параметр JRHtmlExporterParameter был заменен на:

HtmlExporterConfiguration.getHtmlHeader()

Например:

 public byte[] exportHtml(final JasperPrint print) {
    final Exporter exporter = new HtmlExporter();
    final ByteArrayOutputStream out = new ByteArrayOutputStream();

    exporter.setConfiguration(createHtmlConfiguration());
    exporter.setExporterOutput(new SimpleHtmlExporterOutput(out));
    exporter.setExporterInput(new SimpleExporterInput(print));
    exporter.exportReport();

    return out.toByteArray();
}

private HtmlExporterConfiguration createHtmlConfiguration()
        throws IOException {
    SimpleHtmlExporterConfiguration shec
            = new SimpleHtmlExporterConfiguration();

    shec.setHtmlHeader(getHtmlHeader());
    shec.setHtmlFooter(getHtmlFooter());

    return shec;
}

private String getHtmlHeader() {
    StringBuffer sb = new StringBuffer();
    sb.append("<html>");
    sb.append("<head>");
    sb.append("  <title></title>");
    sb.append("  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>");
    sb.append("  <style type="text/css">");
    sb.append("    a {text-decoration: none}");
    sb.append("  </style>");
    sb.append("</head>");
    sb.append("<body text="#000000" link="#000000" alink="#000000" vlink="#000000">");
    sb.append("<table width="100%" cellpadding="0" cellspacing="0" border="0">");
    sb.append("<tr><td align="left">");

    return sb.toString();
}

private String getHtmlFooter() {
  // Close the opening tags from getHtmlHeader()...
}
  

Еще лучше было бы использовать внешние ресурсы (такие как база данных, файл или веб-страница) для содержимого HTML, а не жестко закодированные строки.