2017-03-14 179 views
1

我已經使用iTextSharp將DataGridView數據導出爲PDF。列寬完全相同,並且一些標題列字被錯誤地分解。我想要做的是自動調整標題列寬度以適應每個標題文本長度。使用iTextSharp和C#自動調整表格列寬度#

這裏是我的代碼:

PdfPTable table = new PdfPTable(dgv.Columns.Count); 
     for (int j = 0; j < dgv.Columns.Count; j++) 
     { 
      Font font = new Font(Font.FontFamily.COURIER, 14, Font.ITALIC); 
      font.Color = BaseColor.BLUE; 

      if (j == 0) 
      { 
       Phrase p1 = new Phrase(dgv.Columns[j].HeaderText, font); 
       table.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER; 
       table.WidthPercentage = 100; 
       table.AddCell(p1); 
      } 

      else 
      { 
       string header = dgv.Columns[j].HeaderText; 
       header = Regex.Replace(dgv.Columns[j].HeaderText, "[A-Z]", " $0").Trim(); 
       Phrase p = new Phrase(header, font); 
       table.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER; 
       table.WidthPercentage = 100; 
       table.AddCell(p); 
      } 
     } 
     table.HeaderRows = 1; 

     for (int i = 0; i < dgv.Rows.Count; i++) 
      for (int k = 0; k < dgv.Columns.Count; k++) 
       if (dgv[k, i].Value != null) 
       { 
        Phrase p = new Phrase(dgv[k, i].Value.ToString()); 
        table.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER; 
        table.AddCell(p); 
       } 


     doc.Add(table); 

這是PDF輸出:

enter image description here

回答

2

要自動調整列的大小,你需要計算的頭字符串自己的寬度,然後設置表格列的寬度。

首先一個簡單的輔助方法從字符串的任意收集得到的列寬:

public float[] GetHeaderWidths(Font font, params string[] headers) 
{ 
    var total = 0; 
    var columns = headers.Length; 
    var widths = new int[columns]; 
    for (var i = 0; i < columns; ++i) 
    { 
     var w = font.GetCalculatedBaseFont(true).GetWidth(headers[i]); 
     total += w; 
     widths[i] = w; 
    } 
    var result = new float[columns]; 
    for (var i = 0; i < columns; ++i) 
    { 
     result[i] = (float)widths[i]/total * 100; 
    } 
    return result; 
} 

然後設置表格列寬:

string[] headers = new string[] 
{ 
    "Order Id", "Customer Id", "Customer Name", "Product Id", 
    "Product Description", "Quantity", "Product Received" 
}; 
Font font = new Font(Font.FontFamily.COURIER, 14, Font.ITALIC); 
font.Color = BaseColor.BLUE; 
var table = new PdfPTable(headers.Length) { WidthPercentage = 100 }; 
table.SetWidths(GetHeaderWidths(font, headers)); 

using (var stream = new MemoryStream()) 
{ 
    using (var document = new Document(PageSize.A4.Rotate())) 
    { 
     PdfWriter.GetInstance(document, stream); 
     document.Open(); 
     for (int i = 0; i < headers.Length; ++i) 
     { 
      table.AddCell(new PdfPCell(new Phrase(headers[i], font))); 
     } 
     document.Add(table); 
    } 
    File.WriteAllBytes(OUT_FILE, stream.ToArray()); 
} 

輸出:

enter image description here

+0

它的工作,謝謝 但我不知道如何與我的方法一起使用。這是我的方法代碼: http://image.prntscr.com/image/abc8526743c345cbaf2246d591bc7c20.png – Kfir

相關問題