我有一张主桌'表' 3列宽度{50f,25f,25f}。我创建了2个嵌套表。 在嵌套表1中,
PdfPTable nested12 = new PdfPTable(1);
PdfPCell cell1 = new PdfPCell(new Phrase("cell1 of nested table1", bodyFontnormalItalic));
cell1.Border = Rectangle.BOTTOM_BORDER;
nested12.AddCell(cell1);
PdfPCell cell2 = new PdfPCell(new Phrase("cell2 of nested table1", bodyFontLight));
cell2.Border = Rectangle.BOTTOM_BORDER;
nested12.AddCell(cell2);
PdfPCell cell3 = new PdfPCell(new Phrase("cell3 of nested table1", bodyFontLight));
cell3.Border = Rectangle.BOTTOM_BORDER;
nested12.AddCell(cell3);
PdfPCell nesthousing12 = new PdfPCell(nested12);
nesthousing12.Padding = 0f;
nesthousing12.Colspan = 1;
table.AddCell(nesthousing12);
嵌套表2是:
PdfPTable nestedTable2 = new PdfPTable(1);
PdfPCell cell4 = new PdfPCell(new Phrase("cell1 of nested table 2", bodyFontnormalItalic));
cell4.Border = Rectangle.BOTTOM_BORDER;
nestedTable2.AddCell(cell4); //here 2 cells of colspan=1 needed
PdfPCell cell5 = new PdfPCell(new Phrase("cell2 of nested table 2", bodyFontLight));
cell5.Border = Rectangle.BOTTOM_BORDER;
nestedTable2.AddCell(cell5);
PdfPCell cell6 = new PdfPCell(new Phrase("cell3 of nested table 3", bodyFontLight));
cell6.Border = Rectangle.BOTTOM_BORDER;
nestedTable2.AddCell(cell6);
PdfPCell nesthousing = new PdfPCell(nestedTable2);
nesthousing.Padding = 0f;
nesthousing.Colspan = 2;
table.AddCell(nesthousing);
对于嵌套表2,我使用了Colspan = 2。我需要以bellow格式的nestedtable2。嵌套table2的第一行应该有2个单元格。
那我怎么能这样创造呢?能帮帮我吗。
上表是我需要的确切输出。所以我创建了一个包含6列的表。用于地址和其他详细信息的3列内部表。
答案 0 :(得分:1)
我忽略了你问题中的代码,因为我不明白。我只了解您分享的图像,并且我编写了一些伪代码,允许您创建一个如下所示的表:
这或多或少看起来像是想要的结果,不是吗?现在由您将以下伪代码转换为C#。
这是绘制主表边框的代码:
public class BorderEvent implements PdfPTableEvent {
public void tableLayout(PdfPTable table, float[][] widths, float[] heights, int headerRows, int rowStart, PdfContentByte[] canvases) {
float width[] = widths[0];
float x1 = width[0];
float x2 = width[width.length - 1];
float y1 = heights[0];
float y2 = heights[heights.length - 1];
PdfContentByte cb = canvases[PdfPTable.LINECANVAS];
cb.rectangle(x1, y1, x2 - x1, y2 - y1);
cb.stroke();
}
}
这是创建完整表格的代码:
public void createPdf(String dest) throws IOException, DocumentException {
Document document = new Document(PageSize.A4.rotate());
PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
PdfPTable table = new PdfPTable(4);
table.setTableEvent(new BorderEvent());
table.setWidths(new int[]{1, 12, 8, 1});
table.getDefaultCell().setBorder(Rectangle.NO_BORDER);
// first row
PdfPCell cell = new PdfPCell(new Phrase("Main table"));
cell.setBorder(Rectangle.NO_BORDER);
cell.setColspan(4);
table.addCell(cell);
// second row
table.addCell("");
table.addCell("nested table 1");
table.addCell("nested table 2");
table.addCell("");
// third row
// third row cell 1
table.addCell("");
// third row cell 2
PdfPTable table1 = new PdfPTable(1);
table1.addCell("cell 1 of nested table 1");
table1.addCell("cell 2 of nested table 1");
table1.addCell("cell 2 of nested table 1");
table.addCell(new PdfPCell(table1));
// third row cell 3
PdfPTable table2 = new PdfPTable(2);
table2.getDefaultCell().setMinimumHeight(10);
table2.addCell("");
table2.addCell("");
cell = new PdfPCell(new Phrase("cell 2 of nested table 2"));
cell.setColspan(2);
table2.addCell(cell);
cell = new PdfPCell(new Phrase("cell 3 of nested table 2"));
cell.setColspan(2);
table2.addCell(cell);
table.addCell(new PdfPCell(table2));
// third row cell 4
table.addCell("");
// fourth row
cell = new PdfPCell();
cell.setColspan(4);
cell.setBorder(Rectangle.NO_BORDER);
cell.setMinimumHeight(16);
table.addCell(cell);
document.add(table);
document.close();
}
如您所见,嵌套表2需要有2列,以便您可以在其第一行中包含两个单元格。显然,您需要为用于第2行和第3行的两个单元格定义2的colspan。
您可能已经注意到伪代码实际上正在使用Java代码。解释该代码并将其移植到C#应该不是问题。
你似乎有诀窍让简单的东西变得复杂。在原始图形中,您在所需结果周围绘制了一个额外的矩形。在我的回答中,我模仿了NestedTables4示例中的绘图,你对结果不满意。
现在您已经简化了绘图,我制作了一个更容易理解的NestedTables5示例。结果如下:
尽管简单,但仍然让问题听起来很复杂。你说(我引用):我创建了一个包含6列的表。 3列的内表。但这没有意义,是吗?
如果要在一个表中创建这个完整的结构,使用两个内部表,则需要一个包含7个列的表:
第一个单元格具有colspan 3并包含一个包含1列和3行的表。第二个单元格具有colspan 4并包含一个包含2列和3行的表。表格下半部分的第三个单元格总是有colspan 2。
这是基本逻辑。但是,为什么你会这样复杂的简单表呢?正如文档所述,PdfPTable
的设计方式使您可以一个接一个地添加多个PdfPTable
实例,甚至没有注意到有不同的表在起作用。
这就是我在NestedTables5示例中所做的。我创建了一个表格,上面有2列,下半部分有6列:
public void createPdf(String dest) throws IOException, DocumentException {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
// Header part
PdfPTable table = new PdfPTable(2);
table.setWidths(new int[]{50, 50});
// first cell
PdfPTable table1 = new PdfPTable(1);
table1.getDefaultCell().setMinimumHeight(30);
table1.addCell("Address 1");
table1.addCell("Address 2");
table1.addCell("Address 3");
table.addCell(new PdfPCell(table1));
// second cell
PdfPTable table2 = new PdfPTable(2);
table2.addCell("Date");
table2.addCell("Place");
PdfPCell cell = new PdfPCell(new Phrase("References"));
cell.setMinimumHeight(40);
cell.setColspan(2);
table2.addCell(cell);
cell = new PdfPCell(new Phrase("destination"));
cell.setColspan(2);
table2.addCell(cell);
table.addCell(new PdfPCell(table2));
// second row
cell = new PdfPCell();
cell.setColspan(2);
cell.setMinimumHeight(16);
table.addCell(cell);
document.add(table);
// Body part
table = new PdfPTable(6);
table.setWidths(new int[]{ 1, 2, 6, 1, 2, 2 });
table.addCell("sl no");
table.addCell("qty");
table.addCell("Product");
table.addCell("units");
table.addCell("rate");
table.addCell("total");
table.setHeaderRows(1);
for (int i = 0; i < 6; ) {
table.getDefaultCell().setBorder(Rectangle.LEFT | Rectangle.RIGHT);
table.getDefaultCell().setMinimumHeight(16);
table.addCell(String.valueOf(++i));
table.addCell("");
table.addCell("");
table.addCell("");
table.addCell("");
table.addCell("");
}
table.getDefaultCell().setFixedHeight(3);
table.getDefaultCell().setBorder(Rectangle.LEFT | Rectangle.RIGHT | Rectangle.BOTTOM);
table.addCell("");
table.addCell("");
table.addCell("");
table.addCell("");
table.addCell("");
table.addCell("");
document.add(table);
document.close();
}
这将为您提供第二张图所示的结果。请参阅nested_tables5.pdf并将其与您需要的内容进行比较。
看起来您正在使用iTextSharp创建发票,并且自3月28日(即一周前)以来您一直在尝试这样做。将来,请先阅读文档。这将为您节省大量时间,否则您将在试错法过程中丢失。您可以免费下载名为ZUGFeRD: The Future of Invoicing的电子书,甚至可以在线免费浏览该书:ZUGFeRD: The Future of Invoicing。它逐步解释了如何创建发票,如下图所示:
如果所有例子都在那里,你为什么要重新发明轮子?
答案 1 :(得分:0)
PdfPTable table = new PdfPTable(3);
table.AddCell(new PdfPCell(new Phrase("Sr No")) { Rowspan = 2, BackgroundColor = BaseColor.GRAY });
PdfPCell CellZero1 = table.AddCell(new PdfPCell(new Phrase("Name")) { Rowspan = 2, HorizontalAlignment = Element.ALIGN_CENTER, BackgroundColor = BaseColor.GRAY });
CellZero1.VerticalAlignment = Element.ALIGN_CENTER;
table.AddCell(new PdfPCell(new Phrase("Phone")) { Rowspan = 2, BackgroundColor = BaseColor.GRAY });
PdfPTable nestedTable = new PdfPTable(2);
PdfPCell cell1 = new PdfPCell(new Phrase("12") );
PdfPCell cell2 = new PdfPCell();
PdfPCell cell3 = new PdfPCell(new Phrase("545445444"));
nestedTable.AddCell(new PdfPCell(new Phrase("First Name")){ BackgroundColor = BaseColor.GRAY });
nestedTable.AddCell(new PdfPCell(new Phrase("Last Name")) { BackgroundColor = BaseColor.GRAY });
for (int i = 1; i < 6; i++)
{
nestedTable.AddCell(new PdfPCell(new Phrase("data" + i)) );
nestedTable.AddCell(new PdfPCell(new Phrase("last" + i)) );
}
cell2.AddElement(nestedTable);
table.AddCell(cell1);
table.AddCell(cell2);
table.AddCell(cell3);
doc.Add(table);