如何合并 PDF 中具有相同值的行的前 3 列

How to merge first 3 columns for rows with same value in PDF

我正在使用 itextSharp 将 DataTable 导出为 pdf table。我可以使用下面发布的示例代码将数据导出为 pdf table。 DataTable 包含将近 21 列。

pdf (DataTable) 中的第一列可能包含任意行数的相似值。如果一组行的第一列中的数据值相似,我想将这些行的前 3 列合并为一个单元格。

我在修改下面的代码以实现此目的时遇到问题。

public iTextSharp.text.Table GetItextTable(DataTable dtChartData, string reportType)
    {
        int intCols = dtChartData.Columns.Count; //Total number of columns 
        int intRows = dtChartData.Rows.Count; //Total number of rows 
        iTextSharp.text.Table pdfTable = new iTextSharp.text.Table(intCols, intRows);
        try
        {
            pdfTable.BorderWidth = 1;
            pdfTable.Width = 100;
            pdfTable.Padding = 1;
            pdfTable.Spacing = 1;
            /*creating table headers */
            for (int i = 0; i < intCols; i++)
            {

                iTextSharp.text.Cell cellCols = new iTextSharp.text.Cell();
                iTextSharp.text.Font ColFont = iTextSharp.text.FontFactory.GetFont("Tahoma", 07,
                    iTextSharp.text.Font.BOLD);
                for (int l = 0; l < dtChartData.Columns.Count; l++)
                {
                    if (dtChartData.Columns[l].ColumnName.Contains("_"))
                    {
                        dtChartData.Columns[l].ColumnName = dtChartData.Columns[l].ColumnName.Replace("_", " ");
                    }
                }
                iTextSharp.text.Chunk chunkCols = new iTextSharp.text.Chunk(dtChartData.Columns[i].ColumnName,ColFont);
                cellCols.HorizontalAlignment = iTextSharp.text.Element.ALIGN_CENTER;
                if ((chunkCols.ToString().ToLower() == "ReportDetails"))
                {
                    cellCols.HorizontalAlignment = iTextSharp.text.Element.ALIGN_CENTER;
                }
            }
            /* loop that take values from every row in datatable and insert in itextsharp table */
            for (int k = 0; k < intRows; k++)
            {
                for (int j = 0; j < intCols; j++)
                {
                    iTextSharp.text.Cell cellRows = new iTextSharp.text.Cell();
                    iTextSharp.text.Font RowFont = iTextSharp.text.FontFactory.GetFont("Tahoma", 07);
                    iTextSharp.text.Chunk chunkRows = new iTextSharp.text.Chunk(dtChartData.Rows[k][j].ToString(),RowFont);

                    cellRows.HorizontalAlignment = iTextSharp.text.Element.ALIGN_CENTER;
                    cellRows.Add(chunkRows);
                    pdfTable.AddCell(cellRows);
                }
            }
        }
        catch (Exception ex)
        {
            //error handling code here removed
        }
        return pdfTable;
    }

您尝试过更改 Colspan 吗?

iTextSharp.text.Cell cell = new iTextSharp.text.Cell();
cell.AddElement(new Paragraph("colspan 3"));
cell.Colspan = 3;
table.AddCell(cell);

在这种情况下,cell 将跨越三列。

试试这个。我只是编辑了你的代码,没有检查

我在这里编辑了 1 行代码并添加了新行(总共只有 2 行更改)。

如果需要,请不要忘记像这样合并标题行

/* loop that take values from every row in datatable and insert in itextsharp table */
        for (int k = 0; k < intRows; k++)
        {
            for (int j = 2; j < intCols; j++)// EDIT: if all first 3 cols are same, then starts with 2
            { 
                iTextSharp.text.Cell cellRows = new iTextSharp.text.Cell();
                if(j == 2) cellRows.Colspan = 3;// ADD: it'll gives a 3 times long cell
                iTextSharp.text.Font RowFont = iTextSharp.text.FontFactory.GetFont("Tahoma", 07);
                iTextSharp.text.Chunk chunkRows = new iTextSharp.text.Chunk(dtChartData.Rows[k][j].ToString(),RowFont);

                cellRows.HorizontalAlignment = iTextSharp.text.Element.ALIGN_CENTER;
                cellRows.Add(chunkRows);
                pdfTable.AddCell(cellRows);
            }
        }