2009-05-14 9 views
11

मैं कुछ कोड के लिए एक जुनीट परीक्षण लिख रहा हूं जो एक्सेल फ़ाइल (जो बाइनरी है) उत्पन्न करता है। मेरे पास एक और एक्सेल फ़ाइल है जिसमें मेरा अपेक्षित आउटपुट शामिल है। अपेक्षित फ़ाइल में वास्तविक फ़ाइल की तुलना करने का सबसे आसान तरीका क्या है?जावा में दो एक्सेल फ़ाइलों की तुलना करने का सबसे आसान तरीका?

निश्चित रूप से मैं स्वयं कोड लिख सकता हूं, लेकिन मैं सोच रहा था कि एक विश्वसनीय तृतीय-पक्ष लाइब्रेरी (उदा। स्प्रिंग या अपाचे कॉमन्स) में कोई मौजूदा विधि है जो पहले से ही ऐसा करती है।

उत्तर

8

यहाँ है कि मैं क्या (बड़े कार्य करने के साथ DBUnit द्वारा किया जा रहा) कर समाप्त हो गया है :

/** 
* Compares the data in the two Excel files represented by the given input 
* streams, closing them on completion 
* 
* @param expected can't be <code>null</code> 
* @param actual can't be <code>null</code> 
* @throws Exception 
*/ 
private void compareExcelFiles(InputStream expected, InputStream actual) 
    throws Exception 
{ 
    try { 
    Assertion.assertEquals(new XlsDataSet(expected), new XlsDataSet(actual)); 
    } 
    finally { 
    IOUtils.closeQuietly(expected); 
    IOUtils.closeQuietly(actual); 
    } 
} 

यह किसी भी अप्रासंगिक मेटाडाटा कि अलग हो सकता है से मिथ्या नकारात्मक का कोई खतरा नहीं के साथ दो फ़ाइलों में डेटा की तुलना,। उम्मीद है कि यह किसी की मदद करता है।

+0

डीबीयूनीट से XlsDataSet का उपयोग करके हे वास्तव में चालाक विचार है; उस बारे में नहीं सोचा था :-)। – sleske

+0

नवीनतम डीबीयूनीट संस्करण 2.5 .xlsx फ़ाइल के साथ काम नहीं करता है, केवल .xls फ़ाइलों के साथ। क्या आपको कोई विचार है कि इसे ".xlsx" फ़ाइलों के लिए कैसे काम करना है? – Romain

+0

कोई विचार नहीं, जब तक आपके पास .xlsx फ़ाइलों को .xls प्रारूप में निर्यात करने का विकल्प न हो। –

-1

शायद ... प्रत्येक फ़ाइल के MD5 digests की तुलना करें? मुझे यकीन है कि ऐसा करने के कई तरीके हैं। आप बस दोनों फाइलें खोल सकते हैं और प्रत्येक बाइट की तुलना कर सकते हैं।

संपादित करें: जेम्स ने बताया कि एक्सएलएस प्रारूप में मेटाडेटा में अंतर कैसे हो सकता है। शायद आपको उसी इंटरफ़ेस का उपयोग करना चाहिए जिसका उपयोग आप xls फ़ाइलों को खोलने के लिए करते हैं और सेल से सेल के मानों की तुलना करते हैं?

+2

यह एक अच्छा विचार है, सिवाय इसके कि आप (विचार करने के लिए करता है, तो फ़ाइलों समान होगा की क्या ज़रूरत है यानी इस तरह के XLSX प्रारूप में किसी भी रूप में मेटाडाटा शामिल है, उदाहरण के लिए नहीं है कि। यह अलग मेटाडाटा, जाहिर है, विभिन्न हैंश का उत्पादन करेगा)। –

2

आप यह जांचने के लिए javaxdelta का उपयोग कर सकते हैं कि दोनों फाइलें समान हैं या नहीं। यह यहाँ से उपलब्ध है:

http://javaxdelta.sourceforge.net/

+0

मुझे अंततः "ट्रोव" लाइब्रेरी पर निर्भरता के साथ मिलकर काम करने के बाद जावैक्सडेल्टा मिल गया, लेकिन हालांकि यह विज्ञापित के रूप में काम करता है, लेकिन स्लेस्के सही है कि मुझे एक कैंटोनिकल तुलना की आवश्यकता है, बाइट-बाय-बाइट तुलना नहीं। सुझाव के लिए वैसे भी धन्यवाद, जिसे मैंने वोट दिया है। –

0

बस पाया वहाँ कॉमन्स-कब की FileUtils में कुछ बाहर। अन्य उत्तरों के लिए धन्यवाद।

+1

यह वास्तव में मेरी समस्या का समाधान नहीं करता है, क्योंकि ऐसा लगता है कि एक्सेल फ़ाइलों के बीच मतभेद हैं जो जीनियून सामग्री अंतर के कारण नहीं हैं। मैं फाइलों की सामग्री को पार्स करने और एक कैनोलिक तुलना करने के लिए स्लेस्के के सुझाव का प्रयास करूंगा। –

6

कुछ सरल फ़ाइल तुलना आसानी से कुछ चेकसमिंग (जैसे एमडी 5) या दोनों फाइलों को पढ़ने के द्वारा किया जा सकता है।

हालांकि, एक्सेल फ़ाइलों में मेटाडेटा के भार होते हैं, इसलिए फाइलें शायद बाइट-फॉर-बाइट के समान नहीं होंगी, क्योंकि जेम्स बर्गेस ने बताया। तो आपको अपने परीक्षण के लिए एक और प्रकार की तुलना की आवश्यकता होगी।

मैं किसी भी तरह से Excel फ़ाइल से "कैनोलिक" फ़ॉर्म उत्पन्न करने की अनुशंसा करता हूं, यानी जेनरेट की गई एक्सेल फ़ाइल को पढ़ना और इसे एक सरल प्रारूप (सीएसवी या कुछ समान) में परिवर्तित करना, जो केवल उस जानकारी को बनाए रखेगा जिसे आप जांचना चाहते हैं । फिर आप अपने अपेक्षित परिणाम (निश्चित रूप से कैनोलिक रूप में भी) के साथ तुलना करने के लिए "कैनोलिक फॉर्म" का उपयोग कर सकते हैं।

Apache POI फ़ाइल पढ़ने के लिए उपयोगी हो सकता है।

बीटीडब्ल्यू: इसकी सही जांच करने के लिए पूरी फाइल पढ़ना आम तौर पर एक यूनिट परीक्षण नहीं होगा। यही कारण है कि एकीकरण के परीक्षण है ...

+0

आप सही हैं, मैं यूनिट परीक्षण शब्द का उपयोग कर रहा था; वास्तव में यह जुनीट द्वारा संचालित एकीकरण परीक्षण है। मैं अब ठीक कर दूंगा। –

+0

मुझे सही रास्ते पर रखने के लिए धन्यवाद; नीचे दिए गए मेरे डीबीयूनीट समाधान (या ऊपर, वोटों के आधार पर देखें!) –

+0

.xlsx फ़ाइलों के लिए: MD5 sums निश्चित रूप से अलग होंगे, लेकिन दोनों .xlsx फ़ाइलों को अनजिप करने के परिणामस्वरूप निर्देशिका समान होनी चाहिए (यह प्राप्त करने का एक बेहतर तरीका होगा कैनोनिक रूप) – golimar

0

कृपया, बाइनरी फ़ाइलें तुलना करने के लिए the site पर एक नज़र डालें, http://www.velocityreviews.com/forums/t123770-re-java-code-for-determining-binary-file-equality.html

टाइगर

+0

दो मुद्दे: वह कोड सिर्फ बाइट-फॉर-बाइट तुलना कर रहा है, जो स्लेस्के पॉइंट आउट के रूप में है, टी आदर्श जहां एक्सेल का संबंध है। साथ ही, मैं किसी तृतीय-पक्ष उपयोगिता विधि के बाद था, कुछ फ़ोरम पर कोड का एक ब्लॉक नहीं जो काम कर सकता है या नहीं। मैं इसे स्पष्ट करने के लिए प्रश्न अपडेट करूंगा। –

0

आप Excel फ़ाइलों की तुलना करने के Beyond Compare 3 जो कमांड लाइन से शुरू किया जा सकता है और अलग अलग तरीकों का समर्थन करता है का उपयोग कर सकते जिसमें शामिल है:

  • डेटाबेस तालिकाओं के रूप में एक्सेल शीट की तुलना
  • सभी शाब्दिक सामग्री जाँच हो रही है
  • जाँच
+0

कमांड लाइन उपकरण जावा से आने के लिए बदसूरत हैं (मेरे मामले में, जुनीट)। –

8

जो आप मेरे प्रोजेक्ट simple-excel का उपयोग करने पर विचार कर सकते हैं जो हैम का एक गुच्छा प्रदान करता है क्रेस्ट Matchhers नौकरी करने के लिए।

जब आप निम्नलिखित की तरह कुछ करते हैं,

assertThat(actual, WorkbookMatcher.sameWorkbook(expected)); 

आप देखना चाहते हैं, उदाहरण के लिए,

java.lang.AssertionError: 
Expected: entire workbook to be equal 
    but: cell at "C14" contained <"bananas"> expected <nothing>, 
      cell at "C15" contained <"1,850,000 EUR"> expected <"1,850,000.00 EUR">, 
      cell at "D16" contained <nothing> expected <"Tue Sep 04 06:30:00"> 
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20) 

इस तरह, आप इसे अपने automatted परीक्षण से चलाने के लिए और जबकि सार्थक प्रतिक्रिया प्राप्त कर सकते हैं आप विकास कर रहे हैं

आपको कम से this article on my site

+0

यदि आप इस परियोजना के डेवलपर हैं, तो आपको शायद उस प्रभाव में अस्वीकरण जोड़ना चाहिए। –

+0

यह सुनिश्चित नहीं है कि यह क्यों महत्वपूर्ण है, इसकी एक ओएसएस परियोजना ... – Toby

+0

क्योंकि अच्छे फॉर्म होने के अलावा, यह इस साइट का नियम है, http://stackoverflow.com/faq#promotion देखें। –

4

मैं इसी तरह कुछ करने के लिए की जरूरत है इसके बारे में अधिक पढ़ सकते हैं और पहले से ही Excel फ़ाइलों को बनाने के लिए अपने प्रोजेक्ट में Apache POI library उपयोग कर रहा था। तो मैंने पाठ की स्ट्रिंग के रूप में दोनों कार्यपुस्तिकाओं को निर्यात करने के लिए शामिल ExcelExtractor इंटरफ़ेस का उपयोग करने का विकल्प चुना और जोर दिया कि तार बराबर थे। HSSF for .xls दोनों के साथ-साथ XSSF for .xlsx दोनों के लिए कार्यान्वयन हैं। स्ट्रिंग के लिए

डंप:

XSSFWorkbook xssfWorkbookA = ...; 
String workbookA = new XSSFExcelExtractor(xssfWorkbookA).getText(); 

ExcelExtractor क्या सभी स्ट्रिंग डंप में शामिल किया जाना चाहिए के लिए कुछ विकल्प हैं। मैंने पाया कि शीट नामों के उपयोगी डिफॉल्ट हैं। इसके अलावा इसमें कोशिकाओं की टेक्स्ट सामग्री भी शामिल है।

2

मुझे लगता है कि सबसे आसान तरीका Tika का उपयोग करना है। मैं इस तरह इसका इस्तेमाल:

private void compareXlsx(File expected, File result) throws IOException, TikaException { 
    Tika tika = new Tika(); 
    String expectedText = tika.parseToString(expected); 
    String resultText = tika.parseToString(result); 
    assertEquals(expectedText, resultText); 
} 


<dependency> 
    <groupId>org.apache.tika</groupId> 
    <artifactId>tika-parsers</artifactId> 
    <version>1.13</version> 
    <scope>test</scope> 
</dependency> 
+0

अच्छा लगता है, मैं शायद अगली बार इसका इस्तेमाल करेंगे! –

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