2011-11-23 15 views
5

मैं इस मामले में दो शब्द दस्तावेजों में दो कार्यालय दस्तावेजों तुलना करने के लिए, और प्रदान एक फर्क है, जो कुछ हद तक SVN में शो क्या है के समान है की जरूरत है। उस सीमा तक नहीं, लेकिन कम से कम मतभेदों को उजागर करने में सक्षम हो।प्रोग्राम के रूप में की तुलना शब्द दस्तावेजों

मैं कार्यालय COM dll उपयोग करने की कोशिश करते हैं और इस दूर हो गया ..

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); 

कैसे आगे बढ़ने के लिए पर कोई सुझाव दिए गए? यह एक बहुत अच्छा हिट वाला एक वेब एप्लीकेशन होगा। कार्यालय कॉम ऑब्जेक्ट का उपयोग करने का सही तरीका है, या क्या कोई अन्य चीजें हैं जिन्हें मैं देख सकता हूं?

+0

बस ब्याज की बात है, कैसे एसवीएन दो द्विआधारी फाइलों के बीच दुविधा दिखाती है? (AFAIK 'docx' एक ज़िप संग्रह प्रारूप है) – sll

+0

प्रश्न में दो फ़ाइलों का चयन करें, आमतौर पर क्लाइंट पक्ष में एक ही फ़ोल्डर पर। आपके पास कछुआ एसवीएन स्थापित है। आप राइट क्लिक करें और TortoiseSVN मेनू पर जाएं और डिफ चुनें ... – user20358

+0

हाँ मुझे पता है कि यह कैसे करें लेकिन आप किस अंतर को देखेंगे, क्या इसका कोई अर्थ है? – sll

उत्तर

1

मैं डब्ल्यू/जोसेफ स्ट्रिंग को अलग करने के बारे में सहमत हूं। मैं एक उद्देश्य-निर्मित diffing इंजन की भी सिफारिश करता हूं (कई यहां पाए गए: Any decent text diff/merge engine for .NET?) जो आपको अलग-अलग सामान्य नुकसान से बचने में मदद कर सकता है।

0

आप वास्तव में एक स्ट्रिंग में डॉक निकालने की जानी चाहिए और कि diff'ing।

आप केवल शाब्दिक परिवर्तन और नहीं के बारे में परवाह सही स्वरूपण?

+1

सब कुछ, भले ही छवि अलग है। लेकिन मैं उस आवश्यकता को आजमाकर आराम करने जा रहा हूं। – user20358

3

आप एक वर्ड दस्तावेज़ में फ़ाइलों और खुले तुलना करने के लिए परिणाम दस्तावेज़ वर्ग का उपयोग करना चाहिए।

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

हाय @ एंडरसन-रिसार्डी! वास्तव में तुलना विधि क्या करता है? क्या यह कहीं कुछ फाइल खोलता है? क्योंकि जब मैं इसे अपने यूनिट परीक्षण में चलाता हूं तो मैं कुछ भी नहीं देख रहा हूं। विधि समाप्त होने के बाद मुझे परिणाम कैसे प्राप्त करना चाहिए? – ditoslav

+1

हाय @ डिटोस्लाव। यह एक नई फाइल खुलता है। यह शब्द के अंदर 'कॉपर' बटन है। एमएस वर्ड खोलें -> टैब 'समीक्षा' -> बटन 'तुलना करें'। वही कार्यक्षमता है, यह एक नया दस्तावेज़ उत्पन्न होता है। आपको इस नए दस्तावेज़ की बचत करना होगा। –

0

Word दस्तावेज़ों के बीच तुलना करने के लिए, आप

  1. एक पुस्तकालय की जरूरत वर्ड दस्तावेज़, उदा हेरफेर करने के लिए वर्ड फ़ाइल से पैराग्राफ, टेक्स्ट, टेबल इत्यादि पढ़ें। आप Office Interop, OpenXML या Aspose.Words for .NET आज़मा सकते हैं।
  2. वर्ड दस्तावेज़ों से प्राप्त पाठ पर वास्तविक तुलना करने के लिए एक एल्गोरिदम/लाइब्रेरी। आप अपना खुद का लिख ​​सकते हैं या DiffMatchPatch या इसी तरह की लाइब्रेरी का उपयोग कर सकते हैं।

यह प्रश्न पुराना है, अब GroupDocs Compare जैसे अधिक समाधान उपलब्ध हैं।

Document Comparison by Aspose.Words for .NET एक खुला स्रोत शोकेस परियोजना की तुलना के लिए Aspose.Words और DiffMatchPatch उपयोग करता है।

मैं एक डेवलपर प्रचारक के रूप में Aspose पर काम करता हूं।

1

तो मेरी आवश्यकताएं थीं कि मैं एक नेट lib का इस्तेमाल किया था और मैं वास्तविक फ़ाइलें पर काम कर रहा से बचने लेकिन धाराओं के साथ काम करना चाहता था।

ZipArchive मैं क्या किया था और यह काफी अच्छी तरह हुआ भी नेट से ZipArchive उपयोग कर रहा था और सामग्री की तुलना .rels फ़ाइल लंघन जबकि क्योंकि ऐसा लगता है यह बेतरतीब ढंग से उत्पन्न होता है पर System.IO.Compressed

में है प्रत्येक फ़ाइल निर्माण। यहाँ मेरी टुकड़ा है:

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

एक सर्वर पर एक समाधान के लिए, या वर्ड के स्थापना के बिना चल रहा है और COM उपकरण का उपयोग कर, आप XmlPowerTools की WmlComparer घटक इस्तेमाल कर सकते हैं।

documentation थोड़ा सीमित है, लेकिन यहां एक उदाहरण उपयोग है:

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); 

जो आप दो दस्तावेज़ों के बीच मतभेदों को दिखा देंगे।

संबंधित मुद्दे