Itextsharp #4 คู่มือเทคนิคพื้นฐานการใช้งาน PdfTable สำหรับมือใหม่ ตอนที่ 2

บทความนี้สำหรับผู้ที่ยังไม่ได้อ่านบทความก่อนหน้านี้ สามารถอ่านบทความได้ที่ Itextsharp #3 คู่มือเทคนิคพื้นฐานการใช้งาน PdfTable สำหรับมือใหม่ ตอนที่ 1 เพื่อความเข้าใจต่อเนื่องกันนะครับ โดยเนื้อหาในบทความนี้เป็นส่วนของใช้งาน Table ที่ผู้เขียนเองใช้ในการทำงานคือการทำ Nest Table นั้นเองโดยปกติการสร้างเอกสาร1ใบ ผู้เขียนจะใช้ Table ตัวแรกในการกำหนดรูปแบบหน้าตาของเอกสาร การจัดตำแหน่งสัดส่วนต่างๆ หลังจากนั้นก็ใช้ Table ซ้อนเข้าไปตามส่วนต่างๆตามที่ออกแบบไว้มาจัดการส่วนของข้อมูล จึงจำเป็นต้องใช้งาน Nest Table เราไปดูตัวอย่างรูปกันก่อนดีกว่าครับ

จากตัวอย่างจะพบว่าสำหรับคนที่เขียนโปรแกรมก็คือการซ้อนตารางปกติที่พบเจอได้ในการเขียนโปแกรม จากรูปคือเอาTable2 ใส่ใน Cell ที่1ของ Table1 หรือพูดภาษาของเขียนโปรแกรมคือเขียน Table2 ลงใน <TD> แรกของ Table1 นั้นเอง ซึ่งถามว่าทำงานคล้ายๆกับตารางทั่วไปแล้วสามารถรวมCell ก่อนเพิ่มตารางได้ไหมใน ItextSharp ทำได้เหมือนกันครับ ตามรูปเลยครับ

จากตัวอย่างเป็นการรวม Collumn แล้วทำการเพิ่ม Table2 เข้าไปโดยใน ItextSharp เรากำหนดCollumn ของTable1และTable2 เท่ากัน ตัวโปรแกรมจะจัดขนาดของ Cell ให้เท่ากันอัตโนมัติเมื่อทำการแสดงผลเหมือนในรูปตัวอย่างครับ ส่วนการเขียนโปแกรมนั้นง่ายมากๆเพิ่มขั้นตอนจากตอนที่1มานิดเดียว เราไปดู Code กันเลยดีกว่าครับ

PdfPCell PdfCell = null;

PdfPTable PdfTableH = new PdfPTable(3);
float[] tbHwidths = { 50f, 50f, 50f };
PdfTableH.SetWidths(tbHwidths);
PdfTableH.WidthPercentage = 100;

PdfCell = new PdfPCell(new Phrase(new Chunk("Table 2 Cell 1", bold)));
PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
PdfCell.PaddingBottom = 8;
PdfTableH.AddCell(PdfCell);
PdfCell = new PdfPCell(new Phrase(new Chunk("Table 2 Cell 2", bold)));
PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
PdfCell.PaddingBottom = 8;
PdfTableH.AddCell(PdfCell);
PdfCell = new PdfPCell(new Phrase(new Chunk("Table 2 Cell 3", bold)));
PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
PdfCell.PaddingBottom = 8;
PdfTableH.AddCell(PdfCell);
PdfCell = new PdfPCell(new Phrase(new Chunk("Table 2 Cell 4", bold)));
PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
PdfCell.PaddingBottom = 8;
PdfTableH.AddCell(PdfCell);
PdfCell = new PdfPCell(new Phrase(new Chunk("Table 2 Cell 5", bold)));
PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
PdfCell.PaddingBottom = 8;
PdfTableH.AddCell(PdfCell);
PdfCell = new PdfPCell(new Phrase(new Chunk("Table 2 Cell 6", bold)));
PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
PdfCell.PaddingBottom = 8;
PdfTableH.AddCell(PdfCell);

//-----------------------------------------------------------------//

PdfPTable PdfTable = new PdfPTable(3);
float[] tbwidths = { 50f, 50f, 50f };
PdfTable.SetWidths(tbwidths);
PdfTable.WidthPercentage = 100;

PdfCell = new PdfPCell(PdfTableH);// <---------------------------------#1
PdfTable.AddCell(PdfCell);

//PdfTable.AddCell(new PdfPCell(PdfTableH)); <-------------------------#2

PdfCell = new PdfPCell(new Phrase(new Chunk("Table 1 Cell 2", fnt)));
PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
PdfCell.PaddingBottom = 8;
PdfTable.AddCell(PdfCell);
PdfCell = new PdfPCell(new Phrase(new Chunk("Table 1 Cell 3", fnt)));
PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
PdfCell.PaddingBottom = 8;
PdfTable.AddCell(PdfCell);
PdfCell = new PdfPCell(new Phrase(new Chunk("Table 1 Cell 4", fnt)));
PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
PdfCell.PaddingBottom = 8;
PdfTable.AddCell(PdfCell);
PdfCell = new PdfPCell(new Phrase(new Chunk("Table 1 Cell 5", fnt)));
PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
PdfCell.PaddingBottom = 8;
PdfTable.AddCell(PdfCell);
PdfCell = new PdfPCell(new Phrase(new Chunk("Table 1 Cell 6", fnt)));
PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
PdfCell.PaddingBottom = 8;
PdfTable.AddCell(PdfCell);
PdfCell = new PdfPCell(new Phrase(new Chunk("Table 1 Cell 7", fnt)));
PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
PdfCell.PaddingBottom = 8;
PdfTable.AddCell(PdfCell);

ตัวอย่าง Code ผู้เขียนแบ่งเป็น 2ส่วนด้วยกันคือส่วนแรกเป็นการสร้าง Table2ก่อน เพราะเราจะเอาTableนี้ไปใส่ในTable1อีกที การเขียนก็เหมือนจากตัวอย่างที่ผ่านๆมาในบทความก่อนหน้านี้ เรามาดูส่วนที่2กันส่วนที่ต่างจากส่วนแรกคือ บรรทัดที่(#1) PdfCell = new PdfPCell(PdfTableH); โค๊ดนี้คือการเพิ่ม Table2 ลงไปใน Cell ที่เราต้องการครับ หรือจะใช้อีกรูปแบบ(#2)คือ PdfTable.AddCell(new PdfPCell(PdfTableH)); แค่นี้เราก็ทำ NestTable เสร็จสิ้นเป็นที่เรียบร้อย ง่ายไหมครับ แล้วถ้าเราจะรวม Cell ก่อนเพิ่ม Table ละจะทำยังไง หลายคนอาจทำได้โดยไม่ต้องดูตัวอย่างของผู้เขียนแล้วก็ได้ครับ แต่เราไปดูตัวอย่างกันดีกว่าครับ

PdfCell = new PdfPCell(PdfTableH);
PdfCell.Colspan = 3;
PdfTable.AddCell(PdfCell);
หรือ
PdfTable.AddCell(new PdfPCell(PdfTableH) { Colspan = 3 });

เหมือนที่คิดไว้ไหมครับหรือหลายๆคนอาจเขียนได้แบบอื่นก็ไม่ผิดครับ จากตัวอย่างแค่เพิ่มคำสั่ง Colspan เข้าไปใน Cell ก็เป็นอันเสร็จเรียบร้อย จบส่วนของการทำ Nest Table แล้ว เรามาดูตัวอย่างการใช้งานจริงจากผู้เขียนสักตัวอย่างกันครับ

จากรูปตัวอย่างเอกสารประกอบไปด้วยส่วนของ Header Table1 ที่แสดงผลทุกหน้ากระดาษ และมีส่วนของเนื้อหาในหน้าแรกเป็นส่วนของ Body Table1 แล้วมีตารางของข้อมูลจำนวนหลายรายการโดยเมื่อตารางนี้ขึ้นหน้าใหม่ให้ทำการแสดงหัวตารางไปด้วย ผู้เขียนจะให้ส่วนนี้เป็น Table2 หรือ NestTable นั้นเอง ถ้าทุกท่านนึกภาพออกแล้วเราไปดูตัวอย่าง Code กันดีกว่าครับ

PdfPCell PdfCell = null;

PdfPTable PdfTableH = new PdfPTable(3);
float[] tbHwidths = { 50f, 50f, 50f };
PdfTableH.SetWidths(tbHwidths);
PdfTableH.WidthPercentage = 100;
PdfTableH.HeaderRows = 1;

PdfCell = new PdfPCell(new Phrase(new Chunk("Header Table 2", bold)));
PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
PdfCell.PaddingBottom = 8;
PdfCell.Colspan = 3;
PdfCell.FixedHeight = 20f;
PdfTableH.AddCell(PdfCell);

for (int i = 0; i < 60; i++)
{
    PdfCell = new PdfPCell(new Phrase(new Chunk("Body Table 2", fnt)));
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfCell.PaddingBottom = 8;
    PdfTableH.AddCell(PdfCell);
}

PdfPTable PdfTable = new PdfPTable(1);
float[] tbwidths = { 500f };
PdfTable.SetWidths(tbwidths);
PdfTable.WidthPercentage = 100;
PdfTable.HeaderRows = 1;
PdfTable.SplitLate = false;
PdfTable.KeepTogether = true;

PdfCell = new PdfPCell(new Phrase(new Chunk("Header Table 1", fnt)));
PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
PdfCell.PaddingBottom = 8;
PdfCell.PaddingLeft = 10;
PdfTable.AddCell(PdfCell);
PdfCell = new PdfPCell(new Phrase(new Chunk("Body Table 1", fnt)));
PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
PdfCell.PaddingBottom = 8;
PdfCell.PaddingLeft = 10;
PdfTable.AddCell(PdfCell);
PdfTable.AddCell(new PdfPCell(PdfTableH));

จาก Code ตัวอย่างผู้เขียนได้นำคำสั่ง HeaderRows มาใช้งานร่วมด้วยเพื่อให้ทำการยึดหัวตารางทั้งสองตารางเอาไว้ในหน้ากระดาษในหน้าถัดๆไปด้วย และผู้เขียนได้เพิ่มคำสั่งมาอีก 2 คำสั่งด้วยกัน เป็นคำสั่งเสริมขึ้นมาเพื่อให้การแสดงผลของข้อมูลสวยงามและถูกต้องตามที่เราต้องการ คือ PdfTable.SplitLate = false; และ PdfTable.KeepTogether = true; คำสั่งดังกล่าวใช้ในกรณีเราทำ NestTable ที่มีการแสดงผลมากว่า1หน้ากระดาษ แต่ถ้าเอกสารที่ทำมีเพียง1หน้ากระดาษแน่นอน คำสั่งดังกล่าวไม่ต้องเขียนก็ได้ครับ แล้วถ้าไม่ใส่ไปเลยได้ไหมถึงเอกสารจะมีหลายหน้า ผู้เขียนแนะนำว่าควรใส่ เพราะไม่มีคำสั่งนี้ Nest Table จะไม่แสดงผลในหน้าแรกเสมอครับแต่จะเลื่อนไปแสดงผลในหน้าที่สองแทน เนื่องจาก Itextsharp ทำการเลื่อนให้เองอัตโนมัติเมื่อตารางนั้นล้นเกินหน้ากระดาษแรก นั้นเอง

สุดท้ายนี้ขอขอบคุณผู้ที่สนใจอ่านบทความของผู้เขียนครับ และสำหรับเนื้อหาที่เขียนในบทความมาจากประสบการณ์และการลองผิดลองถูกจากผู้เขียนเอง ถ้ามีส่วนไหนผิดพลาด ตกหล่น ก็ขออภัยไว้นะที่นี้ด้วยครับ