Java easytable - 使用 for 循环在 table 中创建行
Java easytable - Create rows in table using for loop
我正在尝试使用 vandeseer 的 easytable 创建一个带有 header 行的 table,然后使用 for 循环创建一些行。
我能做的最好的就是创建两个单独的 table 并将它们彼此对齐。第一个 table 是 header 行,第二个 table 我希望 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 的示例,但由于某些原因,这些 table 不会呈现在 pdf 上。因此,为什么我只使用 Table class.
这应该很简单。你看过这个 Q/A 了吗?
我猜您想在每个新页面上重复 header 行,对吗?如果是这样,它应该很简单:
RepeatedHeaderTableDrawer.builder()
.table(createTable())
.startX(50)
.startY(100F)
.endY(50F) // <-- If the table is bigger, a new page is started
.build()
也许还可以看看 this class。
更新:
如果它真的只是关于使用 for
循环来填充 header 下面的行,技巧是将 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");
}
我正在尝试使用 vandeseer 的 easytable 创建一个带有 header 行的 table,然后使用 for 循环创建一些行。
我能做的最好的就是创建两个单独的 table 并将它们彼此对齐。第一个 table 是 header 行,第二个 table 我希望 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 的示例,但由于某些原因,这些 table 不会呈现在 pdf 上。因此,为什么我只使用 Table class.
这应该很简单。你看过这个 Q/A 了吗? 我猜您想在每个新页面上重复 header 行,对吗?如果是这样,它应该很简单:
RepeatedHeaderTableDrawer.builder()
.table(createTable())
.startX(50)
.startY(100F)
.endY(50F) // <-- If the table is bigger, a new page is started
.build()
也许还可以看看 this class。
更新:
如果它真的只是关于使用 for
循环来填充 header 下面的行,技巧是将 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");
}