วิธีทำงานกับตารางใน .NET
คู่มือนี้แสดงวิธีการสร้าง, จัดรูปแบบ, และอ่านตารางโดยใช้โปรแกรมใน Aspose.Words FOSS สำหรับ .NET, โดยใช้ Table, Row, และ Cell คลาสใน Aspose.Words.Tables เนมสเปซพร้อมกับ DocumentBuilder. มันครอบคลุมการสร้างตารางตั้งแต่ต้น, การจัดรูปแบบเซลล์และแถวขณะสร้าง, การควบคุมการจัดวางทั่วทั้งตารางและ AutoFit, การกำหนดความกว้างที่ต้องการ, การรวมเซลล์, และการอ่านตารางที่มีอยู่แล้วในเอกสารที่โหลด.
คู่มือแบบทีละขั้นตอน
ขั้นตอนที่ 1: ติดตั้งแพ็คเกจ
Aspose.Words FOSS for .NET ยังไม่ได้เผยแพร่แพ็คเกจ NuGet – ให้สร้างไลบรารีจากซอร์สโค้ดแทน. คัดลอก https://github.com/aspose-words-foss/Aspose.Words-FOSS-for-.NET.git, จากนั้นสร้าง Aspose.Words.sln ในคอนฟิกูเรชัน Release ด้วย .NET SDK และอ้างอิงแอสเซมบลี Aspose.Words ที่ได้จากโครงการของคุณ. ไลบรารีนี้มุ่งเป้าไปที่ .NET Standard 2.0, ดังนั้นมันทำงานบน .NET Framework 4.6.2+ และ .NET 6/8/10.
ขั้นตอนที่ 2: นำเข้าคลาสที่จำเป็น
เพิ่มคำสั่ง using Aspose.Words; สำหรับคลาสเอกสารหลัก (Document, DocumentBuilder) และคำสั่ง using Aspose.Words.Tables; สำหรับคลาสเฉพาะตารางที่คู่มือนี้ครอบคลุม – Table, Row, Cell, CellFormat, RowFormat, PreferredWidth และ enum ที่เกี่ยวข้อง.
ขั้นตอนที่ 3: สร้างตารางใหม่ด้วย DocumentBuilder
สร้าง Document และ DocumentBuilder ที่ผูกกับมัน, จากนั้นเรียก DocumentBuilder.StartTable() เพื่อเริ่มตารางที่เคอร์เซอร์. สำหรับแต่ละเซลล์ในแถว, เรียก DocumentBuilder.InsertCell(), แล้วปิดแถวด้วย DocumentBuilder.EndRow(). ทำซ้ำตามจำนวนแถวที่ต้องการของตาราง, และปิดตารางทั้งหมดด้วย DocumentBuilder.EndTable(). ทุก StartTable() ต้องมี EndTable() ที่ตรงกัน, และทุกแถวต้องมี EndRow() ที่ตรงกัน, ไม่เช่นนั้นสถานะภายในของตัวสร้าง – และต้นไม้เอกสารที่ได้ – จะกลายเป็นรูปแบบที่ผิดพลาด.
ขั้นตอนที่ 4: จัดรูปแบบเซลล์และแถวขณะสร้าง
ตั้งค่า DocumentBuilder.CellFormat และ DocumentBuilder.RowFormat ก่อนเรียก InsertCell() หรือ EndRow() เพื่อใช้การจัดรูปแบบกับเซลล์และแถวที่ตัวสร้างกำลังจะสร้าง – สองคุณสมบัตินี้ทำหน้าที่เป็นแม่แบบสำหรับเนื้อหาใหม่ ไม่ใช่การเปลี่ยนแปลงย้อนหลังต่อเซลล์ที่ได้แทรกแล้ว. CellFormat เปิดเผย Borders, Shading, Width, WrapText, FitText, HorizontalMerge, VerticalMerge, VerticalAlignment, PreferredWidth, และคุณสมบัติการเว้นระยะสี่ค่า (LeftPadding, RightPadding, TopPadding, BottomPadding) ซึ่งทั้งหมดสามารถตั้งค่าได้พร้อมกันด้วย SetPaddings(). RowFormat เปิดเผย Borders, Height, HeightRule, AllowBreakAcrossPages, และ HeadingFormat. เรียก CellFormat.ClearFormatting() หรือ RowFormat.ClearFormatting() เพื่อรีเซ็ตหนึ่งในนั้นกลับสู่ค่าเริ่มต้นก่อนตั้งค่าค่าใหม่สำหรับแถวหรือเซลล์ถัดไป.
ขั้นตอนที่ 5: ตั้งค่าการจัดวางทั่วทั้งตารางและ AutoFit
เมื่อมีตารางแล้ว, ตั้งค่าคุณสมบัติการจัดวางโดยตรงบนอ็อบเจกต์ Table: Alignment (TableAlignment), Bidi, LeftIndent, PreferredWidth, Style, StyleIdentifier, StyleName, StyleOptions (TableStyleOptions), และ TextWrapping. เรียก Table.SetBorders() เพื่อใช้สไตล์เส้นขอบเดียว, ความกว้าง, และสีทั่วทั้งตาราง, หรือ Table.SetBorder() เพื่อกำหนดด้านเดียว; ClearBorders() และ ClearShading() รีเซ็ตค่าดังกล่าว. Table.AutoFit(AutoFitBehavior) ปรับขนาดตารางและเซลล์ตามพฤติกรรมที่เลือก – เรียกใช้อีกครั้งหลังการแก้ไขโครงสร้างใด ๆ เนื่องจากมันสะท้อนสถานะของตารางเฉพาะขณะทำงาน, ไม่ได้ทำงานอย่างต่อเนื่อง.
ขั้นตอนที่ 6: ตั้งค่าความกว้างที่ต้องการและความกว้างของเซลล์
สร้างค่าความกว้างด้วยเมธอดแฟคทอรีสเตติก PreferredWidth.FromPercent() สำหรับการจัดวางที่ปรับให้เข้ากับความกว้างหน้าที่มี, หรือ PreferredWidth.FromPoints() สำหรับความกว้างคงที่; PreferredWidthType รายงานว่าค่าประเภทใด (Auto, Percent, หรือ Points) ที่ PreferredWidth ใด ๆ มีอยู่. กำหนดผลลัพธ์ให้กับ Table.PreferredWidth สำหรับทั้งตารางหรือ CellFormat.PreferredWidth สำหรับเซลล์เดียว.
ขั้นตอน 7: รวมเซลล์
ทำเครื่องหมายเซลล์ว่าเป็นการรวมโดยการตั้งค่า CellFormat.HorizontalMerge หรือ CellFormat.VerticalMerge (ทั้งสองพิมพ์เป็น CellMerge) บนเซลล์ที่ควรเข้าร่วมการรวม หากเซลล์ถูกทำให้ดูเหมือนรวมโดยการปรับความกว้างให้ตรงกันแทนที่จะถูกทำเครื่องหมายโดยชัดเจน ให้เรียก Table.ConvertToHorizontallyMergedCells() เพื่อแปลงการจัดเรียงแบบเห็นได้นั้นให้เป็นเซลล์ที่มีสถานะ CellMerge จริง CellVerticalAlignment ควบคุมการจัดแนวเนื้อหาในแนวตั้งภายในเซลล์ โดยไม่ขึ้นกับการรวมใด ๆ.
ขั้นตอน 8: อ่านตารางจากเอกสารที่มีอยู่
หากต้องการทำงานกับตารางที่มีอยู่แล้วในเอกสารที่โหลดไว้ ให้อ่าน Body.Tables (หรือคุณสมบัติ Tables บน Story ใด ๆ) — TableCollection — แทนการสร้างใหม่ Table.Rows จะคืนค่า RowCollection และ Row.Cells จะคืนค่า CellCollection; ทั้งสามประเภทของคอลเลกชันสนับสนุน Add(), Insert(), Remove(), RemoveAt(), Contains(), และ IndexOf() สำหรับการแก้ไขแบบโปรแกรม หลังจากลบแถวหรือเซลล์แล้ว ให้เรียก Table.EnsureMinimum(), Row.EnsureMinimum() หรือ Cell.EnsureMinimum() เพื่อให้โหนดยังคงโครงสร้างที่ถูกต้องอย่างต่ำตามที่ Word คาดหวัง — แถวว่าง, เซลล์ว่าง, หรือย่อหน้าว่าง ตามลำดับ.
ปัญหาทั่วไปและวิธีแก้
เอกสารที่บันทึกดูผิดรูปแบบ, หรือเกิดข้อผิดพลาดขณะบันทึก แถวหรือแม้แต่ตารางเองไม่เคยถูกปิดเลย ควรจับคู่เสมอ DocumentBuilder.StartTable() กับสุดท้าย EndTable(), และปิดทุกแถวด้วย EndRow() ก่อนย้ายไปแถวต่อไปหรือจบตาราง.
เซลล์ใหม่ไม่รับการจัดรูปแบบที่ฉันตั้งค่า CellFormat and RowFormat ถูกเปลี่ยนบน DocumentBuilder หลังจากที่เซลล์ที่ได้รับผลกระทบได้ถูกแทรกแล้ว ตั้งค่า DocumentBuilder.CellFormat / RowFormat ก่อนที่ InsertCell() or EndRow() การเรียกที่สร้างเนื้อหาที่คุณต้องการจัดรูปแบบ.
ตารางไม่ปรับขนาดตามที่ฉันคาดหวังหลังจากแก้ไขเนื้อหา Table.AutoFit(AutoFitBehavior) สะท้อนโครงสร้างของตารางเฉพาะในขณะที่ถูกเรียกเท่านั้น. Call it again after any structural edit – adding or removing rows, cells, or content – if the layout needs to be re-fitted.
เซลล์ที่ดูเหมือนผสานกันทำงานเป็นเซลล์แยกเมื่ออ่านกลับ. เซลล์เหล่านั้นถูกจับคู่โดยความกว้างเท่านั้น ไม่ได้ถูกทำเครื่องหมายด้วย CellMerge. เรียก Table.ConvertToHorizontallyMergedCells(), หรือกำหนด CellFormat.HorizontalMerge / VerticalMerge อย่างชัดเจนบนเซลล์ที่ควรผสานกัน.
การลบแถวหรือเซลล์ทำให้ตารางอยู่ในสถานะที่ไม่ถูกต้อง Word คาดหวังทุก Table, Row, และ Cell เพื่อรักษาโครงสร้างที่ถูกต้องขั้นต่ำไว้ หลังจากลบเนื้อหาโดยโปรแกรม ให้เรียก EnsureMinimum() บนโหนดที่เพิ่งแก้ไข.
คำถามที่พบบ่อย
ฉันจะสร้างตารางตั้งแต่ต้นอย่างไร แทนการแก้ไขตารางที่มีอยู่แล้ว?
ใช้ DocumentBuilder: เรียก StartTable(), จากนั้น InsertCell() สำหรับแต่ละเซลล์ในแถว, EndRow() เพื่อปิดแถว, ทำซ้ำสำหรับแถวเพิ่มเติม, และ EndTable() เพื่อปิดตาราง.
ฉันจะดึงตารางที่มีอยู่แล้วในเอกสารที่โหลดมาได้อย่างไร?
อ่านคุณสมบัติ Tables (เป็น TableCollection) บน Body ของส่วนที่คุณสนใจ, หรือบน Story อื่น ๆ เช่น หัวเรื่องหรือส่วนท้าย.
ฉันจะตั้งค่าตารางให้มีความกว้างเป็นเปอร์เซ็นต์ของความกว้างหน้าแทนการกำหนดความกว้างคงที่อย่างไร?
กำหนด Table.PreferredWidth = PreferredWidth.FromPercent(value) แทน PreferredWidth.FromPoints(value).
ความแตกต่างระหว่างการตั้งขอบด้วย SetBorders และ SetBorder คืออะไร?
Table.SetBorders() ใช้สไตล์เส้น ความกว้าง และสีเดียวกับทุกขอบของตารางพร้อมกัน; Table.SetBorder() ตั้งค่าสำหรับข้างเดียว ทำให้แต่ละข้างสามารถมีการจัดรูปแบบที่แตกต่างกันได้.
ฉันจะรีเซ็ตการจัดรูปแบบบนเซลล์หรือแถวก่อนนำไปใช้ใหม่ได้อย่างไร?
เรียก CellFormat.ClearFormatting() บน CellFormat ของเซลล์, หรือ RowFormat.ClearFormatting() บน RowFormat ของแถว.