iText Sharp嵌套表colspan

时间:2016-03-28 09:09:57

标签: c# itextsharp

我有一张主桌'表' 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个单元格。

enter image description here

那我怎么能这样创造呢?能帮帮我吗。

编辑: enter image description here

上表是我需要的确切输出。所以我创建了一个包含6列的表。用于地址和其他详细信息的3列内部表。

2 个答案:

答案 0 :(得分:1)

我忽略了你问题中的代码,因为我不明白。我只了解您分享的图像,并且我编写了一些伪代码,允许您创建一个如下所示的表:

enter image description here

这或多或少看起来像是想要的结果,不是吗?现在由您将以下伪代码转换为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示例。结果如下:

enter image description here

尽管简单,但仍然让问题听起来很复杂。你说(我引用):我创建了一个包含6列的表。 3列的内表。但这没有意义,是吗?

如果要在一个表中创建这个完整的结构,使用两个内部表,则需要一个包含7个列的表:

enter image description here

第一个单元格具有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。它逐步解释了如何创建发票,如下图所示:

enter image description here

如果所有例子都在那里,你为什么要重新发明轮子?

答案 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);