2010-02-27 5 views
7

मैं सोच रहा था कि क्या किसी को पता था कि किसी दिए गए वर्कशीट में डेटा है या नहीं, वास्तव में वर्कशीट की सभी पंक्तियों/कॉलमों के माध्यम से इसे समझने के लिए बिना किसी लूपिंग के।वीएसटीओ एक्सेल में, कोशिकाओं में डेटा का पता लगाने के लिए कैसे?

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

मैं इस मामले में किसी भी मदद की सराहना करता हूं। धन्यवाद!

+2

मैं जानता हूँ कि यह पुराना है, लेकिन उत्तर के अलावा इन घटनाओं बंद कर देते हैं, वर्कशीट पॉप्युलेट, तो उन्हें फिर से चालू करते: 'currentInstance.EnableEvents = false/सच; वर्तमानInstance.ScreenUpdating = false/true; ' –

उत्तर

12

पाशन से बचने और लगभग तात्कालिक निष्पादन की गति का लाभ लेने के लिए, आपको Excel.WorksheetFunction.CountA विधि है, जिसमें = COUNTA() कार्यपत्रक समारोह के रूप में एक ही परिणाम देता है का उपयोग कर सकते हैं।

यह मानते हुए कि आपके Excel.Application संदर्भ 'excelApp', आप में निम्नलिखित सी # 4.0 की तरह कोड का उपयोग कर सकते के नाम पर है और अपने Excel.Worksheet संदर्भ 'वर्कशीट' नाम दिया गया है:

// C# 4.0 
int dataCount = (int)excelApp.WorksheetFunction.CountA(worksheet.Cells); 

if (dataCount == 0) 
{ 
    // All cells on the worksheet are empty. 
} 
else 
{ 
    // There is at least one cell on the worksheet that has non-empty contents. 
} 

सी # में 3.0 और नीचे, यह थोड़ा अधिक वर्बोज़ है, क्योंकि आपके पास स्पष्ट रूप से याद आ रही वैकल्पिक तर्क प्रदान करने के लिए:

// C# 3.0 and below 
int dataCount = (int)excelApp.WorksheetFunction.CountA(
    worksheet.Cells, 
    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, 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); 

if (dataCount == 0) 
{ 
    // All cells on the worksheet are empty. 
} 
else 
{ 
    // There is at least one cell on the worksheet that has non-empty contents. 
} 

मुझे लगता है कि यह आपके लिए यह करना चाहिए!

माइक

+0

int में कास्ट काम नहीं करता है, क्योंकि [countA] (http://msdn.microsoft.com/en-us/library/ microsoft.office.interop.excel.worksheetfunction.counta (v = office.14) .aspx) एक डबल लौटाएं। – Maxence

-1

यह बहुत तेजी से किया जाना चाहिए:

private void CheckForContent() 
    { 
     Worksheet activeSheet = ActiveSheet; 
     var range = activeSheet.get_Range("A1", GetExcelColumnName(activeSheet.Columns.Count)+activeSheet.Rows.Count.ToString()); 
     range.Select(); 
     range.Copy(); 
     string text = Clipboard.GetText().Trim(); 
     if(string.IsNullOrEmpty(text)) 
     { 
      MessageBox.Show("No text"); 
     } 
    } 

    private string GetExcelColumnName(int columnNumber) 
    { 
     int dividend = columnNumber; 
     string columnName = String.Empty; 
     int modulo; 

     while (dividend > 0) 
     { 
      modulo = (dividend - 1) % 26; 
      columnName = Convert.ToChar(65 + modulo).ToString() + columnName; 
      dividend = (int)((dividend - modulo)/26); 
     } 
     return columnName; 
    } 
+0

चयन और प्रतिलिपि कभी तेज नहीं होती है;) –

0

मैं निम्नलिखित समाधान है, जो भी तात्कालिक पाया लेकिन मुझे यकीन है कि यह कैसे सही है ... यह अब तक मेरे सभी परीक्षण पारित किया है नहीं कर रहा हूँ।

यहाँ यह जो कोई जानना चाहता है के लिए है:

Worksheet sheet = (Worksheet)this.Application.ActiveSheet; 
Range usedRange = sheet.UsedRange; 
bool isUsed = (usedRange.Count > 1); 
if (usedRange.Count == 1) 
{ 
    isUsed = (usedRange.Value2 != null) && 
      (!string.IsNullOrEmpty(usedRange.Value2.ToString())); 
} 

if(isUsed) 
{ 
    // worksheet cells not empty 
} 

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

+0

मामाद, आपका दृष्टिकोण खराब नहीं है, लेकिन यह (ए) अधिक काम है, और (बी) कुछ वर्कशीट्स को गलत तरीके से रिपोर्ट करेगा क्योंकि डेटा नहीं है, क्योंकि प्रयुक्त रेंज कोशिकाओं में स्वरूपण जैसी चीजों से प्रभावित हो सकती है, सिर्फ मूल्य नहीं। यदि आप 'Application.WorksheetFunction.CountA' विधि का उपयोग करते हैं, तो इसके बजाय, आप पांच के बजाय, एक ही पंक्ति में सभी डेटा और * केवल * डेटा उठाएंगे। –

+0

दोनों क्लिपबोर्ड का उपयोग करने के लिए निश्चित रूप से बेहतर हैं। क्लिपबोर्ड तरीका "सफेद अंतरिक्ष" वाले कोशिकाओं को भी ध्यान में रखेगा, जो अन्य तरीकों से नहीं होंगे, लेकिन यह एक विशेष मामला है :) –

+0

माइक, मुझे स्वरूपण के बारे में पता नहीं था। यदि ऐसा है, तो मैं निश्चित रूप से सहमत हूं कि वर्कशीट फ़ंक्शन काउंटर एक बेहतर दृष्टिकोण है। हालांकि, मेरे विशिष्ट परिदृश्य में, मैं एक सेल को ओवरराइड नहीं करना चाहता हूं, भले ही परिवर्तन केवल एक स्वरूपण परिवर्तन हो। स्पष्टीकरण के लिए धन्यवाद! –

4

मैं कुछ समय के लिए वीएसटीओ और एक्सेल के साथ बहुत गहन स्तर पर काम करता हूं, इसलिए मुझे उम्मीद है कि मैं आपके साथ समय के साथ सीखा चीजें साझा कर सकता हूं।

आपके द्वारा प्रदान की गई जानकारी के आधार पर, मैं ऑब्जेक्ट सरणी को कास्टिंग करने और इसके बजाय उस जानकारी के साथ काम करने की अनुशंसा करता हूं। मूल रूप से आप के रूप में मानों तक पहुंच चाहते हैं:

object[,] arrayValues = (object[,])ExcelRange.Value2; 

arrayValues ​​एक 2D सरणी है ([पंक्ति, स्तंभ])। एक्सेल अजीब तेजी से सरणी को पॉप्युलेट करता है, और निश्चित रूप से सरणी पर संचालन बहुत ही सक्षम होगा (मुक्केबाजी के प्रदर्शन के बारे में चिंता न करें, यह कोई मुद्दा नहीं है, मेरा विश्वास करो)।

HTH, जेम्स

+0

धन्यवाद जेम्स, मैं एक वीएसटीओ एड-इन पर काम कर रहा हूं एक्सेल के लिए और अक्सर उन मुद्दों में भाग लेते हैं जिन्हें तुरंत किसी के द्वारा उत्तर दिया जा सकता है, लेकिन इंटरनेट पर खोजने में समय लगता है। मैं स्टैक ओवरफ्लो का अधिक उपयोग करना सुनिश्चित करूँगा क्योंकि यहां बहुत से वीएसटीओ विशेषज्ञ हैं! –

+0

@ कोडर 4 लाइफ, क्या आपको पता है कि सेल रंग जैसी गुणों के लिए समान "थोक" लाने का कोई तरीका है या नहीं? मैंने अभी तक एक विधि का उपयोग किया है जैसा कि आपने महीनों के लिए मूल्यों के लिए वर्णित किया है, लेकिन मुझे अभी तक सभी रंगों (रेंज.इंटरियर.कॉलर) को पंक्ति-दर-पंक्ति, कॉल के बिना लाने में सक्षम होने का कोई तरीका नहीं मिला है। -by-col। और यह दर्दनाक धीमा है! धन्यवाद! –

+0

असल में, मैंने इस रंग-प्राप्त प्रश्न के लिए एक नया धागा खोला, बस टिप्पणियों को देखने के बजाय अन्य लोगों के लिए ढूंढना आसान है। यूआरएल है [http://stackoverflow.com/questions/8451511/vsto-getting-excel-cell-properties-in-bulk ](httpoverstow.com/questions/8451511/vsto-getting-excel-cell -properties में थोक) –

0

कैसे के बारे में?

public static bool IsSheetEmpty(int sheetNo) 
{ 
    bool isEmpty = false; 

    if (sheetNo <= Globals.ThisAddIn.Application.Worksheets.Count) 
    { 
     Worksheet ws = Globals.ThisAddIn.Application.Worksheets[sheetNo]; 

     if (ws.UsedRange.Address.ToString() == "$A$1" && String.IsNullOrWhiteSpace(ws.get_Range("A1").Value2)) 
     { 
      isEmpty = true; 
     } 
    } 
    else 
    { 
     // or add your own error handling when sheetNo is not found 
    } 

    return isEmpty; 
} 

उदाहरण कॉल

bool isFirstEmpty = IsSheetEmpty(1); 
संबंधित मुद्दे