2012-10-04 18 views
5

मैं एक साधारण सी # एप्लिकेशन कर रहा हूं जो मौजूदा एक्सेल 2003 टेम्पलेट (xlt) को संपादित करना और एक नई * .xls फ़ाइल में सहेजना है। यह है की तरह:एक्सेल 2003 फ़ाइल सहेजें

Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application(); 
Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Open("\\my_template.xlt"); 
Microsoft.Office.Interop.Excel._Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Sheets[0]; 

तो मैं कुछ कोशिकाएं होती हैं जो फ़ाइल अंदर विभिन्न सूत्रों में उपयोग किया जाता है को संशोधित करने और एक नई फ़ाइल में टेम्पलेट सहेजें:

workbook.SaveAs("newfile.xls", Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal); 
workbook.Close(true, misValue, misValue); 
app.Quit(); 

worksheet = null; 
workbook = null; 
app = null; 

तो समस्या यह है कि जब नई फ़ाइल सफलतापूर्वक सहेजा गया है मैं इसे खोलता हूं और देखता हूं कि सूत्रों के परिणाम, जो मैंने संपादित किए गए कक्षों का उपयोग कर रहे हैं, "#NAME" और इसी तरह हैं। जब मैं फ़ाइल को फिर से खोलता हूं - सबकुछ ठीक हो जाता है। ऐसा क्यों होता है?

शायद मैं गलत तरीके से फ़ाइल सहेज रहा हूं और इसलिए मुझे इसके पहले खुलने के दौरान त्रुटियां दिखाई दे रही हैं? यह समस्या केवल 2003 कार्यालय के लिए वास्तविक है ... जैसा कि मैंने स्वीकार किया है।

+0

कौन सा इंटरॉप विधानसभा संस्करण आप संदर्भित कर रहे हैं? –

+3

आप कोशिकाओं को कैसे संपादित कर रहे हैं? – oberfreak

उत्तर

3

रूप here उल्लेख किया है, xlExcel8 बजाय को गणन बदलने xlWorkbookNormal, और यह सही प्रारूप में बचत होगी।

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

तीसरा, अगर आप नेट 4 या इसके बाद के संस्करण का उपयोग कर रहे हैं, तो आप कार्यपुस्तिका बंद विधि के वैकल्पिक तर्क के लिए मान की आपूर्ति करने की जरूरत नहीं है, तो यह बस के रूप में अच्छी तरह से काम करता है: अंत में

workbook.Close(true); 

, यदि आप एक वर्कशीट के रूप में अपने वर्कशीट कास्ट करने के लिए की जरूरत नहीं है, तो आप सिर्फ यह कर सकते हैं:

Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.Sheets[0]; 

एक अंतिम विचार, आवेदन वस्तु जारी करने के लिए मार्शल का उपयोग एक बार आप कर रहे हैं, या Excel में चारों ओर रखती हूँ अपने कार्य प्रबंधक हमेशा के लिए (हो सकता है कि आपको एक कोशिश ब्लॉक के अंदर क्या करना है, और फिर करें एक अंत में ब्लॉक में इस):

Marshal.ReleaseComObjct(app); 

अपडेट किया विधि के संस्करण नीचे है:

Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application(); 

try 
{ 
    Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Open(@"\my_template.xlt"); 
    Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.Sheets[0]; 

    //Do stuff 

    workbook.SaveAs("newfile.xls", Microsoft.Office.Interop.Excel.XlFileFormat..xlExcel8); 
    workbook.Close(true); 
    app.Quit(); 
} 
finally 
{ 
    Marshal.ReleaseComObject(app); 
} 
+0

मैं बाद में आपकी सलाह का परीक्षण करूंगा और परिणाम यहां रिपोर्ट करूँगा, thx! – TakinosaJi

+0

यह मेरी मदद नहीं करता ..... – TakinosaJi

+0

ठीक है 'xlExcel8' एक्सेल 2003 कार्यपुस्तिकाओं को सहेजने के लिए सही enum है, क्या आप अपने मान 'Value' या' Value2' प्रॉपर्टी के साथ सेट कर रहे हैं? – JMK

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