如何在Jaspersoft Studio中呈现HTML表

如何在Jaspersoft Studio中呈现HTML表,html,html-table,jasper-reports,Html,Html Table,Jasper Reports,我在数据库中存储了一个html标记,如: 1 2 数据 数据 大体上,以下是解决此问题的方法: 将HTML表格转换为CSV格式。 这可以通过使用或来完成 一定要去掉任何格式 将每个CSV元素从HTML转换为标记。 这将用*1*替换

我在数据库中存储了一个html标记,如:


1
2
数据
数据

大体上,以下是解决此问题的方法:

  • 将HTML表格转换为CSV格式。
    • 这可以通过使用或来完成
    • 一定要去掉任何格式
  • 将每个CSV元素从HTML转换为标记。
    • 这将用
      *1*
      替换
      <1
  • 将标记转换为简单HTML。
    • 使用高性能发动机,例如
    • 这必须将
      *1*
      转换为
      1
      ,JasperReports可以对其进行解析
    • 如果JasperReports可以呈现标记,则不需要进行转换
  • 为数据创建一个
  • 确保字段标记为文本
  • 呈现CSV数据源。
    • 如果列数已知,请像往常一样使用JasperReports
    • 如果列数可能不同,请使用
  • 还有其他的可能性,这取决于您对XSLT的专业知识

    然而,这种做法是不明智的。一种简单得多的方法是确定为什么要将HTML表添加到数据库中,而不是作为结构化的关系数据。更改将数据作为关系数据输入数据库的过程,然后让您的报表使用这些数据,而无需进行多层次的转换

    简言之,尝试重新构建问题的框架,因为将非关系数据强制转换为适合JasperReports处理的关系形式很少有效或容易


    另请参见:

    概括地说,以下是解决此问题的方法:

  • 将HTML表格转换为CSV格式。
    • 这可以通过使用或来完成
    • 一定要去掉任何格式
  • 将每个CSV元素从HTML转换为标记。
    • 这将用
      *1*
      替换
      <1
  • 将标记转换为简单HTML。
    • 使用高性能发动机,例如
    • 这必须将
      *1*
      转换为
      1
      ,JasperReports可以对其进行解析
    • 如果JasperReports可以呈现标记,则不需要进行转换
  • 为数据创建一个
  • 确保字段标记为文本
  • 呈现CSV数据源。
    • 如果列数已知,请像往常一样使用JasperReports
    • 如果列数可能不同,请使用
  • 还有其他的可能性,这取决于您对XSLT的专业知识

    然而,这种做法是不明智的。一种简单得多的方法是确定为什么要将HTML表添加到数据库中,而不是作为结构化的关系数据。更改将数据作为关系数据输入数据库的过程,然后让您的报表使用这些数据,而无需进行多层次的转换

    简言之,尝试重新构建问题的框架,因为将非关系数据强制转换为适合JasperReports处理的关系形式很少有效或容易

    另请参见:

    灵感来自贾维斯,主要是为了好玩

    正如您正确指出的,您需要使用HtmlComponent
    ,但这将创建一个图像,您不仅会遇到缩放问题,还会遇到文本选择和搜索问题。此外,正如Dave Jarvis在其报告中所述,这通常不是向jasper reports传递数据的合适方式

    但是谁会关心让你的html呈现出来的一切呢
  • 我们需要将html转换为,我们将使用

    公共类HtmlTableDataSource实现JRDasource{
    私有列表行;
    私有迭代器;
    私营部门;
    公共HtmlTableDataSource(字符串html){
    超级();
    init(html);
    }
    私有void init(字符串html){
    this.rows=new ArrayList();
    Document doc=Jsoup.parse(html);
    元素表=文件选择(“表”);
    if(tables==null | | tables.isEmpty()){
    回来
    }
    //获取第一个表忽略其他表
    元素表=表。获取(0);
    //获取所有行
    元素trs=表格。选择(“tr”);
    用于(元素:trs){
    //将所有列添加到列表中
    this.rows.add(element.select(“td”));
    }
    this.iterator=this.rows.iterator();
    }
    @凌驾
    公共对象getFieldValue(JRField字段)引发JRException{
    如果(字段==null | |当前行==null){
    返回null;
    }
    试一试{
    int col=Integer.parseInt(field.getName());
    if(col
    
  • 这将实例化我们的数据源,jasper reports将在该数据源上循环调用
    next()
    方法和
    getFieldValue(JRField字段)
    来评估字段

    后果

    其他考虑 我对JRDataSource的实现既快速又有趣,当然可以大大改进

    动态列,如果只有一个最大值,并且它们的大小是固定的,那么您可以使用类似于此的解决方案,如果不切换,则可以根据需要修改JRDataSource

    是的,我将
    更改为
    这是另一个问题,在这种情况下,您可以
    public class HtmlTableDataSource implements JRDataSource {
    
        private List<Elements> rows;
        private Iterator<Elements> iterator;
        private Elements currentRow;
    
        public HtmlTableDataSource(String html) {
            super();
            init(html);
        }
    
        private void init(String html) {
            this.rows = new ArrayList<>();
            Document doc = Jsoup.parse(html);
            Elements tables = doc.select("table"); 
            if (tables == null || tables.isEmpty()) {
               return;
            }
            // Get first table ignore others
            Element table = tables.get(0);
            //Get all rows
            Elements trs = table.select("tr");
            for (Element element : trs) {
                //add all of our columns to our list
                this.rows.add(element.select("td"));
            }
    
            this.iterator = this.rows.iterator();
        }
    
        @Override
        public Object getFieldValue(JRField field) throws JRException {
            if (field==null||currentRow==null){
                return null;
            }
            try {
                int col = Integer.parseInt(field.getName());
                if (col<currentRow.size()){
                    return currentRow.get(col).html();
                }
            } catch (NumberFormatException e) {
                throw new JRException("Using the HTMLTableDataSource, the field name need to be numbers starting from 0");
            }
            return null;
        }
    
        @Override
        public boolean next() throws JRException {
            if (this.iterator == null || !this.iterator.hasNext()) {
                return false;
            }
            this.currentRow = this.iterator.next();
            return true;
        }
    }
    
    <?xml version="1.0" encoding="UTF-8"?>
    <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="htmlTable" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="597c0716-df6b-42ec-a7c8-863eb1b7174a">
        <style name="Table_TD" mode="Opaque" backcolor="#FFFFFF">
            <box>
                <pen lineWidth="0.5" lineColor="#000000"/>
                <topPen lineWidth="0.5" lineColor="#000000"/>
                <leftPen lineWidth="0.5" lineColor="#000000"/>
                <bottomPen lineWidth="0.5" lineColor="#000000"/>
                <rightPen lineWidth="0.5" lineColor="#000000"/>
            </box>
        </style>
        <subDataset name="TableDataset" uuid="998ba41a-db15-454b-a081-bc8613899c31">
            <field name="0" class="java.lang.String"/>
            <field name="1" class="java.lang.String"/>
        </subDataset>
        <summary>
            <band height="30">
                <componentElement>
                    <reportElement x="0" y="0" width="550" height="30" uuid="5d0d5bcb-a094-4446-a5e9-09de629cefc7"/>
                    <jr:table xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd">
                        <datasetRun subDataset="TableDataset" uuid="eac86c28-fad2-433a-a02e-0dd419d9e135">
                            <dataSourceExpression><![CDATA[new my.package.HtmlTableDataSource("<table style='border: 1px solid black'><tr><td  style='border: 1px solid black'><b>1</b></td><td  style='border: 1px solid black'><b>2</b></td></tr><tr><td  style='border: 1px solid black'>Data</td><td  style='border: 1px solid black'>Data</td></tr></table>")]]></dataSourceExpression>
                        </datasetRun>
                        <jr:column width="180" uuid="86ce5c9c-d285-4a51-bf84-30fa9c55579f">
                            <jr:detailCell style="Table_TD" height="30">
                                <textField>
                                    <reportElement x="0" y="0" width="180" height="30" uuid="3acb437b-8b59-4e78-ac1b-4f096f960e89"/>
                                    <textElement textAlignment="Center" verticalAlignment="Middle" markup="html"/>
                                    <textFieldExpression><![CDATA[$F{0}]]></textFieldExpression>
                                </textField>
                            </jr:detailCell>
                        </jr:column>
                        <jr:column width="150" uuid="741517bf-5107-4b13-9d61-44209f266c6c">
                            <jr:detailCell style="Table_TD" height="30">
                                <textField>
                                    <reportElement x="0" y="0" width="150" height="30" uuid="1174a60c-8b9e-441b-a9ef-4340b0cd7b68"/>
                                    <textElement textAlignment="Center" verticalAlignment="Middle" markup="html"/>
                                    <textFieldExpression><![CDATA[$F{1}]]></textFieldExpression>
                                </textField>
                            </jr:detailCell>
                        </jr:column>
                    </jr:table>
                </componentElement>
            </band>
        </summary>
    </jasperReport>