25/10/2016

Open XML SDK - Xử Lý Tài Liệu Microsoft Office


Trong các dự án phần mềm, cụ thể là .NET, đôi lúc ta cần thao tác với các văn bản của Microsoft Office như yêu cầu của khách hàng cho chúng ta là trích xuất dữ liệu sang file dạng Microsoft Office Excel, hoặc tạo ra hóa đơn để in dạng Microsoft Office Word, điều đó không thể bỏ qua nếu chúng ta muốn phần mềm tốt hơn và quan trọng nhất là sự hài lòng của khách hàng.
Lưu ý: nó chỉ áp dụng cho các định dạng được sinh ra từ phiên bản Office 2007 trở lên như .docx, .xlsx, .pptx

Tiền đề bài viết

Với nhu cầu thay đổi và cập nhật thêm nhiều lợi ích cho bạn đọc, lẫn sử dụng cho mục đích cá nhân do một số bạn gửi tư liệu cho STDIO nhưng không chiết xuất ảnh sẵn mà ảnh chỉ có trong văn bản, tôi có tìm hiểu về Open XML SDK và làm các ứng dụng cho nội bộ STDIO sử dụng.

Đối tượng hướng đến

Các nhà phát triển phần mềm .NET đang tìm hiểu giải pháp xử lý các văn bản của Microsoft Office.

Open XML SDK

Open XML SDK là bộ SDK dùng cho việc thao tác xử lý trên các văn bản của Microsoft Office dành cho .NET, tại thời điểm hiện tại ta có Microsoft Office 2013 và phiên bản phù hợp với Microsoft Office 2013 lúc này là Open XML SDK 2.5 nên tôi sẽ chủ yếu viết về phiên bản này, trong tương lai, việc thay đổi và nâng cấp của Microsoft Office có thể kéo theo sự nâng cấp của Open XML SDK nên các bạn cần lưu ý và chủ động về vấn đề này.
Open XML SDK không có sẵn trong bộ cài đặt của Visual Studio dành cho .NET, do đó, ta cần chủ động download và cài đặt riêng.

Download

Open XML SDK 2.5: http://www.microsoft.com/en-us/download/details.aspx?id=30425 - 27/7/2015
Hiện tại có 2 bản là OpenXMLSDKV25.msi và OpenXMLSDKToolV25.msi, do không có nhu cầu sử dụng OpenXMLSDKToolV25.msi nên tôi chỉ download SDK cho việc lập trình OpenXMLSDKV25.msi. Nếu bạn có nhu cầu thì có thể download SDK Tool thêm sau.

Cài đặt và môi trường

Cài đặt Open XML SDK 2.5 (OpenXMLSDKV25.msi) sau khi download xong ở bước trên (có yêu cầu .NET Framework 4.0).
Như vậy ta đã cài đặt xong OpenXMLSDKV25.msi để có thể sử dụng .NET thao tác với các văn bản của Office.

Ví dụ trích xuất ảnh từ trong văn bản word

Tạo project

Tạo project dạng Visual C# > Windows Forms Application đặt tên là StdioOffice2Pics với mục đích trích xuất toàn bộ ảnh từ văn bản word.

Tạo giao diện tương tác đơn giản

Tạo form như hình bên dưới bao gồm 1 Button Browse để tìm văn bản word có chứa văn bản word cần xử lý. Button Extract sẽ trích xuất toàn bộ ảnh từ văn bản word và sau đó sẽ lưu các ảnh này tại thư mục chứa văn bản word.
ss_1

Tích hợp Open XML SDK 2.5 vào project

Click phải vào References của Project như hình dưới và chọn Add Reference... để mở ra cửa sổ Reference Manager - StdioOffice2Pics.
Lưu ý: nếu bạn chưa biết về Add Reference... bạn có thể đọc tham khảo bài viết sau Add Reference Trong C# (Visual Stdio) :: www.stdio.vn/articles/read/315/add-reference-trong-c-visual-stdio và mục đích của việc làm này là nhằm đưa 1 số thư viện cần thiết vào project.
Ta lưu ý là ta cần 2 thư viện sau: WindowsBaseDocumentFormat.OpenXml.
ss_2

Add WindowsBase

Assemblies > WindowsBase (chọn check vào WindowsBase)
ss_3

Add DocumentFormat.OpenXml

Nhấn tiếp vào nút Browse... và tìm đến thư mục cài đặt Open XML SDK, nếu không có gì thay đổi thì đường dẫn đó thường là: C:\Program Files (x86)\Open XML SDK\V2.5\lib và bạn chọn DocumentFormat.OpenXml.dll tại thư mục đó và nhấn Add.
ss_4
Nhấn OK để đóng cửa sổ Reference Manager - StdioOffice2Pics

Codes

Thêm namespace sau vào các form muốn sử dụng OpenXML
using DocumentFormat.OpenXml.Packaging;
Giả sử ta có đường dẫn đến file .docx cần xử lý là m_filePath, ta có đoạn code trích xuất tất cả ảnh trong file đó như sau
  1. using (WordprocessingDocument document = WordprocessingDocument.Open(m_filePath, true))
  2. {
  3. var enumerator = document.MainDocumentPart.ImageParts.GetEnumerator();
  4. int indexPic = 0;
  5.  
  6. while (enumerator.MoveNext())
  7. {
  8. ImagePart imagePart = enumerator.Current;
  9. Stream stream = imagePart.GetStream();
  10. long length = stream.Length;
  11. byte[] byteStream = new byte[length];
  12. stream.Read(byteStream, 0, (int)length);
  13.  
  14. FileStream fstream = new FileStream(Path.GetDirectoryName(m_filePath) + "\\" + ++indexPic + ".png", FileMode.OpenOrCreate);
  15. fstream.Write(byteStream, 0, (int)length);
  16. fstream.Close();
  17. }
  18. }

Cách sử dụng StdioOffice2Pics

Chạy thử phần mềm và làm theo thao tác:
  • Browse một file word có chứa hình ảnh.
  • Nhấn Extract để phần mềm trích xuất ảnh.
ss_5
Kết quả là hình ảnh được trích xuất như bên dưới từ trong file word.
ss_6

Download project mẫu hoàn chỉnh

Project được xây dựng trên Windows 8.1, Visual Studio 2013 - .NET Framework 4.5, bạn phải cài đặt Open XML SDK 2.5 và Add Reference DocumentFormat.OpenXml.dll lại nếu cần thiết.
Trong thư mục StdioOffice2Pics\StdioOffice2Pics\bin chứa phần mềm StdioOffice2Pic.exe và STDIOSampleData.docx giúp bạn có thể trải nghiệm thử tính năng của nó.
DOWNLOAD StdioOffice2Pics.zip

Tham khảo thêm

https://msdn.microsoft.com/en-us/library/office/bb448854.aspx - 27/7/2015

No comments:

Post a Comment