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