2017-03-14 8 views
1

iTextSharpを使ってDataGridViewデータをPDFにエクスポートしました。列の幅はまったく同じで、ヘッダー列の単語の一部が正しく分割されていません。私がやろうとしているのは、各ヘッダーテキストの長さに合わせてヘッダー列の幅を自動調整することです。ここでiTextSharpとC#を使ったAutoFitテーブルのカラム幅

は私のコードです:

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

、あなたはヘッダー文字列を自分の幅を計算する必要があり、テーブルの列の幅を設定します。まず

文字列の任意のコレクションから列幅を取得するための簡単なヘルパーメソッド:

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

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

は、その後、テーブルの列の幅を設定します

+0

ありがとうございました しかし、私は知らない私の方法でそれを使う方法。 これは私のメソッドコードです: http://image.prntscr.com/image/abc8526743c345cbaf2246d591bc7c20.png – Kfir

関連する問題