iTextSharp和datagridview分页符

时间:2018-04-17 10:09:55

标签: c# itext

我正在尝试使用iTextSharp将数据网格导出为PDF,并且需要在一列更改时进行分页。我有这个代码

Data Items

但我有两个问题,其中一行是在新页面中添加的

enter image description here

并且编译给了我一个错误:

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);
    }
}

1 个答案:

答案 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++)