2016-04-12 1 views
0

Я использую itextSharp для экспорта DataTable в таблицу pdf. Я могу экспортировать данные в таблицу pdf, используя код примера, который я разместил ниже. DataTable содержит около 21 столбца.Как слить первые 3 столбца для строк с одинаковым значением в PDF

Первый столбец в pdf (DataTable) может содержать одинаковые значения для любого количества строк. Если значения данных в первом столбце для группы строк аналогичны, я хочу объединить первые три столбца этих строк как одну ячейку.

У меня возникли проблемы с изменением кода ниже, чтобы достичь этого.

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; 
    } 

ответ

1

Вы пытались сменить команду Colspan?

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

В этом случае cell будет охватывать три столбца.

+0

проблема я имею логика, чтобы проверить, если строки первого столбца имеют одинаковое значение. – StackTrace

+0

Это не проблема iTextSharp. iTextSharp не выполнит эту проверку для вас. Проверка того, что строка 'a' идентична строке' b', и если строка 'b' идентична строке' c', не должна быть проблемой. Что вы пробовали? Почему это не сработало? –

+1

Я согласен с Бруно. Я бы добавил, что на этом этапе я бы рекомендовал временно приостановить использование iTextSharp. Вместо этого сосредоточьтесь исключительно на 'DataTable'. Если он исходит из системы SQL, вы можете бросить на нее некоторую логику SQL, чтобы получить ее, как вы хотите. Если вы только на C#, то сделайте быстрое представление WinForm или ASP.Net WebForm над своей «DataTable» и примените любую логику, в которой вы нуждаетесь. Как только вы получите это, вы можете легко привязать его к вашему опубликованному коду для работы с iTextSharp. –

0

попробуйте это. я только что отредактировал ваш код, но не проверен

здесь я отредактировал 1 строку вашего кода и добавил новую строку (всего 2 строки изменения).

не забудьте объединить headding строку, как это, если вам нужно

/* 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); 
      } 
     } 
Смежные вопросы