我正在尝试使用iTextSharp将数据网格导出为PDF,并且需要在一列更改时进行分页。我有这个代码
Data Items
但我有两个问题,其中一行是在新页面中添加的
并且编译给了我一个错误:
using (FileStream stream = new FileStream(savefiledialoge.FileName, FileMode.Create))
{
try
{
pdfdoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f);
PdfWriter writer = PdfWriter.GetInstance(pdfdoc, stream);
pdfdoc.SetPageSize(PageSize.A4.Rotate()); // horizontal
pdfdoc.Open();
Encabezado();
for (int i = 0; i <= dataGridView1.RowCount; i++)
{
for (int j = 0; j < dataGridView1.Columns.Count; j++)
{
if (dataGridView1.Rows[i].Cells["Warehouse"].Value.ToString() == dataGridView1.Rows[i + 1].Cells["Warehouse"].Value.ToString())
{
pdftable.AddCell(new Phrase(dataGridView1.Rows[i].Cells[j].Value.ToString(), text));
}
else
{
pdftable.AddCell(new Phrase(dataGridView1.Rows[i].Cells[j].Value.ToString(), text));
pdfdoc.Add(pdftable);
pdfdoc.NewPage();
pdftable.DeleteBodyRows();
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "error occured ", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
答案 0 :(得分:1)
你的循环中的案例区分在列上:
for (int j = 0; j < dataGridView1.Columns.Count; j++)
{
if (dataGridView1.Rows[i].Cells["Warehouse"].Value.ToString() == dataGridView1.Rows[i + 1].Cells["Warehouse"].Value.ToString())
{
pdftable.AddCell(new Phrase(dataGridView1.Rows[i].Cells[j].Value.ToString(), text));
}
else
{
pdftable.AddCell(new Phrase(dataGridView1.Rows[i].Cells[j].Value.ToString(), text));
pdfdoc.Add(pdftable);
pdfdoc.NewPage();
pdftable.DeleteBodyRows();
}
}
效果:假设i
当前是给定仓库的最后一行的值。因此,在上面的j
循环中,您将始终进入else
分支,所以
j == 0
,您的代码已经将表格添加到文档中,但仍然不完整的行i
(&#34;不完整&#34;因为只添加了第一列的单元格)。 iText 不绘制不完整的行i
,但转到下一页,该单个列仍在表对象中。j
的下一个值,该行仍然不完整,因此pdfdoc.Add(pdftable)
不会向页面添加任何内容,而是将新单元格存储在表格对象中。由于当前页面仍为空,pdfdoc.NewPage()
不会创建另一个页面。j
的最后一个值,i
行最终完成,因此pdfdoc.Add(pdftable)
添加了单行表,pdfdoc.NewPage()
创建了另一个新页面。您应首先将完整的当前行i
添加到循环体内的表i
上,然后再测试是否在下一行中更改仓库;即用
for (int j = 0; j < dataGridView1.Columns.Count; j++)
{
pdftable.AddCell(new Phrase(dataGridView1.Rows[i].Cells[j].Value.ToString(), text));
}
if (i == dataGridView1.RowCount - 1)
{
pdfdoc.Add(pdftable);
}
else if (dataGridView1.Rows[i].Cells["Warehouse"].Value.ToString() != dataGridView1.Rows[i + 1].Cells["Warehouse"].Value.ToString())
{
pdfdoc.Add(pdftable);
pdfdoc.NewPage();
pdftable.DeleteBodyRows();
}
关于&#34;指数超出范围&#34;:
另一方面,正如@Bruno已经提到的,i
上的循环应该提前停止,而不是
for (int i = 0; i <= dataGridView1.RowCount; i++)
使用
for (int i = 0; i < dataGridView1.RowCount; i++)