【问题标题】:Java easytable - Create rows in table using for loopJava easytable - 使用 for 循环在表中创建行
【发布时间】:2021-08-24 01:22:28
【问题描述】:

我正在尝试使用 vandeseer 的 easytable 创建一个带有标题行的表,然后使用 for 循环创建多个行。

我能做的最好的事情是创建两个单独的表格并将它们相互对齐。第一个表是标题行,第二个表是我希望 for 循环填充多行的地方。这是使用 PDFBox 渲染时的样子。

我当前的代码:

private void drawActiveCelUserRolesTable(PDPageContentStream contentStream, List<CelUser> users) {
        

            //draw table header
            Table activeUsersHeader = Table.builder()
                    .addColumnsOfWidth(100,100,100,100,100)
                    .addRow(Row.builder()
                            .add(TextCell.builder().text("Last Name").borderWidth(1).build())
                            .add(TextCell.builder().text("First Name").borderWidth(1).build())
                            .add(TextCell.builder().text("Role Name").borderWidth(1).build())
                            .add(TextCell.builder().text("Effective Date").borderWidth(1).build())
                            .add(TextCell.builder().text("Expiry Date").borderWidth(1).build())
                            .build())

                    .build();

            TableDrawer headerDrawer = TableDrawer.builder()
                    .contentStream(contentStream)
                    .startX(HEADER_TABLE_LOCATION_X)
                    .startY(HEADER_TABLE_LOCATION_Y-50)
                    .table(activeUsersHeader)
                    .build();

            headerDrawer.draw();

            Table activeUsersRows = Table.builder()
                    .addColumnsOfWidth(100,100,100,100,100)
                    .addRow(Row.builder()
                            .add(TextCell.builder().text("Joe").borderWidth(1).build())
                            .add(TextCell.builder().text("Bob").borderWidth(1).build())
                            .add(TextCell.builder().text("ADM").borderWidth(1).build())
                            .add(TextCell.builder().text("17/12/20").borderWidth(1).build())
                            .add(TextCell.builder().text("17/12/21").borderWidth(1).build())
                            .build())

                    .build();

            TableDrawer rowDrawer = TableDrawer.builder()
                    .contentStream(contentStream)
                    .startX(HEADER_TABLE_LOCATION_X)
                    .startY(HEADER_TABLE_LOCATION_Y - 67)
                    .table(activeUsersRows)
                    .build();

            rowDrawer.draw();
            
}

我尝试使用 for 循环来填充行,如下所示,但它显然不起作用。

            Table activeUsersRows = Table.builder()
                .addColumnsOfWidth(100,100,100,100,100)
                for (int i = 0; i < 5; i++) {

                    .addRow(Row.builder()
                            .add(TextCell.builder().text("Joe").borderWidth(1).build())
                            .add(TextCell.builder().text("Bob").borderWidth(1).build())
                            .add(TextCell.builder().text("ADM").borderWidth(1).build())
                            .add(TextCell.builder().text("17/12/20").borderWidth(1).build())
                            .add(TextCell.builder().text("17/12/21").borderWidth(1).build())
                            .build())

                    .build();

                }

我已尝试查看文档,但似乎找不到类似的内容。我见过使用 Table.TableBuilder 的示例,但由于某种原因,这些表不会在 pdf 上呈现。因此我只使用了 Table 类。

【问题讨论】:

    标签: java pdf pdfbox


    【解决方案1】:

    这应该很简单。你看过这个Q/A吗? 我猜你想在每个新页面上重复标题行,对吧?如果是这样,它应该很简单:

    RepeatedHeaderTableDrawer.builder()
        .table(createTable())
        .startX(50)
        .startY(100F)
        .endY(50F) // <-- If the table is bigger, a new page is started
        .build()
    

    也许也可以看看this class

    更新:

    如果真的只是使用for 循环来填充标题下方的行,则诀窍是将TableBuilder 分配给局部变量。下面用最小的工作解决方案说明了这一点:

    try (final PDDocument document = new PDDocument()) {
        final PDPage page = new PDPage(PDRectangle.A4);
        document.addPage(page);
    
        try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
    
            // Build the table
            final Table.TableBuilder myTableBuilder = Table.builder()
                    .addColumnsOfWidth(200, 200)
                    .padding(2)
                    .addRow(Row.builder()
                            .add(TextCell.builder().text("Header 1").build())
                            .add(TextCell.builder().text("Header 2").build())
                            .build());
    
            for (int i = 0; i < 20; i++) {
                myTableBuilder
                        .addRow(Row.builder()
                                .add(TextCell.builder().text("1st cell on row " + i).build())
                                .add(TextCell.builder().text("2nd cell on row " + i).build())
                                .build())
                        .build();
            }
    
            // Set up the drawer
            TableDrawer tableDrawer = TableDrawer.builder()
                    .contentStream(contentStream)
                    .startX(20f)
                    .startY(page.getMediaBox().getUpperRightY() - 20f)
                    .table(myTableBuilder.build())
                    .build();
    
            // And go for it!
            tableDrawer.draw();
        }
    
        document.save("example.pdf");
    }
    

    【讨论】:

    • 我认为操作需要帮助才能正确创建循环以添加多行。
    • 啊,是的,我认为你是对的!我添加了用于在 for 循环中填充多行的更新。
    猜你喜欢
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 2014-03-06
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多