Normal 0 false false false EN-US X-NONE X-NONE MicrosoftInternetExplorer4
TẠO CÁC TÀI LIỆU TỪ SHAREPOINT BẰNG CÁC TRÌNH QUẢN LÝ NỘI DUNG OPEN XML
Thông thường, một trưởng phòng cần gửi một bản báo cáo tình trạng đã được định dạng một cách tỉ mỉ đến người quản lý hoặc một trưởng nhóm cần gửi báo cáo tình hình hàng tuần đến nhiều nhóm có liên quan. Để cộng tác cùng với những đồng nghiệp khác trong tồ chức của họ, cả người quản lý và trưởng nhóm có thể bảo duy trì thông tin tình hình trong các danh sách SharePoint. Câu hỏi đặt ra cho các nhà phát triển là làm thế nào để đưa thông tin vào trong các dách sách trong một tài liệu chẳng hạn như một báo cáo tình hình.
Open XML, định dạng file mặc định cho Office 2007, là một chuẩn ISO (dữ liệu được đưa vào chính xác từng chi tiết theo chuẩn IS29500). Đưa vào rất đơn giản, các file Open XML là các file ZIP có chứa XML, và về mặt lập trình thì dễ dàng tạo hoặc chỉnh sửa các tài liệu Open XML. Tất cả những gì bạn cần là một thư viện để mở một file ZIP và XML API. Bằng cách sử dụng các chức năng có khả năng lập trình của Open XML và SharePoint, bạn có thể đặt chung một hệ thống tạo tài liệu nhỏ để mang lại hiệu quả của các trình quản lý Open XML và đặt những người như nhà quản lý và trưởng nhóm quản lý các báo cáo của họ. Trong mục này, tôi sẽ giới thiệu một vài hướng dẫn và code mẫu để tạo một hệ thông tạo tài liệu sử dụng các danh sách SharePoint để đưa các bảng vào trong một tài liệu xử lý từ Open XML.
Sơ lược về ví dụ mẫu:
Ví dụ mẫu trong mục này là một SharePoint Web Part nhỏ để tạo ra một tài liệu xử lý từ Open XML từ dữ liệu được lưu trữ trong các danh sách SharePoint. Tôi đã tạo ra 2 cột danh sách SharePoint tùy ý, xem hình Minh họa 1, chứa dữ liệu chúng tôi muốn chèn vào các bảng.
Minh họa 1: Hai danh sách SharePoint tùy chọn.
Tôi cũng đã tạo ra một định dạng tài liệu xử lý từ Open XML bao gồm các trình quản lý nội dung dùng để định nghĩa các danh sách và các cột là các nguồn của dữ liệu cho tài liệu được tạo ra. Các trình quản lý được trình bày trong Minh họa 2.
Minh họa 2: Định dạng tài liệu Open XML chứa các trình quản lý nội dung.
Cuối cùng tôi tạo ra một Web Part để lấy ra danh sách của các tài liệu mẫu từ một thư viện tài liệu cụ thể và hiển thị danh sách đó cho người dùng. Người dùng chọn một đối tượng trong danh sách và sau đó click vào nút Generate Report. Web Part tạo ra một tài liệu xử lý từ Open XML, đặt nó vào trong thư viện tài liệu Report và chuyển hướng người dùng đến thư viện mà người đó có thể mở báo cáo. Web Part được trình bày trong Minh họa 3, và tài liệu mà nó tạo ra được trình bày trong Minh họa 4.
Minh họa 3: Một SharePoint Web Part cho phép người dùng chọn một mẫu tài liệu.
Các trình quản lý nội dung Open XML:
Trước khi mô tả cách giải quyết SharePoint, tôi sẽ nói sơ qua những điểm cơ bản của các trình quản lý nội dung Open XML. Các trình quản lý nội dung Open XML cung cấp một bộ công cụ bằng các tài liệu xử lý từ cho phép bạn mô tả nội dung và kết hợp dữ liệu về dữ liệu với nội dung đó. Để sử dụng các trình quản lý nội dung, bạn phải kích hoạt tab Developer trong Microsoft Office 2007. (Chọn Word Options trên thanh menu, sau đó, trong hộp thoại Word Options chọn Show Developer Tab in Ribbon).
Để chèn vào một trình quản lý nội dung, chọn một vài đoạn text và sau đó click vào nút trong vùng Controls của tab Developer để tạo ra một trình quản lý nội dung text đơn giản, xem Minh họa 5.
Minh họa 4: Một tài liệu xử lý từ Open XML chứa báo cáo đã được tạo ra.
Minh họa 5: Sử dụng nút này để tạo một trình quản lý nội dung thuần văn bản.
Bạn có thể đặt các thuộc tính cho một trình quản lý nội dung để đặt tiêu đề và gán tag cho nó. Click vào trình quản lý nội dung, sau đó chọn nút Properties trong vùng Controls trên tab Developer. Nó sẽ hiển thị một hộp thoại cho bạn viết tiêu đề và tag.
Các trình quản lý nội dung sử dụng thành phần w:sdt trong việc đánh dấu Open XML, được trình bày trong Minh họa 6. Các nội dung của trình quản lý nội dung được định nghĩa trong thành phần w:sdtContent. Trong hình minh họa, bạn có thể thấy tiêu đề của trình quản lý nội dung trong thành phần w:alias và tag trình quản lý nội dung trong thành phần w:tag.
Lập trình Open XML sử dụng .NET Framework:
Bạn có thể có nhiều cách tiếp cận để lập trình Open XML sử dụng .NET Framework:
- Sử dụng các lớp trong thư viện System.IO.Packaging.
- Sử dụng công cụ Open XML SDK cùng bất kì kỹ thuật lập trình XML nào dùng được trên môi trường .NET, bao gồm XmlDocument, XmlParser hoặc LINQ to XML. Sở thích của tôi là LINQ to XML.
- Sử dụng kiểu mô hình đối tượng mạnh của bộ công cụ Open XML SDK phiên bản 2.0. Bạn có thể tìm thấy nhiều mục giới thiệu cách lập trình với mô hình đối tượng này.
Ở đây tôi sẽ sử dụng bộ công cụ Open XML SDK (phiên bản 1.0 hoặc 2.0 đều được) cùng LINQ to XML. Bạn có thể download bộ công cụ Open XML SDK từ http://go.microsoft.com/fwlink/?LinkId=127912
Tóm lượt chức năng Open XML xoay quanh một vài trình quản lý nội dung trong lớp ContentControlManager rất là hữu ích. Khi bạn gặp vấn đề trong cách tiếp cận này, bạn có thể phát triển chức năng Open XML trong một ứng dụng console đơn giản. Sau khi bạn đã code và debug chức năng Open XML của bạn, bạn có thể kết hợp nó vào trong chức năng SharePoint của bạn mà không phải tốn nhiều công sức. Khá là tốn thời gian để chịu chi phí triển khai chức năng SharePoint trong khi debug mã Open XML.
Về ví dụ tạo ra tài liệu SharePoint của chúng ta, chúng ta muốn viết một vài đoạn mã để lấy ra một định dạng tài liệu từ một thư viện tài liệu đã được định nghĩa, truy vấn tài liệu cho các trình quản lý nội dung nó chứa và sử dụng siêu dữ liệu được lưu trong mỗi trình quản lý nội dung để đưa vào tài liệu với dữ liệu được lấy từ danh sách SharePoint tương ứng.
Nếu bạn download ví dụ và kiểm nghiệm định dạng tài liệu Open XML, bạn sẽ thấy nó bao gồm mộ trình quản lý nội dung quanh mỗi bảng và trình quản lý nội dung đó được chèn vào mỗi ô trong hàng trên cùng của mỗi bảng. Thẻ tag cho mỗi trình quản lý nội dung trong các ô của bảng định nghĩa tên của một cột trong các danh sách SharePoint. Để thuận lợi, tôi đặt tiêu đề của mỗi trình quản lý nội dung cùng giá trị như thẻ tag. Các trình quản lý nội dung hiển thị tiêu đề của chúng khi điểm chèn nằm bên trong control.
Khi bạn viết code cho chức năng SharePoint để tạo ra tài liễu Open XML, đều tiên code của bạn nên truy vấn tài liệu cho các trình quản lý nội dung. Câu truy vấn trả về một cây XML mô tả cấu trúc của các trình quản lý nội dung song song với thẻ tag. Nếu bạn chạy đoạn code này trong tài liệu ví dụ, nó tạo ra file XML như sau:
Tài liệu XML này cho ta biết các danh sách SharePoint nào đoạn code của chúng ta cần truy vấn. Cho mỗi đối tượng trong danh sách, bạn cần lấy ra các giá trị của các cột đã được khai báo. Đoạn mã để truy vấn tài liệu xử lý từ Open XML, được trình bày trong Minh họa 7, được viết như một câu truy vấn LINQ to XML sử dụng cấu trúc hàm để tạo ra cấu trúc file XML được trả về.
Để sử dụng cấu trúc hàm, đoạn mã tạo một đối tượng XElement sử dụng phương thức khởi tạo của nó, qua một câu truy vấn LINQ to XML như một đối số cho phương thức khởi tạo. Câu truy vấn LINQ to XML sử dụng phương thức trục để lấy các thành phần tương ứng trong thân của tài liệu và sử dụng phương thức mở rộng Enumerable.Select để tạo cấu trúc cho file XML mới từ kết quả của câu truy vấn. Cấu trúc hàm cần nghiên cứu một chút để hiểu nó, nhưng như bạn có thể thấy, mỗi khi bạn bọc phần đầu hàm của bạn quanh nó, bạn có thể tạo ra một tập tin bằng một đoạn mã ngắn.
Minh họa 6: Đánh dấu Open XML cho một trình quản lý nội dung.
Sự phân tán các đối tượng XName và XNamespace:
Đoạn mã trong Minh họa 7 sử dụng một sự tiếp cận được gọi là "sự phân tán" của các tên gọi LINQ to XML. Điều này chỉ như một cách tưởng tượng của việc nói rằng bạn viết một lớp tĩnh (xem Minh họa 8) bao gồm các trường tĩnh được cài đặt cho các tên đã được xác định của các thành phần và các thuộc tính bạn đang sử dụng.
Minh họa 7: Lấy cấu trúc của các trình quản lý nội dung trong tài liệu mẫu.
Có một lý do tốt để cài đặt các đối tượng XName và XNamespace trong cách này. LINQ to XML trừu tượng hóa các định danh XML và các không gian tên vào 2 lớp: System.Xml.Linq.XName và System.Xml.Linq.XNamespace một cách tương ứng. Các ngữ nghĩa của các lớp này bao gồm khái niệm mà nếu có 2 XName cùng tên được định nghĩa (không gian tên và tên cục bộ) thì chúng sẽ được mô tả trong cùng một đối tượng. Điều này cho phép so sánh nhanh giữa các đối tượng XName. Thay ví sử dụng một chuỗi so sánh để chọn các đối tượng XElement của một cái tên được đưa ra, đoạn mã chỉ cần so sánh các đối tượng. Khi bạn thiết lập một đối tượng XName, đầu tiên LINQ to XML xem trong bộ nhớ đệm để xác định cho dù một đối tượng XName có cùng không gian tên và tên đã tồn tại. Nếu có một đối tượng tồn tại, đối tượng được thiết lập cho đối tượng XName đang tồn tại từ bộ nhớ đệm. Nếu chưa có đối tượng nào tồn tại, LINQ to XML thiết lập một đối tượng mới và thêm nó vào bộ nhớ đệm. Như bạn có thể tưởng tượng, nếu tiến trình này được lặp đi lặp lại, nó có thể dẫn đến kết quả trong việc thể hiện kết quả. Bằng cách thiết lập các đối tượng này trong một lớp tĩnh, công việc sẽ được thực hiện duy nhất một lần. Hơn nữa, bằng cách sử dụng kỹ thuật này, bạn có thể giảm bớt khả năng một tên thành phần hoặc một thuộc tính bị viết sai chính tả trong thân của đoạn mã. Một ưu điểm khác là bằng cách sử dụng kỹ thuật này, bạn được hỗ trợ từ chức năng IntelliSense mà nó làm cho việc viết các chương trình Open XML sử dụng LINQ to XML trở nên dễ dàng hơn.
Minh họa 8: Một lớp tĩnh chứa các trường tĩnh để phân tán các đối tượng XName và XNamespace.
Các phương thức mở rộng GetXDocument và PutXDocument:
Ví dụ đã trình bày trong mục này cũng sử dụng một ít “thiểu xảo” khác để làm đơn giản việc lập trình và cải tiến việc thi hành. Bộ công cụ Open XML SDK có khả năng đưa các lời chú thích vào các phần trong tài liệu. Điều này có nghĩa rằng bạn có thể đính kèm bất cứ đối tượng .NET Framework nào vào một đối tượng OpenXmlPart và sau đó lấy nó ra bằng cách xác định kiểu của đối tượng mà bạn đã đính kèm.
Chúng ta có thể định nghĩa 2 phương thức mở rộng là GetXDocument và PutXDocument sử dụng các chú thích để giảm thiểu việc kết hợp chuỗi của file XML từ phần Open XML. Khi bạn gọi phương thức GetXDocument, đầu tiên nó sẽ tìm xem có chú thích của loại XDocument nào tồn tại hay chưa trong OpenXMLPart. Nếu có chú thích tồn tại, GetXDocument trả về nó. Ngược lại, phương thức lấy một XDocument từ OpenXmlPart, chú thích phần đó và sau đó trả về đối tượng XDocument mới.
Phương thức mở rộng PutXDocument cũng kiểm tra có một chú thích nào của loại XDocument tồn tại hay chưa. Nếu có, PutXDocument viết đối tượng XDocument (có thể được chỉnh sửa sau khi đoạn mã gọi phương thức GetXDocument) trở lại OpenXmlPart. Các phương thức mở rộng GetXDocument và PutXDocument được trình bày trong Minh họa 9. Bạn có thể thấy cách sử dụng của phương thức mở rộng GetXDocument trong phương thức GetContentControls được liệt kê ở Minh họa 7.
Minh họa 9: Các phương thức mở rộng sử dụng các ghi chú Open XML SDK để làm giảm việc kết hợp chuỗi của XML.
Thay thế các trình quản lý nội dung bằng dữ liệu:
Bây giờ chúng ta có một phương thức trả về cấu trúc của các trình quản lý nội dung trong các bảng và ô, chúng ta cần một phương thức (SetContentControls) để tạo ra một tài liệu Open XML bằng dữ liệu xác định (được lấy ra từ các danh sách SharePoint) được chèn vào trong các bảng. Chúng ta có thể định nghĩa phương thức này để lấy cây XML như là một đối số. Cây XML được trình bày trong Minh họa 10 và 11 thể hiện tài liệu mà phương thức SetContentControls tạo ra khi nó truyền vào cây XML.
Minh họa 10: Một cây XML chứa nội dung để truyền vào các bảng tài liệu xử lý từ Open XML.
Minh họa 11: Tài liệu đã được tạo.
Bạn có thể thấy rằng hàng đơn bao gồm các trình quản lý nội dung đã được thay thế bằng các dòng đa, mỗi dòng chứa dữ liệu từ cây XML mà nó được truyền như một đối số cho phương thức. Bằng cách sử dụng một cây XML để truyền dữ liệu cho đoạn mã điều khiền việc đánh dấu Open XML, bạn thực hiện một sự phân hoạch của đoạn mã sử dụng mô hình đối tượng SharePoint và mã Open XML.
Đoạn mã để nhúng vào tài liệu mới giữ lại bất kì định dạng mà bạn đã áp dụng cho bảng. Ví dụ, nếu bạn thiết lập bảng để thể hiện các màu sắc khác nhau cho việc đổi hàng, hoặc bạn thiết lập màu nền của một cột, tài liệu mới được tạo ra phản ánh sự thay đổi định dạng của bạn.
Nếu bạn download và kiểm nghiệm ví dụ ContentControlManager, bạn sẽ thấy đoạn mã lấy một bản sao của dòng chứa các trình quản lý nội dung và lưu nó như một hàng mẫu:
Sau đó, mỗi đối tượng lấy ra từ danh sách SharePoint, đoạn mã mô phỏng hàng mẫu đó, thay đổi hàng mẫu bằng dữ liệu từ dữ liệu từ danh sách SharePoint và thêm nó vào mộ bộ sưu tập để được chèn vào trong tài liệu.
Sau khi tạo ra danh sách các hàng mới, đoạn mã xóa hàng mẫu từ danh sách và chèn vào bộ sưu tập các hàng mới được tạo ra, như được trình bày ở đây:
Tạo chức năng SharePoint:
Tôi đã dùng phiên bản CTP tháng 2/2009 của các mở rộng của Visual Studio 2008 cho Windows SharePoint Services 3.0, v1.3 để làm ví dụ này. Tôi đã làm và chạy ví dụ này trên cả 2 phiên bản là 32-bit và 64-bit của WSS (Kirk Evans có một vài webcast hay để chỉ cách sử dụng các mở rộng này).
Ví dụ chứa đoạn mã để tạo ra các trình quản lý Web Part. Đoạn mã là lời tự giải thích hay nếu bạn đã quen với việc xây dựng SharePoint Web Part. Khi một người dùng click vào nút Generate Report, đoạn mã gọi phương thức CreateReport để nhúng tài liệu Open XML word-processing mới vào định dạng tài liệu bằng cách sử dụng dữ liệu trong các danh sách SharePoint như đã được thiết lập trong các thẻ tag của các trình quản lý nội dung. Có một vài điểm cần chú ý về đoạn mã cho phương thức CreateReport. Các file trong một thư viện tài liệu trong SharePoint được trả về như các mảng byte. Bạn cần phải chuyển mảng byte này thành một luồng bộ nhớ để bạn có thể mở và chỉnh tài liệu sử dụng bộ công cụ Open XML SDK. Một trong các phương thức khởi tạo MemoryStream nhận một mảng byte và bạn có thể tạm thời sử dụng phương thức khởi tạo đó. Tuy nhiên, luồng dữ liệu được tạo ra bằng phương thức khởi tạo đó là một luồng dữ liệu không thay đổi kích thước được, và bộ công cụ Open XML SDK đòi hỏi luồng dữ liệu có thể thay đổi kích thước được. Cách giải quyết là tạo ra một MemoryStream bằng phương thức khởi tạo mặc định và sau đó viết mảng byte từ SharePoint vào MemoryStream, như được trình bày trong Minh họa 12.
Minh họa 12: Viết một mảng byte từ SharePoint vào một MemoryStream.
Phần còn lại của đoạn mã thì không phức tạp lắm. Nó dử dụng mô hình đối tượng SharePoint để lấy ra các thư viện tài liệu và các nội dung của các thư viện, lấy ra các danh sách và các giá trị của các cột cho từng hàng trong danh sách. Nó nhúng cây XML để truyền vào phương thức ContentControlManager.SetContentControls, sau đó nó gọi phương thức SetContentControls.
Đoạn mã nhúng tên của tài liệu bản báo cáo được tạo ra chẳng hạn như Report-yyyy-mm-dd. Nếu Bản báo cáo đã tồn tại, đoạn mã gắn thêm một số vào tên bản báo cáo để phân biệt với các bản báo cáo khác đã được tạo trước đó. Ví dụ, nếu Report-2009-08-01.docx đã tồn tại, bản báo cáo được ghi thành Report-2009-8-2 (1).docx.
Dễ dàng tùy chỉnh:
Chắc rằng bạn sẽ muốn tùy chỉnh ví dụ này để phù hợp với nhu cầu của bạn. Một sự nâng cao cần thiết là cho phép một trình quản lý nội dung bên trong thân của định dạng tài liệu lấy mẫu điền nội dung từ tài liệu đã được định nghĩa được lưu trữ trong SharePoint. Bạn có thể viết đoạn mã để bạn có thể đặt tên của tài liệu bao gồm mẫu văn bản để điền như là văn bản trong trình quản lý nội dung.
Cũng như vậy, ví dụ này mã hóa “cứng” tên của các TemplateReport và các thư viện tài liệu các Report. Bạn có thể xóa ràng buộc này bằng cách định nghĩa thông tin này trong một danh sách SharePoint. Đoạn mã sau đó sẽ biết về tên của duy nhất danh sách điều chỉnh này. Các tên của các TemplateReport và các thư viện tài liệu các Report sẽ được điều khiển bằng dữ liệu từ danh sách điều chỉnh này.
SharePoint là một công nghệ mạnh mẽ làm công việc trở nên dễ dàng cho những người trong các tổ chức để cộng tác. Open XML là một công nghệ nổi lên mạnh mẽ đang thay đổi cách chúng ta tạo ra các tài liệu. Sử dụng 2 công nghệ này với nhau, bạn sẽ có khả năng tạo ra các ứng dụng để con người có thể sử dụng các tài liệu để công tác bằng những cách mới.
-------------------------------------------------------------------------------------------------------------------------------------------------------
Eric White là tác giả của việc chuyên môn hóa trong các định dạng file Office Open XML tại Microsoft. Trước khi gia nhập Microsoft vào năm 2005, ông đã làm việc như một nhả phát triển nhiều năm và sau đó bắt đầu làm việc tại PowerVista Software, một công ty đã phát triển và đã bán một thiết bị mạng lới nền tảng lai. Ông đã viết nhiều cuốn sách về quản lý tùy chỉnh và sự phát triển GDI+. Đọc blog của ông tại blogs.msdn.com/ericwhite
-------------------------------------------------------------------------------------------------------
Thông tin người dịch:
Họ và tên: TrầnNguyễn Đức Huy.
Nghề nghiệp: Sinh viên khoa CNTT trường ĐHKHTN TpHCM.
Email: zutafe@yahoo.com
Link bài báo gốc: http://msdn.microsoft.com/en-us/magazine/ee532473.aspx.