2011-11-23 35 views
5

Tôi cần so sánh hai tài liệu văn phòng, trong trường hợp này là hai tài liệu văn bản và cung cấp sự khác biệt, tương tự như những gì được trình bày trong SVN. Không đến mức đó, nhưng ít nhất có thể làm nổi bật sự khác biệt.lập trình so sánh các tài liệu từ

tôi đã cố gắng sử dụng dll văn phòng COM và nhận này xa ..

object fileToOpen = (object)@"D:\doc1.docx"; 
string fileToCompare = @"D:\doc2.docx"; 

WRD.Application WA = new WRD.Application(); 

Document wordDoc = null; 

wordDoc = WA.Documents.Open(ref fileToOpen, Type.Missing, Type.Missing, Type.Missing, Type.Missing,  Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); 
wordDoc.Compare(fileToCompare, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); 

Bất kỳ lời khuyên về cách thức tiến hành hơn nữa? Đây sẽ là một ứng dụng web có nhiều lượt truy cập. Đang sử dụng đối tượng com văn phòng đúng cách để đi hay có bất kỳ thứ gì khác mà tôi có thể xem không?

+0

Chỉ cần quan tâm, làm thế nào SVN hiển thị sự khác biệt giữa hai tệp nhị phân? (AFAIK 'docx' là định dạng lưu trữ zip) – sll

+0

chọn hai tệp được đề cập, thường là trên cùng một thư mục ở phía máy khách. Bạn đã cài đặt TortoiseSVN. Bạn nhấp chuột phải và đi đến trình đơn TortoiseSVN và chọn Diff ... – user20358

+0

Vâng, tôi biết cách làm điều đó nhưng sự khác biệt nào bạn sẽ thấy, nó có ý nghĩa gì không? – sll

Trả lời

1

Tôi đồng ý với Joseph về việc phân biệt chuỗi. Tôi cũng khuyên bạn nên sử dụng một công cụ tìm khác biệt được xây dựng có mục đích (một số được tìm thấy ở đây: Any decent text diff/merge engine for .NET?) có thể giúp bạn tránh được một số cạm bẫy bình thường trong việc phân biệt.

0

Bạn thực sự cần trích xuất tài liệu thành chuỗi và phân biệt điều đó.

Bạn chỉ quan tâm đến các thay đổi văn bản chứ không phải định dạng đúng?

+1

mọi thứ, ngay cả khi hình ảnh khác. Nhưng tôi sẽ cố gắng và thư giãn yêu cầu đó. – user20358

3

Bạn nên sử dụng lớp Tài liệu để so sánh tệp và mở trong tài liệu Word kết quả.

using OfficeWord = Microsoft.Office.Interop.Word; 

object fileToOpen = (object)@"D:\doc1.docx"; 
string fileToCompare = @"D:\doc2.docx"; 

var app = Global.OfficeFile.WordApp; 

object readOnly = false; 
object AddToRecent = false; 
object Visible = false; 

OfficeWord.Document docZero = app.Documents.Open(fileToOpen, ref missing, ref readOnly, ref AddToRecent, Visible: ref Visible); 

docZero.Final = false; 
docZero.TrackRevisions = true; 
docZero.ShowRevisions = true; 
docZero.PrintRevisions = true; 

//the OfficeWord.WdCompareTargetNew defines a new file, you can change this valid value to change how word will open the document 
docZero.Compare(fileToCompare, missing, OfficeWord.WdCompareTarget.wdCompareTargetNew, true, false, false, false, false); 
+1

Xin chào @ anderson-rissardi! Phương thức So sánh thực sự làm gì? Nó mở một số tập tin ở đâu đó? Bởi vì tôi không nhìn thấy bất cứ điều gì khi tôi chạy điều này trong bài kiểm tra đơn vị của tôi. Làm thế nào tôi có thể nhận được kết quả kể từ khi phương thức trả về void? – ditoslav

+1

Hi @ditoslav. Nó sẽ mở một tập tin mới. Đó là nút 'Copare' bên trong Word. Mở MS Word -> Tab 'Xem lại' -> Nút 'So sánh'. Có cùng chức năng, một tài liệu mới được tạo ra hay không. Bạn phải lưu một tài liệu mới này. –

0

Để làm một so sánh giữa các tài liệu Word, bạn cần

  1. Một thư viện để thao tác tài liệu Word, ví dụ đọc đoạn văn, văn bản, bảng vv từ tệp Word. Bạn có thể thử Office Interop, OpenXML hoặc Aspose.Words for .NET.
  2. Thuật toán/thư viện để so sánh thực tế, trên văn bản được truy xuất từ ​​cả hai tài liệu Word. Bạn có thể tự viết hoặc sử dụng thư viện như DiffMatchPatch hoặc tương tự.

Câu hỏi này cũ, hiện có thêm nhiều giải pháp như GroupDocs Compare khả dụng.

Document Comparison by Aspose.Words for .NET là dự án giới thiệu mã nguồn mở sử dụng Aspose.Words và DiffMatchPatch để so sánh.

Tôi làm việc tại Aspose với tư cách là nhà truyền giáo nhà phát triển.

1

Vì vậy, yêu cầu của tôi là tôi phải sử dụng lib .Net và tôi muốn tránh làm việc trên các tệp thực sự nhưng hoạt động với luồng.

ZipArchive là trong System.IO.Compressed

Những gì tôi đã làm và nó làm việc ra khá độc đáo được sử dụng ZipArchive từ Net và so sánh nội dung trong khi bỏ qua các tập tin .rels vì có vẻ như nó được tạo ra một cách ngẫu nhiên trên mỗi tạo tập tin. Dưới đây là đoạn mã của tôi:

private static bool AreWordFilesSame(byte[] wordA, byte[] wordB) 
    { 
     using (var streamA = new MemoryStream(wordA)) 
     using (var streamB = new MemoryStream(wordB)) 
     using (var zipA = new ZipArchive(streamA)) 
     using (var zipB = new ZipArchive(streamB)) 
     { 
      streamA.Seek(0, SeekOrigin.Begin); 
      streamB.Seek(0, SeekOrigin.Begin); 

      for(int i = 0; i < zipA.Entries.Count; ++i) 
      { 
       Assert.AreEqual(zipA.Entries[i].Name, zipB.Entries[i].Name); 

       if (zipA.Entries[i].Name.EndsWith(".rels")) //These are some weird word files with autogenerated hashes 
       { 
        continue; 
       } 

       var streamFromA = zipA.Entries[i].Open(); 
       var streamFromB = zipB.Entries[i].Open(); 

       using (var readerA = new StreamReader(streamFromA)) 
       using (var readerB = new StreamReader(streamFromB)) 
       { 
        var bytesA = readerA.ReadToEnd(); 
        var bytesB = readerB.ReadToEnd(); 
        if (bytesA != bytesB || bytesA.Length == 0) 
        { 
         return false; 
        } 
       } 
      } 

      return true; 
     } 
    } 
0

Đối với một giải pháp trên một máy chủ, hoặc chạy mà không cần cài đặt Word và sử dụng các công cụ COM, bạn có thể sử dụng thành phần WmlComparer của XmlPowerTools.

Các documentation là một chút hạn chế, nhưng đây là một cách sử dụng ví dụ:

var expected = File.ReadAllBytes(@"c:\expected.docx"); 
var actual = File.ReadAllBytes(@"c:\result.docx"); 
var expectedresult = new WmlDocument("expected.docx", expected); 
var actualDocument = new WmlDocument("result.docx", actual); 
var comparisonSettings = new WmlComparerSettings(); 

var comparisonResults = WmlComparer.Compare(expectedresult, actualDocument, comparisonSettings); 
var revisions = WmlComparer.GetRevisions(comparisonResults, comparisonSettings); 

mà sẽ cho bạn thấy sự khác nhau giữa hai tài liệu.

Các vấn đề liên quan