iTextSharp):带有 headers 和 subheaders 的表格
iText(Sharp): tables with headers and subheaders
我正在使用 iText(iTextSharp 版本 5.5.7)并且我正在创建一个 PdfPTable,其中对行中的数据进行排序。举一个具体的例子,假设我的数据看起来像这样(包括我的 headers - h1、h2 和 h3):
+---+---+---+
|h1 |h2 |h3 |
+---+---+---+
| A | B | C |
+---+---+---+
| A | B | D |
+---+---+---+
| A | E | F |
+---+---+---+
| K | G | H |
+---+---+---+
| K | G | I |
+---+---+---+
| K | G | J |
+---+---+---+
我已经开始工作了,然后我开始设置 PdfPCell 的 Rowspan 属性 这样我就可以避免打印重复的文本。这也很好用,我得到的是:
+---+---+---+
|h1 |h2 |h3 |
+---+---+---+
| A | B | C |
| | +---+
| | | D |
| +---+---+
| | E | F |
+---+---+---+
| K | G | H |
| | +---+
| | | I |
| | +---+
| | | J |
+---+---+---+
问题是,我打了分页符,我看到的是这样的:
+---+---+---+
|h1 |h2 |h3 |
+---+---+---+
| A | B | C |
| | +---+
| | | D |
| +---+---+
| | E | F |
+---+---+---+
| K | G | H |
+---+---+---+
Page Break
+---+---+---+
|h1 |h2 |h3 |
+---+---+---+
| | | I |
| | +---+
| | | J |
+---+---+---+
我想要的是,当第二页开始时,我希望跨单元格(在本例中为 'K' 和 'G')为 re-printed,以便用户有一些知道发生了什么事。
我需要的与 HeaderRow 类似,但我需要 header 行随着行的发出而改变。
关于如何使这项工作有任何想法吗?
您可以为 PdfPTable
定义页眉(和页脚)行,但这不会解决您的问题,因为这些页眉(或页脚)行重复 完整的行 而你只想重复一行的一部分。
这并不意味着您的要求无法满足。您可以通过在单元格事件中添加内容而不是直接将其添加到单元格来解决此问题。
例如:您目前像这样添加 A
、B
、K
和 G
等内容:
PdfPCell cell = new PdfPCell(new Phrase("A"));
cell.setRowspan(3);
table.addCell(cell);
如果此单元格被拆分并分布在多个页面上,则内容"A"
只会出现在第一页上。后续页面将没有任何内容。
您可以通过添加一个 empty 单元格来解决此问题,并为其定义单元格事件:
PdfPCell cell = new PdfPCell();
cell.setCellEvent(new MyCellEvent("A"));
cell.setRowspan(3);
table.addCell(cell);
您现在必须编写 PdfPCellEvent
接口的实现并以使用坐标添加内容(在本例中为 "A"
)的方式实现 cellLayout
方法作为参数传递给此方法。
如需灵感(以及关于如何将我的 Java 代码调整为 .NET 的想法),请参阅 Can I use an iTextSharp cell event to repeat data on the next page when a row is split?
我正在使用 iText(iTextSharp 版本 5.5.7)并且我正在创建一个 PdfPTable,其中对行中的数据进行排序。举一个具体的例子,假设我的数据看起来像这样(包括我的 headers - h1、h2 和 h3):
+---+---+---+
|h1 |h2 |h3 |
+---+---+---+
| A | B | C |
+---+---+---+
| A | B | D |
+---+---+---+
| A | E | F |
+---+---+---+
| K | G | H |
+---+---+---+
| K | G | I |
+---+---+---+
| K | G | J |
+---+---+---+
我已经开始工作了,然后我开始设置 PdfPCell 的 Rowspan 属性 这样我就可以避免打印重复的文本。这也很好用,我得到的是:
+---+---+---+
|h1 |h2 |h3 |
+---+---+---+
| A | B | C |
| | +---+
| | | D |
| +---+---+
| | E | F |
+---+---+---+
| K | G | H |
| | +---+
| | | I |
| | +---+
| | | J |
+---+---+---+
问题是,我打了分页符,我看到的是这样的:
+---+---+---+
|h1 |h2 |h3 |
+---+---+---+
| A | B | C |
| | +---+
| | | D |
| +---+---+
| | E | F |
+---+---+---+
| K | G | H |
+---+---+---+
Page Break
+---+---+---+
|h1 |h2 |h3 |
+---+---+---+
| | | I |
| | +---+
| | | J |
+---+---+---+
我想要的是,当第二页开始时,我希望跨单元格(在本例中为 'K' 和 'G')为 re-printed,以便用户有一些知道发生了什么事。
我需要的与 HeaderRow 类似,但我需要 header 行随着行的发出而改变。
关于如何使这项工作有任何想法吗?
您可以为 PdfPTable
定义页眉(和页脚)行,但这不会解决您的问题,因为这些页眉(或页脚)行重复 完整的行 而你只想重复一行的一部分。
这并不意味着您的要求无法满足。您可以通过在单元格事件中添加内容而不是直接将其添加到单元格来解决此问题。
例如:您目前像这样添加 A
、B
、K
和 G
等内容:
PdfPCell cell = new PdfPCell(new Phrase("A"));
cell.setRowspan(3);
table.addCell(cell);
如果此单元格被拆分并分布在多个页面上,则内容"A"
只会出现在第一页上。后续页面将没有任何内容。
您可以通过添加一个 empty 单元格来解决此问题,并为其定义单元格事件:
PdfPCell cell = new PdfPCell();
cell.setCellEvent(new MyCellEvent("A"));
cell.setRowspan(3);
table.addCell(cell);
您现在必须编写 PdfPCellEvent
接口的实现并以使用坐标添加内容(在本例中为 "A"
)的方式实现 cellLayout
方法作为参数传递给此方法。
如需灵感(以及关于如何将我的 Java 代码调整为 .NET 的想法),请参阅 Can I use an iTextSharp cell event to repeat data on the next page when a row is split?