使用itextsharp的pdf表我想打印字段名称,如1列名[字段名]和[name]字段的第二列值

时间:2015-08-13 05:32:19

标签: c#-4.0 ms-access-2007 itextsharp

FileStream fs = new FileStream("abc.pdf", FileMode.Create, FileAccess.Write, FileShare.None);
Document doc = new Document(iTextSharp.text.PageSize.A4, 36, 36, 63, 10); 
PdfWriter writer = PdfWriter.GetInstance(doc, fs);
doc.Open();

string strDSN = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\diy.mdb";
string strSQL = "SELECT * FROM project where ID='" + dbProjID + "'";
OleDbConnection myConn = new OleDbConnection(strDSN);
OleDbDataAdapter myCmd = new OleDbDataAdapter(strSQL, myConn);
myConn.Open();

DataSet dtSet = new DataSet();
myCmd.Fill(dtSet, "Developer");
DataTable dTable = dtSet.Tables[0];

PdfPTable table = new PdfPTable(2);
table.WidthPercentage = 98;
table.SpacingBefore = 20f;

PdfPCell cell = new PdfPCell(new Phrase("Customer Information"));
cell.BackgroundColor = new BaseColor(0, 0, 250);
cell.Colspan = 2;
cell.HorizontalAlignment = 1; //0=Left, 1=Centre, 2=Right (for heading allignment)
table.AddCell(cell);

foreach (DataRow dtRow in dTable.Rows)
{
     table.AddCell (dtRow.Table.ToString());
}
doc.Add(table);
myConn.Close();
doc.Close();

1 个答案:

答案 0 :(得分:0)

您正在创建PdfPTable,因为您要创建一个包含两列和未知行数的表:

PdfPTable table = new PdfPTable(2);

您正在执行导致DataTable名为dTable的查询,并循环显示此表的行:

foreach (DataRow dtRow in dTable.Rows)
{
     table.AddCell (dtRow.Table.ToString());
}

在此代码段中,您不会添加该行中存在的任何数据。相反,您将DataTable作为单元格添加为行数。

如果没有数据行,则不会生成PDF表格。如果只有一个数据行,则不会创建PDF表格,因为您没有完整的行(您只添加了1个单元格,并且需要2个单元格)。如果有两个数据行,您将获得一个PDF表,其中一行包含两个内容相同的单元格。

我想这就是你遇到的问题,我猜你收到了投票,因为你在问题中没有这么说。

您需要修复循环中的内容:

foreach (DataRow dtRow in dTable.Rows)
{
     table.AddCell (dtRow[0].ToString());
     table.AddCell (dtRow[1].ToString());
}

现在,您要为PdfPTable中的每一行向DataTable添加两个单元格。

<强>警告:

在我的示例中,我使用了dtRow[0]dtRow[1],但我不知道01是否是您要显示的字段的索引。我无法知道,因为您定义了这样的查询:"SELECT * FROM project where ID='" + dbProjID + "'"由于*,SO上的任何读者都无法知道该查询将返回什么内容。使用*时,您可能会觉得应用程序的性能不是很理想,例如当您只需要两个字段时检索十几个字段。