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