2015-10-12 3 views
14

मैं एक आवेदन जहां OpenXML का उपयोग कर Excel फ़ाइल के लिए कुछ डेटा निर्यात कर सकते हैं विकासशील हूँ छँटाई। ऑटोफिल्टर को छोड़कर सब कुछ ठीक काम कर रहा है। विचार तो यह है कि उपयोगकर्ता स्वचालित रूप से नियंत्रण डेटा फ़िल्टर और क्रमित करने के लिए किया गया है डेटा के मुख्य शरीर के लिए एक स्वत: फ़िल्टर जोड़ना है। कोड में तो, मैं कुछ इस तरह करते हैं:स्वत: फ़िल्टर जोड़ना और कारणों एक्सेल दुर्घटना

var filter = new AutoFilter() { Reference = string.Format("{0}:{1}", topLeftCellReference, bottomRightCellReference) }; 
worksheet.AppendChild(filter); 

निर्यात XLSX में यह कुछ इस तरह दिखाई देता है:

<x:autoFilter ref="A4:L33" xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main" /> 

और यह sheetData और mergeCells के बीच कार्यपत्रक को जोड़ा गया है।

मैं तो Excel में इस फिल्टर को खोल सकते हैं और यह ठीक काम करता है। उम्मीद करें कि क्या आप कॉलम को सॉर्ट करने का प्रयास करते हैं, कॉलम प्रकार और फिर Excel क्रैश हो जाता है। फ़ाइल को सहेजना और पुनः लोड करना (जो एक्सेल को सबकुछ साफ करने के लिए मजबूर करता है) समस्या को ठीक नहीं करता है। लेकिन, यदि आप (जैसे कि > 10 के लिए एक स्तंभ पर फ़िल्टर एक फिल्टर पहले लागू होते हैं, तो उस फ़िल्टर निकालने के लिए, अब आप तरह दुर्घटनाग्रस्त बिना। मैं एक फ़ाइल एक फ़िल्टर लागू करने और इसे हटाने के बाद बचाया जा सकता है और अब उस फ़ाइल ठीक है, लेकिन पर देख रहे हैं "मरम्मत" फ़ाइल के एक्सएमएल, मैं किसी भी स्पष्ट अंतर नहीं दिख रहा।

किसी को भी किसी भी विचार है कि समस्या क्या कारण हो सकता है? ऐसा कुछ हो रहा है जब एक ऑटो फिल्टर बस के अलावा अन्य लागू करने के क्या करना चाहिए कर रहा हूँ है कार्यपत्रक में जोड़ने

नोट: हम Excel 2010 का उपयोग कर रहे (संस्करण 14.0.7153.5000)

यहाँ एक उदाहरण file है (डाउनलोड क्लिक करें और इसे के रूप में एक ०१२३२५४४४१४ डाउनलोड करेंगे। Excel में खोलने के लिए .xlsx पर पुनर्नामित करें। संपादन सक्षम करें, कॉलम में से एक का चयन करें और सॉर्ट करने का प्रयास करें)।

संपादित: इस में कुछ और के साथ प्रयोग करना। यदि आप Excel में फ़ाइल को सहेजते हैं, तो यह अभी भी टूटा हुआ है। हालांकि, अगर आप पहले फ़िल्टर लागू करते हैं (और उसके बाद इसे साफ़ करते हैं) और फिर Excel में पुन: सहेजते हैं, तो आपको एक कार्यशील फ़ाइल मिलती है। दो फ़ाइलों (अभी भी टूट resaved फ़ाइल और अब काम कर रहा फ़ाइल) पर करीब देखते हुए, मैं नोटिस कि यह अतिरिक्त बिट कार्यपुस्तिका को जोड़ा गया के बाद फिल्टर लागू किया गया था (और मंजूरी दे दी):

<x:definedNames> 
    <x:definedName name="_xlnm._FilterDatabase" localSheetId="0" hidden="1">'Sheet 1'!$A$1:$E$11</x:definedName> 
    </x:definedNames> 

सुनिश्चित नहीं हैं कि कुछ या नहीं हो सकता है ...

+0

@ मेसन: ओपनएक्सएमएल आपको हर समय अवैध एक्सेल फाइलें बनाने देता है। चूंकि मान्य एक्सेलएक्स फ़ाइल के नियमों के मुकाबले वैध एक्सेल फ़ाइल के नियम कठोर (और पूरी तरह से अनियंत्रित) हैं (उदाहरण के लिए, मानक में कुछ भी 'वर्कशीट' के तहत बच्चों के आदेश को निर्देशित नहीं करता है, लेकिन एक्सेल बहुत ही चिंतित है कि कुछ बच्चे दिखाना चाहिए)। आमतौर पर एक्सेल शिकायत करता है (एक बहुत ही अनुपयोगी त्रुटि संदेश के साथ) जब आप पहली बार फ़ाइल खोलते हैं। लेकिन यह फ़ाइल ठीक खुलती है और यदि आप कॉलम को सॉर्ट करने का प्रयास करते हैं तो समस्या केवल पॉप अप होती है। –

+0

ऑर्डर प्रलेखन के लिए आपके तत्वों का क्रम सही दिखता है (मेरे [ऑटोफिल्टर उत्तर यहां देखें] (http://stackoverflow.com/a/25410242/3791802)। उत्पादकता उपकरण द्वारा रिपोर्ट किया गया एकमात्र मुद्दा 'फ़ॉन्ट' पर' रंग' तत्वों में से एक है गलत है - मेरे पास [दूसरा उत्तर] है (http://stackoverflow.com/questions/29989234/change-sheet-tab-color -of-excel-file-use-open-xml/29991215 # 29991215) जिसमें 'रंग' की जानकारी है लेकिन मुझे संदेह है कि इससे इस समस्या में मदद मिलेगी। मैं एक नज़र डालेगा और देख सकता हूं कि क्या मैं कुछ भी समझ सकता हूं ... – petelids

+0

@petelids: ऑर्डर वास्तव में निर्दिष्ट किए जाने पर सिर के लिए एक नज़र डालने और धन्यवाद के लिए धन्यवाद। मुझे एहसास नहीं हुआ था कि वहां था और यह मुझे बहुत दुख बचा सकता था। –

उत्तर

4

ठीक है, तो ऐसा लगता है यहाँ जादू सूत्र DefinedNames भाग को जोड़ने के लिए है के रूप में मैं अपने संपादन में सुझाव दिया:

<x:definedName name="_xlnm._FilterDatabase" localSheetId="0" hidden="1">'Sheet 1'!$A$1:$E$11</x:definedName> 

जाहिर _xlmn._FilterDatabase को स्वत: फ़िल्टर के लिए आवश्यक है काम (कम से कम क्रमबद्ध करने के लिए)। मुझे लगता है कि अगर यह वहां नहीं है जब आप फ़िल्टर, यह बनाया जाता है, लेकिन अगर यह वहाँ नहीं है जब आप प्रकार, यह एक्सेल चल रही है। ।

फ़िल्टर & उन्नत:

तो तुम definedName की 18.2.5 खंड में SHEETNAME और कक्ष संदर्भ में यह भरने की जरूरत है

ओपन एक्सएमएल मानक के माध्यम से देख रहे हैं,, मैं यह देख फ़िल्टर

_xlnm। प्रश्नोत्तरी: यह परिभाषित नाम मानदंड मान युक्त एक श्रेणी को संदर्भित करता है जिसका उपयोग डेटा की एक श्रृंखला में एक उन्नत फ़िल्टर को लागू करने में किया जाता है।

_xlnm ._FilterDatabase: निम्नलिखित

एक में से एक हो सकता है। यह परिभाषित नाम उस श्रेणी को संदर्भित करता है जिसमें एक उन्नत फ़िल्टर लागू होता है। यह स्रोत डेटा रेंज का प्रतिनिधित्व करता है, unfiltered।

बी। यह परिभाषित नाम उस श्रेणी को संदर्भित करता है जिस पर ऑटोफिल्टर लागू होता है।

तो ऐसा लगता है कि आप हर शीट एक फिल्टर है कि के लिए एक _xlnm._FilterDatabase जोड़ने की जरूरत है (ऐसा लगता है वहाँ एक एकल पत्रक पर एक से अधिक फिल्टर करने के लिए कोई रास्ता नहीं है)। यह नाम _xlmn_FilterDatabase है, भले ही आपके पास फिल्टर के साथ कितनी चादरें हैं क्योंकि मुझे लगता है कि केवल नाम का संयोजन और localSheetId अद्वितीय होना चाहिए।

var filter = new AutoFilter() { Reference = string.Format("{0}:{1}", topLeftCellReference, bottomRightCellReference) }; 
worksheet.AppendChild(filter); 

workbookPart.Wookbook.DefinedNames.AppendChild(new DefinedName(string.Format("'{0}'!$A${1}:${2}${3}", 
    sheet.Name, 
    leftColumnLetter, 
    topRowIndex, 
    rightColumnLetter, 
    bottomRowIndex)) 
{ 
    Name = "_xlnm._FilterDatabase", 
    LocalSheetId = sheet.SheetId - 1, 
    Hidden = true 
}); 

इस तरह यह Excel में एक बग के आसपास काम कर रहा है प्रतीत होता है:

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

+0

बहुत बहुत धन्यवाद! ExcelBuilder लाइब्रेरी को बढ़ाने का प्रयास करते समय जावास्क्रिप्ट में एक्सेल उत्पन्न करते समय मुझे एक ही समस्या थी। वह चाल है! – nbeuchat

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