在 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
对象的最佳名称。
我的数据库 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
对象的最佳名称。