Điền dữ liệu vào mẫu Word bằng C#, không cần Office
Có người làm tệp invoice.docx trong Word, với {{customer}} ở chỗ cần điền tên. Bài này chỉ cách điền tệp đó từ C#: văn bản, các dòng bảng lặp lại và ảnh, rồi cách kiểm tra kết quả.
byte[] template = await HtmlToDocxConverter.ConvertAsync("<p>Customer: {{customer}}</p>");
byte[] filled = DocxEditor.ReplaceText(template, new Dictionary<string, string>
{
["{{customer}}"] = "Contoso Ltd",
});Placeholder bị Word chia nhỏ
- Word thường chia một placeholder như
{{customer}}thành ba hoặc bốn phần<w:t>riêng, ví dụ sau khi sửa lỗi gõ hoặc kiểm tra chính tả. - Khi đó lệnh tìm và thay trên XML không tìm thấy gì mà vẫn báo thành công.
ReplaceTextghép các phần lại với nhau trước khi so khớp.ReplaceTextcũng thay được trong phần đầu trang và chân trang, nên tên trong tiêu đề thư cũng được thay.- Khóa không có placeholder thì tài liệu giữ nguyên. Placeholder không có khóa thì giữ nguyên là văn bản, ví dụ
{{unknown}}.
Mỗi bản ghi một dòng
- Đặt một dòng mẫu trong bảng, và
FillRowsnhân bản nó cho từng bản ghi. - Mỗi dòng mới giữ đường viền, màu nền, phông chữ và độ rộng cột của dòng mẫu.
- Hãy tạo các dòng trước, rồi mới điền giá trị đơn.
FillRowsnhân bản dòng, nên placeholder đã nằm trong dòng đó sẽ bị chép vào mọi dòng. - Tên tập hợp trong placeholder,
{{item.Desc}}, khớp với tham sốcollection,"item".
Thay bằng ảnh
ReplaceImagethay một placeholder văn bản bằng dữ liệu ảnh.- Kích thước tính bằng point. Chỉ cho một cạnh thì cạnh kia tự co giãn để giữ tỉ lệ.
- Định dạng được xác định bằng dữ liệu của tệp, không bao giờ bằng tên tệp. Tệp tên
logo.pngnhưng chứa dữ liệu JPEG được đọc đúng là JPEG.
Kiểm tra kết quả
ExtractTexttrả về văn bản của tài liệu dưới dạng chuỗi, nên bài kiểm thử có thể xác nhận việc điền đã đúng.- Mặc định nó bỏ qua đầu trang và chân trang. Truyền
includeHeadersAndFooters: trueđể lấy cả hai.
Những điều nó không làm
- Không hỗ trợ đầu trang riêng cho từng section và trang chẵn lẻ (đối xứng). Trang đầu khác biệt thì có hỗ trợ.
DocxBlockcó bốn hàm tạo làHeading,Paragraph,TablevàImage. Nó cố ý không phải mô hình tài liệu đầy đủ; cần kiểm soát bố cục thật thì hãy dùng mẫu.- Phông chữ trong PDF phụ thuộc vào máy thực hiện chuyển đổi. Không có phông chữ nào được cài thì PDF quay về các phông chuẩn base-14. Cả hai đều hiển thị được, nhưng không giống hệt từng byte.
Cài đặt
dotnet add package Ank.DocToolkitĐọc trong tài liệu DocToolkitNuGetGitHub