在 migradoc 中添加表列表

Adding a list of tables in migradoc

我的数据库 table 看起来像

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

我想为每一行创建一个 table,所以当我生成我的 pdf 时,每一行在 pdf 中看起来像这样

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

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

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

这些值被传递到一个函数中并创建 table

        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
}

上面创建了一个table然后returns它,它被放入一个列表(Table类型)

然后将 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");
    }
}

我遇到的问题是 table 没有在 pdf 上生成。

如果我传入字符串列表而不是 table 列表并循环遍历,table 确实会生成,但我不确定为什么使用列表(类型tables) 循环时不会生成。

计算机通常会执行您告诉它们执行的操作,而不是您希望它们执行的操作。

看这段代码:

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

您向页面添加一个新的空 table,并将新的 table 分配给变量 tableToAdd,从而失去对 table 的引用内容。

实现您期望的代码甚至更简单:

    page.Add(tableToAdd);

它将包含内容的 table 添加到该部分。

顺便说一句:page 不是 Section 对象的最佳名称。