Tổng quan
Tài liệu bảng tính là các tài liệu chứa dữ liệu dạng bảng — trong các hàng và cột. Chúng còn được gọi là workbooks (sổ làm việc). Có rất nhiều định dạng tài liệu bảng tính — Office Open XML (như XLSX, XLSM, v.v.), Microsoft Excel Binary File Format (XLS, XLT), OpenDocument Spreadsheet (ODS, FODS, OTS), các định dạng dựa trên văn bản có ký tự phân tách (CSV, TSV v.v.) và còn nhiều hơn nữa. Tất cả chúng tạo thành một nhóm được gọi là gia đình định dạng Spreadsheet. GroupDocs.Viewer hỗ trợ hầu hết các định dạng bảng tính khi nhập và cho phép chuyển đổi (render) chúng sang HTML, PDF, PNG và JPEG. Bài viết này giải thích cách thực hiện và những tùy chọn nào có sẵn, khi nào và tại sao nên sử dụng chúng.
Cách dùng cơ bản
Trước hết chúng ta cần nói về các tùy chọn. Có một lớp riêng trong API công khai: SpreadsheetOptions trong GroupDocs.Viewer.Options. Lớp này được thiết kế đặc biệt để điều chỉnh việc render của nhóm định dạng Spreadsheet. Nó có thể truy cập được từ bốn tùy chọn xem qua thuộc tính SpreadsheetOptions của mỗi loại:
- HtmlViewOptions.SpreadsheetOptions khi render tài liệu Spreadsheet sang HTML,
- PdfViewOptions.SpreadsheetOptions khi render tài liệu Spreadsheet sang PDF,
- PngViewOptions.SpreadsheetOptions khi render tài liệu Spreadsheet sang PNG,
- JpgViewOptions.SpreadsheetOptions khi render tài liệu Spreadsheet sang JPEG.
Khi không được chỉ định một cách rõ ràng, thuộc tính SpreadsheetOptions sẽ có giá trị ngầm định mặc định của một thể hiện lớp SpreadsheetOptions, sẽ được giải thích chi tiết sau trong bài.
Nhìn chung, việc render một tài liệu Spreadsheet với GroupDocs.Viewer rất đơn giản và giống như các định dạng khác — tạo một thể hiện ViewOptions, tạo một thể hiện Viewer với tài liệu Spreadsheet đầu vào được chỉ định, và gọi phương thức Viewer.View(viewOptions). Đoạn mã mẫu dưới đây minh họa việc render một tệp Spreadsheet duy nhất sang cả 4 định dạng đầu ra: HTML, PDF, PNG và JPEG. Lưu ý rằng ngoại trừ việc tạo các thể hiện của các lớp tùy chọn, không có bất kỳ tinh chỉnh nào liên quan đến bảng tính, vì vậy tất cả các tùy chọn bảng tính đều được để ở giá trị mặc định.
using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...
HtmlViewOptions htmlOptions = HtmlViewOptions.ForEmbeddedResources("worksheet_{0}.html");
PdfViewOptions pdfOptions = new PdfViewOptions("Output_spreadsheet.pdf");
PngViewOptions pngOptions = new PngViewOptions("worksheet_{0}.png");
JpgViewOptions jpegOptions = new JpgViewOptions("worksheet_{0}.jpeg");
using (Viewer viewer = new Viewer("spreadsheet.xlsx"))
{
viewer.View(htmlOptions);
viewer.View(pdfOptions);
viewer.View(pngOptions);
viewer.View(jpegOptions);
}
Bây giờ chúng ta sẽ nói về các worksheet (bảng tính). Mỗi bảng tính ít nhất có một worksheet. Trong hầu hết các phần mềm xử lý bảng như Microsoft Excel, các worksheet được biểu thị dưới dạng tab. Một số định dạng bảng tính có thể chỉ có một worksheet duy nhất; ví dụ như tất cả các định dạng dựa trên văn bản có ký tự phân tách (CSV, TSV v.v.).
Mặc định, GroupDocs.Viewer sẽ render tất cả các worksheet trong bảng tính đã cho. Tuy nhiên, có thể thay đổi cấu hình này. Phương thức Viewer.View() có một overload, cho phép truyền một tập hợp các số trang dưới dạng tham số thứ hai — Int32[] pageNumbers. Khi sử dụng tham số này, chỉ những trang được chỉ định mới được render. Tham số này là chung cho mọi định dạng hỗ trợ trang, nhưng trong ngữ cảnh của nhóm định dạng Spreadsheet, nó mô tả chính xác các số worksheet cần xem.
Lưu ý rằng đánh số trang (và đặc biệt là đánh số worksheet) bắt đầu từ 1, không phải 0.
Ví dụ dưới đây cho thấy cách render worksheet thứ 1 và thứ 3 sang PNG trong một bảng tính có 3 worksheet.
using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...
PngViewOptions pngOptions = new PngViewOptions("worksheet_{0}.png");
using (Viewer viewer = new Viewer("spreadsheet.xlsx"))
{
viewer.View(pngOptions, 1, 3);
}
Chia các worksheet thành các trang
GroupDocs.Viewer render tài liệu thành các trang, trong đó “trang” được hiểu là một vùng hình chữ nhật có kích thước tương đối nhỏ, tương đương với khu vực hiển thị trên màn hình hoặc trang A4. Ngược lại, các worksheet có thể rất lớn. Cụ thể, định dạng XLS (đã lỗi thời) hỗ trợ tối đa 256 cột và 65 536 hàng, trong khi định dạng mới hơn XLSX (Office Open XML Workbook) và Microsoft Excel đều hỗ trợ tới 16 384 cột và 1 048 576 hàng. “Việc” ghép các worksheet vào các trang là một phần quan trọng của việc render bảng tính với GroupDocs.Viewer. Để đưa một worksheet vào (các) trang, GroupDocs.Viewer thực hiện splitting worksheet — chia worksheet thành nhiều khối hình chữ nhật, mỗi khối sẽ được đặt trên một trang riêng. Có 5 phương pháp khác nhau, được liệt kê và mô tả dưới đây.
Điều quan trọng — tất cả các phương pháp chia này đều được chỉ định bằng cùng một cách — sử dụng một phương thức tĩnh (factory method) cụ thể để tạo một thể hiện của lớp SpreadsheetOptions.
Render toàn bộ worksheet trên một trang
SpreadsheetOptions.ForOnePagePerSheet()
Cách dễ nhất và đơn giản nhất — tắt việc chia và điều chỉnh kích thước trang sao cho vừa hết toàn bộ nội dung của worksheet. Đây là lựa chọn tốt khi đã biết worksheet có kích thước nhỏ. Tuy nhiên, nếu worksheet thực sự lớn, cách này có thể dẫn đến kết quả kém. Đặc biệt, khi render sang HTML, tài liệu HTML kết quả có thể rất lớn, hàng chục hoặc thậm chí hàng trăm MiB, gây khó khăn khi xem trong trình duyệt. Khi render sang JPEG, còn có khả năng kích thước chiều rộng hoặc chiều cao vượt quá giới hạn tối đa 65 535 pixel. Vì vậy, hãy sử dụng chế độ này một cách có chủ đích.
Chia worksheet theo các page break
SpreadsheetOptions.ForRenderingByPageBreaks()
Microsoft Excel tự động thêm các page break dựa trên kích thước giấy và các thiết lập trang như hướng và lề. Nếu bạn chuyển sang tab “View” và chọn chế độ “Page Break Preview”, sẽ thấy các đường màu xanh chia toàn bộ khu vực worksheet thành các khối hình chữ nhật, mỗi khối được đánh dấu “Page 1”, “Page 2”, v.v. Đây là cách Microsoft Excel “gợi ý” để chia một worksheet thành các trang.
Với phương pháp này, GroupDocs.Viewer thực hiện chia worksheet theo các page break giống như Microsoft Excel.
Cần lưu ý rằng tùy chọn này — chia worksheet theo page break — là tùy chọn mặc định của thuộc tính BaseViewOptions.SpreadsheetOptions. Vì vậy khi tạo một thể hiện của lớp tùy chọn view, tùy chọn [ForRenderingByPageBreaks()] sẽ được chọn sẵn.
Chỉ render khu vực in (Print Area)
SpreadsheetOptions.ForRenderingPrintArea()
Bên cạnh các page break, Microsoft Excel còn có khái niệm “Print Area”. Print Area thực chất là một hoặc nhiều vùng ô trong worksheet được chỉ định để in; bất kỳ nội dung nào nằm ngoài Print Area sẽ không được in. Để thêm một vùng ô vào Print Area, vào tab “Page Layout”, nhấn nút “Print Area” và chọn “Set Print Area” (xem ảnh chụp màn hình dưới). Để thêm một vùng ô khác, chọn vùng mới, nhấn lại nút “Print Area” và chọn “Add to Print Area”. Trong chế độ “Page Break Preview”, bạn sẽ thấy tất cả các vùng ô thuộc Print Area.
Render Print Area và chia theo page break
SpreadsheetOptions.ForRenderingPrintAreaAndPageBreaks()
GroupDocs.Viewer có tính năng độc đáo — kết hợp Print Area và page break trong một chế độ duy nhất. Trong trường hợp này, GroupDocs.Viewer sẽ đồng thời xét tới tất cả các vùng ô của Print Area và các page break để chia worksheet thành các trang.
Trong ảnh chụp màn hình dưới, đường đỏ biểu thị Print Area, còn đường xanh biểu thị các page break.
Chia worksheet thành các trang thủ công theo hàng và cột
SpreadsheetOptions.ForSplitSheetIntoPages(int countRowsPerPage)
SpreadsheetOptions.ForSplitSheetIntoPages(int countRowsPerPage, int countColumnsPerPage)
Đôi khi không phương pháp chia nào ở trên đáp ứng được, hoặc bảng tính có định dạng không hỗ trợ page break và Print Area, ví dụ như CSV dựa trên văn bản. Trong những trường hợp này, GroupDocs.Viewer cho phép người dùng tự chỉ định số hàng và/hoặc số cột sẽ xuất hiện trên mỗi trang. Nói ngắn gọn, sự khác biệt giữa “chỉ chia theo hàng” và “chia theo hàng + cột” được minh họa trong ảnh dưới.
Nếu sử dụng overload thứ nhất của phương thức ForSplitSheetIntoPages (một tham số), thì chỉ kích hoạt việc chia theo hàng. Nếu dùng overload thứ hai (hai tham số), thì kích hoạt việc chia theo cả hàng và cột.
Điều chỉnh các tùy chọn bổ sung
Tất cả những gì đã mô tả ở trên là cơ bản và đủ để render bảng tính bằng GroupDocs.Viewer. Tuy nhiên, còn rất nhiều tùy chọn bổ sung, không bắt buộc nhưng cho phép người dùng tinh chỉnh kết quả render hơn nữa.
Một số tùy chọn này được biểu diễn dưới dạng các thuộc tính của lớp SpreadsheetOptions, có thể truy cập thông qua thuộc tính SpreadsheetOptions của lớp tùy chọn view. Các tùy chọn khác nằm trong lớp trừu tượng ViewOptions, chung cho cả 4 chế độ render.
Render tiêu đề hàng và cột
Khi MS Excel hoặc một chương trình xử lý bảng tương tự mở một tài liệu bảng tính, nó sẽ hiển thị tiêu đề cột và hàng: các cột được đánh chữ (A, B, C, AA, AB, …) và các hàng được đánh số (1, 2, 3, …, 1048576). Khi render, GroupDocs.Viewer mặc định không hiển thị các tiêu đề này, vì chúng là một phần của giao diện phần mềm, không phải của tài liệu. Tuy nhiên, có thể bật chúng bằng thuộc tính RenderHeadings có kiểu boolean. Mặc định thuộc tính này tắt (false); khi bật (true), tiêu đề hàng và cột sẽ xuất hiện trong tài liệu đầu ra, như trong ảnh dưới.
Render đường kẻ lưới của worksheet
Khái niệm này rất giống với tùy chọn trên. Mặc định GroupDocs.Viewer không hiển thị các đường kẻ lưới giữa các ô, vì chúng không phải là phần của bảng tính mà chỉ là cách các trình xử lý bảng hiển thị nội dung. Tuy nhiên, bằng thuộc tính RenderGridLines kiểu boolean, bạn có thể mô phỏng hành vi của MS Excel. Gán giá trị true cho SpreadsheetOptions.RenderGridLines và các đường kẻ lưới sẽ xuất hiện trong tài liệu đầu ra, như trong ảnh dưới.
Kiểm soát tràn văn bản trong ô
Trong nhiều trường hợp, nội dung văn bản trong một ô không vừa với kích thước ô. Làm sao để hiển thị đúng? GroupDocs.Viewer cung cấp thuộc tính đặc biệt SpreadsheetOptions.TextOverflowMode để giải quyết vấn đề này. Thuộc tính TextOverflowMode có kiểu enum cùng tên, với 4 giá trị có thể chọn, được giải thích dưới đây.
OverlayIfNextIsEmpty
Mặc định SpreadsheetOptions.TextOverflowMode có giá trị OverlayIfNextIsEmpty, mô phỏng hành vi mặc định của Microsoft Excel. Giá trị này cho phép văn bản tràn sang các ô liền kề chỉ khi các ô đó trống. Nếu ô liền kề có dữ liệu, văn bản sẽ bị cắt ngắn.
Ảnh chụp màn hình trên cho thấy tệp HTML được render từ một tệp XLSX với giá trị OverlayIfNextIsEmpty. Ô “B2” có văn bản dài và bị cắt vì ô “C2” không trống. Ô “C3” cũng có văn bản dài, nhưng vì các ô “D2”, “E2” trống nên văn bản tràn sang chúng.
Overlay
Giá trị Overlay tương tự nhưng mạnh hơn: văn bản dài luôn tràn sang các ô liền kề, bất kể các ô đó có dữ liệu hay không; dữ liệu cũ sẽ bị ghi đè.
Trong ảnh, văn bản dài của ô “B2” tràn sang các ô “C2”, “D2”, “E2”, “F2”. Kết quả, nội dung cũ của các ô “C2” và “F2” bị xóa.
HideText
TextOverflowMode.HideText hoạt động ngược lại với Overlay: thay vì tràn, văn bản sẽ luôn bị cắt ngắn nếu không vừa trong ô, bất kể có không gian trống ở các ô liền kề.
Trong ảnh, ô “C3” bị cắt ngắn dù có không gian trống ở “D3” và các ô kế bên.
AutoFitColumn
Giá trị AutoFitColumn giải quyết vấn đề bằng cách tự động mở rộng độ rộng cột để vừa với nội dung ô. Như vậy, dù văn bản dài đến mức nào, độ rộng cột chứa ô sẽ được tăng để chứa toàn bộ chuỗi.
Ảnh trên cho thấy cách hoạt động. Lưu ý rằng cách này có thể làm cho trang trở nên quá rộng, gây khó chịu khi cuộn ngang.
Render các hàng và cột ẩn
Microsoft Excel và các trình xử lý bảng khác cho phép ẩn các hàng và cột. Mặc định GroupDocs.Viewer không render các hàng, cột ẩn, nhưng có thể thay đổi bằng cách đặt thuộc tính ViewOptions.SpreadsheetOptions.RenderHiddenRows và ViewOptions.SpreadsheetOptions.RenderHiddenColumns thành true.
Render các worksheet ẩn
Giống như hàng và cột ẩn, một tệp bảng tính có thể chứa một hoặc nhiều worksheet ẩn. Mặc định GroupDocs.Viewer cũng không render chúng, nhưng có thể bật bằng thuộc tính RenderHiddenPages bằng cách đặt giá trị true. Lưu ý rằng RenderHiddenPages không nằm trong SpreadsheetOptions mà nằm trong lớp trừu tượng BaseViewOptions, chung cho mọi tùy chọn view.
Bỏ qua các hàng và cột trống
Một số bảng tính “sparse” (thưa thớt) chứa nhiều ô trống, chiếm không gian không cần thiết. GroupDocs.Viewer có tính năng bỏ qua các hàng và cột trống khi render. Khi bật tính năng này, các hàng và/hoặc cột trống sẽ không xuất hiện trong HTML, PDF, PNG và JPEG cuối cùng. Các thuộc tính boolean SpreadsheetOptions.SkipEmptyRows và SpreadsheetOptions.SkipEmptyColumns chịu trách nhiệm cho tính năng này.
Ảnh chụp màn hình trên cho thấy cả SkipEmptyRows và SkipEmptyColumns đều được bật.
Render hoặc ẩn nhận xét (comments) của ô
Các ô trong bảng tính có thể có nhận xét, và mặc định GroupDocs.Viewer sẽ render tất cả chúng. Tuy nhiên, có thể tắt bằng thuộc tính BaseViewOptions.RemoveComments — đặt giá trị true để không render bất kỳ nhận xét nào. Lưu ý rằng thuộc tính này nằm trong lớp BaseViewOptions, không phải trong SpreadsheetOptions.
Ảnh trên cho thấy việc render tệp XLSX có nhận xét ô sang PNG với các tùy chọn mặc định — nhận xét của ô “E2” xuất hiện trong tệp PNG kết quả.
Đặt lề worksheet cho các trang PDF đầu ra
Khi render worksheet sang PDF, có thể điều chỉnh lề trang — khoảng cách (cm) từ biên trang đến nội dung. Có 4 thuộc tính để điều chỉnh lề trên, phải, dưới và trái:
SpreadsheetOptions.TopMarginSpreadsheetOptions.RightMarginSpreadsheetOptions.BottomMarginSpreadsheetOptions.LeftMargin
Mặc định, cả 4 thuộc tính này đều có giá trị âm, nghĩa là lề mặc định sẽ được áp dụng bởi GroupDocs.Viewer. Tuy nhiên, bạn có thể đặt giá trị cụ thể cho chúng. Lưu ý rằng lề trang chỉ được áp dụng khi định dạng đích là PDF.
Đoạn mã dưới đây tạo một thể hiện của PdfViewOptions, thiết lập 4 lề và render tài liệu:
using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...
PdfViewOptions pdfViewOptions = new PdfViewOptions("Output.pdf");
pdfViewOptions.SpreadsheetOptions = SpreadsheetOptions.ForOnePagePerSheet();
pdfViewOptions.SpreadsheetOptions.TopMargin = 2;
pdfViewOptions.SpreadsheetOptions.BottomMargin = 4;
pdfViewOptions.SpreadsheetOptions.LeftMargin = 8;
pdfViewOptions.SpreadsheetOptions.RightMargin = 0;
using (var viewer = new Viewer("spreadsheet.xlsx"))
{
viewer.View(pdfViewOptions);
}
Hình ảnh sau minh họa kết quả:
Kết luận
Định dạng bảng tính khá phức tạp và tài liệu có thể chứa nội dung đa dạng về loại và độ dài. Trong nhiều trường hợp, việc render một tài liệu bảng tính phức tạp sang một định dạng nào đó chỉ dùng các tùy chọn mặc định là không đủ, vì vậy GroupDocs.Viewer cung cấp một bộ thuộc tính phong phú; với chúng, người dùng có thể điều chỉnh việc render sao cho đáp ứng nhu cầu cá nhân.
Xem thêm
- Render Excel và Apple Numbers spreadsheets dưới dạng HTML, PDF và file ảnh
- Chia một worksheet thành các trang
- Chỉ định các tùy chọn render bảng tính
Dùng thử miễn phí
Bạn có thể tải về bản dùng thử miễn phí của GroupDocs.Viewer cho .NET từ releases.groupdocs.com. Bạn cũng có thể nhận giấy phép tạm thời để thử tất cả các tính năng và chức năng không giới hạn từ đây.