Добавление списка таблиц в migradoc

У меня есть таблица БД, которая выглядит как

id | Name | ImagePath
-------------------------
 1 | aaa         | xxx
 2 | bbb         | yyy
 3 | ccc         | zzz

Для каждой строки я хочу создать таблицу, поэтому, когда я создаю свой PDF-файл, каждая строка будет выглядеть так в PDF-файле.

--------------------|-------------------
1                   | 
aaa                 |xxx (but the actual image)
--------------------|-------------------

--------------------|-------------------
2                   | 
bbb                 |yyy (but the actual image)
--------------------|-------------------

--------------------|-------------------
3                   | 
ccc                 |zzz (but the actual image)
--------------------|-------------------

Значения передаются в функцию, которая создает таблицу

        public MigraDoc.DocumentObjectModel.Tables.Table createTable(List<string> listOfValues)
        {
            MigraDoc.DocumentObjectModel.Tables.Table table = new MigraDoc.DocumentObjectModel.Tables.Table();
            //table = page.AddTable();
            table.Style = "Table";
            table.Borders.Color = Colors.Black;
            table.Borders.Width = 0.25;
            table.Borders.Left.Width = 0.5;
            table.Borders.Right.Width = 0.5;
            table.Rows.LeftIndent = 0;

            //create column
            MigraDoc.DocumentObjectModel.Tables.Column column = new MigraDoc.DocumentObjectModel.Tables.Column();
            column = table.AddColumn("10cm");
            column.Format.Alignment = ParagraphAlignment.Left;
            //MigraDoc.DocumentObjectModel.Tables.Row tableRow = table.AddRow();
                MigraDoc.DocumentObjectModel.Tables.Column ImageColumn = new MigraDoc.DocumentObjectModel.Tables.Column();
            ImageColumn = table.AddColumn("10cm");
            ImageColumn.Format.Alignment = ParagraphAlignment.Left;

            //create rows from list of values
            foreach (var value in listOfValues)
            {
                MigraDoc.DocumentObjectModel.Tables.Row tableRow = table.AddRow();
                //if it is an image add to column 2
                if (value.Contains("Image="))
                {
                    tableRow.Cells[1].AddParagraph(value);
                    //merge the cells for the image column (zero based)
                    tableRow.Cells[1].MergeDown = listOfValues.Count - 1;
                }
                else
                {
                    //add the value
                    tableRow.Cells[0].AddParagraph(value);
                }
              }
              return table
}

Приведенное выше создало таблицу, а затем возвращает ее, которая помещается в список (типа таблицы)

Затем список таблиц передается в метод, который создает PDF-файл.

public void generatePDF(List<MigraDoc.DocumentObjectModel.Tables.Table> listOfTables) 
    {
    //who generated teh report
    string author = Environment.UserName;
    DateTime currentTime = DateTime.Now;
    Document document = new Document();

    string pageHeaderText = "Report";
    string pageFooterText = string.Format("Report Generated by {0} at {1} on {2}", author, currentTime.ToShortTimeString(), currentTime.ToShortDateString());
    Style style = document.Styles["Normal"];
    style.Font.Name = "Arial Unicode MS";

    //table Style
    style = document.Styles.AddStyle("Table", "Normal");
    style.Font.Name = "Verdana";
    style.Font.Size = 9;

    Section page = document.AddSection();

    //header
    Paragraph header = page.Headers.Primary.AddParagraph();
    header.AddText(pageHeaderText);
    header.Format.Alignment = ParagraphAlignment.Center;

    //footer
    Paragraph footer = page.Footers.Primary.AddParagraph();
    footer.AddText(pageFooterText);
    footer.Format.Alignment = ParagraphAlignment.Center;

    //Main paragraph
    Paragraph mainPara = page.AddParagraph("test\n");

    //go through each table in the list and add to teh page

    foreach (var table in listOfTables)
    {
        MigraDoc.DocumentObjectModel.Tables.Table tableToAdd = new MigraDoc.DocumentObjectModel.Tables.Table();
        tableToAdd = table;
        tableToAdd = page.AddTable();
    }

    PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer(true);//false, pdfRenderer.);
    pdfRenderer.Document = document;
    pdfRenderer.RenderDocument();

    //save and open the file
    fileName = "test;
    //show file save dialog
    SaveFileDialog sfd = new SaveFileDialog();
    sfd.DefaultExt = ".pdf";
    sfd.AddExtension = true;
    sfd.FileName = fileName;
    if (sfd.ShowDialog() == DialogResult.OK)
    {
        savePath = System.IO.Path.GetDirectoryName(sfd.FileName);
        pdfRenderer.PdfDocument.Save(savePath + "\\" + fileName + ".pdf" );
        Process.Start(savePath + "\\" + fileName + ".pdf");
    }
}

Проблема, с которой я сталкиваюсь, заключается в том, что таблица не создается в формате PDF.

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


person MapMan    schedule 13.06.2018    source источник


Ответы (1)


Компьютеры часто делают то, что вы им говорите, а не то, что вы от них хотите.

Посмотрите на этот фрагмент кода:

    tableToAdd = table;
    tableToAdd = page.AddTable();

Вы добавляете на страницу новую, пустую таблицу и присваиваете новую таблицу переменной tableToAdd, тем самым теряя ссылку на таблицу с содержимым.

Код, который делает то, что вы ожидаете, еще проще:

    page.Add(tableToAdd);

Добавляет в раздел таблицу с содержимым.

Кстати: page — не лучшее имя для объекта Section.

person I liked the old Stack Overflow    schedule 14.06.2018
comment
Спасибо, это было. Мне на самом деле не нужен объект tableToAdd, и я использовал объект из цикла. Спасибо за вашу помощь! - person MapMan; 14.06.2018