c# - मैं एक फ़ाइल को कैसे खोलूं जो किसी अन्य एप्लिकेशन में खोला गया है




excel file-io (5)

मेरे पास एक Winforms एप्लिकेशन है जो विश्लेषण के लिए एक्सेल फ़ाइलों में लोड होता है। वर्तमान में, एक्सेल फ़ाइल खोलने के लिए फ़ाइल एक्सेल में पहले से ही खुली नहीं होनी चाहिए अन्यथा फ़ाइल में कोशिश करने और लोड होने पर फ़ाइलियोएक्सप्शन फेंक दिया जाता है।

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

क्या यह संभव है?


Answers

आप फ़ाइल को खोलने की कोशिश कैसे कर रहे हैं?

यदि आप इसे पढ़ने / लिखने के लिए खोलने की कोशिश कर रहे हैं तो आपको अपवाद मिलेगा। यदि आप इसे केवल पढ़ने के लिए खोलने की कोशिश कर रहे हैं तो आपको ठीक होना चाहिए।

var file = File.Open("file.xls", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

यह केवल तभी काम करेगा जब Excel ने FileShare.Read साथ फ़ाइल खोली है। अन्य अनुप्रयोगों (यानी आपके) को फ़ाइल तक पहुंचने की अनुमति देने के लिए सेट FileShare.Read । यदि यह सेट नहीं है तो Excel ने विशेष पहुंच के साथ फ़ाइल खोली होगी। नोट: मुझे नहीं लगता कि यह मामला है क्योंकि आप एक्सेल फ़ाइल (एक्सेल में) को पढ़ने के लिए खोल सकते हैं अगर किसी और ने इसे संपादित करने के लिए खोल दिया हो।

अद्यतन - ठीक है, मैंने डारिन की टिप्पणियों के बाद तक इसे ठीक से परीक्षण नहीं किया। मदद के बावजूद आपको FileShare.ReadWrite ध्वज की आवश्यकता है, यह दर्शाता है कि यह बाद के फ़ाइल ओपनर्स के लिए है। यहां तक ​​कि FileShare.Read पर्याप्त अच्छा है, जो मुझे भी गंध लगता है।


फ़ाइल खोलते समय आप FileShare.ReadWrite को पारित करने का प्रयास कर सकते हैं:

using (var stream = new FileStream(
       @"d:\myfile.xls", 
       FileMode.Open, 
       FileAccess.Read, 
       FileShare.ReadWrite))
{

}

पहले से खोले गए फ़ाइल की एक प्रति बनाने का प्रयास करें, इसे पढ़ें और इसे छोड़ दें। यह जांचने के लिए कि फ़ाइल पहले ही खोली गई है, प्रतिलिपि पढ़ने, पढ़ने, त्यागने के द्वारा अपवाद को पढ़ने और संभालने का प्रयास करें।


.NET के लिए स्प्रेडशीट गियर कार्यपुस्तिकाओं को पढ़ सकता है जबकि Excel उन्हें खोलता है। यहां वह कोड है जिसका हम उपयोग करने के लिए उपयोग करते हैं (ध्यान दें कि हम एक्सेल या किसी अन्य ऐप को लिखने के बीच में लिखने के लिए खोलने के बाद पूरी फ़ाइल को लॉक करते हैं):

stream = new System.IO.FileStream(path,
    System.IO.FileMode.Open,
    System.IO.FileAccess.Read,
    System.IO.FileShare.ReadWrite,
    SG.CompoundDocumentIO.Storage.OpenBufferLength);
try
{
    stream.Lock(0, stream.Length);
}
catch
{
    // .NET 1.1 requires cast to IDisposable
    ((IDisposable)stream).Dispose();
    throw;
}

अस्वीकरण: मेरे पास स्प्रेडशीट गियर एलएलसी है


यहां एक पूरी तरह से निशुल्क सी # लाइब्रेरी है, जो आपको ओपनएक्सएमएल पुस्तकालयों का उपयोग करके DataSet , DataTable या List<> को एक वास्तविक एक्सेल 2007 .xlsx फ़ाइल में निर्यात करने देती है:

http://mikesknowledgebase.com/pages/CSharp/ExportToExcel.htm

पूर्ण स्रोत कोड प्रदान किया जाता है - नि: शुल्क - निर्देशों के साथ, और एक डेमो आवेदन।

इस कक्षा को अपने आवेदन में जोड़ने के बाद, आप अपने डेटासेट को एक्सेल में कोड की केवल एक पंक्ति में निर्यात कर सकते हैं:

CreateExcelFile.CreateExcelDocument(myDataSet, "C:\\Sample.xlsx");

यह उससे ज्यादा आसान नहीं है ...

और यह आपके सर्वर पर एक्सेल को उपस्थित होने की भी आवश्यकता नहीं है।





c# excel file-io