Cách làm việc với các bảng trong .NET
Hướng dẫn này cho thấy cách xây dựng, định dạng và đọc các bảng một cách lập trình trong Aspose.Words FOSS cho .NET, sử dụng Table, Row, và Cell các lớp trong Aspose.Words.Tables không gian tên cùng với DocumentBuilder. Nó bao gồm việc tạo một bảng từ đầu, định dạng các ô và hàng khi bạn xây dựng, kiểm soát bố cục toàn bảng và AutoFit, đặt chiều rộng ưa thích, hợp nhất các ô, và đọc các bảng đã có trong tài liệu đã tải.
Hướng dẫn từng bước
Bước 1: Cài đặt gói
Aspose.Words FOSS cho .NET chưa công bố gói NuGet – hãy xây dựng thư viện từ mã nguồn thay thế. Sao chép https://github.com/aspose-words-foss/Aspose.Words-FOSS-for-.NET.git, sau đó biên dịch Aspose.Words.sln ở cấu hình Release với SDK .NET và tham chiếu tới assembly Aspose.Words kết quả từ dự án của bạn. Thư viện nhắm tới .NET Standard 2.0, vì vậy nó chạy trên .NET Framework 4.6.2+ và .NET 6/8/10.
Bước 2: Nhập các lớp cần thiết
Thêm một chỉ thị using Aspose.Words; cho các lớp tài liệu cốt lõi (Document, DocumentBuilder), và một chỉ thị using Aspose.Words.Tables; cho các lớp đặc thù bảng mà hướng dẫn này đề cập – Table, Row, Cell, CellFormat, RowFormat, PreferredWidth, và các enum liên quan.
Bước 3: Xây dựng một Bảng Mới với DocumentBuilder
Tạo một Document và một DocumentBuilder được liên kết với nó, sau đó gọi DocumentBuilder.StartTable() để bắt đầu một bảng tại con trỏ. Đối với mỗi ô trong một hàng, gọi DocumentBuilder.InsertCell(), rồi đóng hàng bằng DocumentBuilder.EndRow(). Lặp lại cho số hàng cần thiết của bảng, và đóng toàn bộ bảng bằng DocumentBuilder.EndTable(). Mỗi StartTable() cần một EndTable() tương ứng, và mỗi hàng cần một EndRow() tương ứng, nếu không trạng thái nội bộ của builder — và cây tài liệu kết quả — sẽ bị sai cấu trúc.
Bước 4: Định dạng các ô và hàng khi bạn xây dựng
Đặt DocumentBuilder.CellFormat và DocumentBuilder.RowFormat trước khi gọi InsertCell() hoặc EndRow() để áp dụng định dạng cho các ô và hàng mà builder sắp tạo — hai thuộc tính này hoạt động như một mẫu cho nội dung mới, không phải là thay đổi hồi tố cho các ô đã chèn. CellFormat tiết lộ Borders, Shading, Width, WrapText, FitText, HorizontalMerge, VerticalMerge, VerticalAlignment, PreferredWidth, và bốn thuộc tính đệm (LeftPadding, RightPadding, TopPadding, BottomPadding), tất cả có thể được đặt cùng một lúc bằng SetPaddings(). RowFormat tiết lộ Borders, Height, HeightRule, AllowBreakAcrossPages, và HeadingFormat. Gọi CellFormat.ClearFormatting() hoặc RowFormat.ClearFormatting() để đặt lại bất kỳ một trong số chúng về mặc định trước khi đặt giá trị mới cho hàng hoặc ô tiếp theo.
Bước 5: Đặt Bố Cục Toàn Bảng và AutoFit
Khi bảng đã tồn tại, đặt các thuộc tính bố cục trực tiếp trên đối tượng Table: Alignment (TableAlignment), Bidi, LeftIndent, PreferredWidth, Style, StyleIdentifier, StyleName, StyleOptions (TableStyleOptions), và TextWrapping. Gọi Table.SetBorders() để áp dụng một kiểu viền, độ rộng và màu sắc cho toàn bộ bảng, hoặc Table.SetBorder() để đặt một phía riêng; ClearBorders() và ClearShading() đặt lại chúng. Table.AutoFit(AutoFitBehavior) thay đổi kích thước bảng và các ô của nó theo hành vi đã chọn — gọi lại sau bất kỳ chỉnh sửa cấu trúc nào, vì nó chỉ phản ánh trạng thái của bảng tại thời điểm chạy, không liên tục.
Bước 6: Đặt Chiều Rộng Ưu Tiên và Chiều Rộng Ô
Tạo các giá trị chiều rộng bằng các phương thức factory tĩnh PreferredWidth.FromPercent() cho một bố cục thích ứng với chiều rộng trang có sẵn, hoặc PreferredWidth.FromPoints() cho chiều rộng cố định; PreferredWidthType báo cáo loại giá trị nào (Auto, Percent, hoặc Points) một PreferredWidth cụ thể chứa. Gán kết quả cho Table.PreferredWidth cho toàn bộ bảng hoặc CellFormat.PreferredWidth cho một ô.
Bước 7: Gộp Ô
Đánh dấu các ô là đã gộp bằng cách đặt CellFormat.HorizontalMerge hoặc CellFormat.VerticalMerge (cả hai được nhập CellMerge) trên các ô cần tham gia vào việc gộp. Nếu các ô chỉ được làm cho trông như đã gộp bằng cách khớp độ rộng thay vì được gắn cờ rõ ràng, hãy gọi Table.ConvertToHorizontallyMergedCells() để chuyển bố cục trực quan đó thành các ô có trạng thái CellMerge thực tế. CellVerticalAlignment kiểm soát cách nội dung được căn dọc trong một ô, độc lập với bất kỳ việc gộp nào.
Bước 8: Đọc Các Bảng Từ Tài Liệu Hiện Có
Để làm việc với các bảng đã có trong tài liệu đã tải, đọc Body.Tables (hoặc thuộc tính Tables trên bất kỳ Story nào khác) — một TableCollection — thay vì tạo mới. Table.Rows trả về một RowCollection và Row.Cells trả về một CellCollection; cả ba kiểu bộ sưu tập đều hỗ trợ Add(), Insert(), Remove(), RemoveAt(), Contains(), và IndexOf() cho các chỉnh sửa bằng chương trình. Sau khi xóa các hàng hoặc ô, gọi Table.EnsureMinimum(), Row.EnsureMinimum(), hoặc Cell.EnsureMinimum() để nút giữ cấu trúc hợp lệ tối thiểu mà Word mong đợi — một hàng trống, một ô trống, hoặc một đoạn văn trống, tương ứng.
Các Vấn Đề Thường Gặp và Cách Khắc Phục
Một tài liệu đã lưu trông bị sai định dạng, hoặc xảy ra lỗi khi lưu Một hàng hoặc toàn bộ bảng chưa bao giờ được đóng. Luôn ghép DocumentBuilder.StartTable() với một cuối cùng EndTable(), và đóng mỗi hàng bằng EndRow() trước khi chuyển sang hàng tiếp theo hoặc kết thúc bảng.
Các ô mới không nhận định dạng tôi đã đặt CellFormat and RowFormat đã được thay đổi trên DocumentBuilder sau khi các ô bị ảnh hưởng đã được chèn. Đặt DocumentBuilder.CellFormat / RowFormat trước InsertCell() or EndRow() lệnh gọi tạo nội dung bạn muốn định dạng.
Bảng không thay đổi kích thước như tôi mong đợi sau khi tôi chỉnh sửa nội dung của nó Table.AutoFit(AutoFitBehavior) chỉ phản ánh cấu trúc của bảng tại thời điểm nó được gọi. Hãy gọi lại sau bất kỳ chỉnh sửa cấu trúc nào – thêm hoặc xóa hàng, ô, hoặc nội dung – nếu bố cục cần được điều chỉnh lại.
Các ô trông như đã hợp nhất lại lại hành xử như các ô riêng biệt khi đọc lại Các ô chỉ được khớp theo chiều rộng, không được gắn cờ với CellMerge. Gọi Table.ConvertToHorizontallyMergedCells(), hoặc đặt CellFormat.HorizontalMerge / VerticalMerge một cách rõ ràng trên các ô nên hợp nhất.
Việc xóa các hàng hoặc ô làm cho bảng ở trạng thái không hợp lệ Word yêu cầu mỗi Table, Row, và Cell để duy trì cấu trúc hợp lệ tối thiểu. Sau khi xóa nội dung bằng chương trình, gọi EnsureMinimum() trên node vừa được sửa đổi.
Câu hỏi thường gặp
Làm thế nào để tôi tạo một bảng từ đầu thay vì chỉnh sửa một bảng đã có?
Sử dụng DocumentBuilder: gọi StartTable(), sau đó InsertCell() cho mỗi ô trong một hàng, EndRow() để đóng hàng, lặp lại cho các hàng bổ sung, và EndTable() để đóng bảng.
Làm sao tôi có thể lấy các bảng đã tồn tại trong tài liệu đã tải?
Đọc thuộc tính Tables (một TableCollection) trên Body của phần mà bạn quan tâm, hoặc trên bất kỳ Story nào khác như tiêu đề hoặc chân trang.
Làm sao để đặt bảng có độ rộng là phần trăm của trang thay vì độ rộng cố định?
Gán Table.PreferredWidth = PreferredWidth.FromPercent(value) thay vì PreferredWidth.FromPoints(value).
Sự khác biệt giữa việc đặt viền bằng SetBorders và SetBorder là gì?
Table.SetBorders() áp dụng một kiểu đường, độ rộng và màu cho mọi viền trong bảng cùng một lúc; Table.SetBorder() thiết lập cho một phía, cho phép các phía khác có định dạng riêng.
Làm sao để đặt lại định dạng cho một ô hoặc một hàng trước khi sử dụng lại?
Gọi CellFormat.ClearFormatting() trên CellFormat của ô, hoặc RowFormat.ClearFormatting() trên RowFormat của hàng.