2012-09-11 22 views
5

एक वीएसटीओ सी # प्रोजेक्ट में मैं पंक्ति अनुक्रमणिका के एक सेट से पंक्तियों की एक श्रृंखला प्राप्त करना चाहता हूं।पंक्तियों की एक्सेल रेंज प्राप्त करने का सबसे तेज़ तरीका

पंक्ति अनुक्रमणिका उदाहरण के लिए "7,8,9,12,14" हो सकती है।

तब मुझे "7: 9, 12,14" पंक्तियां चाहिए।

मैं अब ऐसा करते हैं:

Range rng1 = sheet.get_Range("A7:A9,A12,A14", Type.Missing); 
rng1 = rng1.EntireRow; 

लेकिन यह एक बिट श्रृंखला रेंज विनिर्देश में से निपटने के कारण अक्षम है।

sheet.Rows["7:9"] 

काम करता है, लेकिन मैं नहीं दे सकता यह

sheet.Rows["7:9,12,14"] // Fails 
+0

आप व्यक्तिगत श्रेणियों को संघबद्ध कर सकते हैं, लेकिन यह समेकित पते के साथ एकल कॉल का उपयोग करने से कहीं अधिक कुशल नहीं हो सकता है। –

उत्तर

9

इस प्रयास करें:

Sheet.Range("7:9,12:12,14:14") 

संपादित करें: सी # में VSTO का उपयोग कर यदि क्षमा करें यह किया जाना चाहिए था:

sheet.get_Range("7:9,12:12,14:14", Type.Missing) 
+0

यूप '.get_Range' सही तरीका है :) –

+0

महत्वपूर्ण भाग जो मैं दिखाने की कोशिश कर रहा था वह यह था कि आप रेंज विधि में पंक्ति संख्याओं का उपयोग कर सकते हैं और आपको .entirerow का उपयोग करने की आवश्यकता नहीं है। ओपी में पहले से ही .get_range था इसलिए मुझे उम्मीद है कि वह जानता था कि मेरा क्या मतलब था। मस्तिष्क से पहले गियर में कीबोर्ड। ;) – Reafidy

+0

हां यह मेरा जवाब जैसा दिखता है, लेकिन मैं इसे अभी आज़मा दूंगा। –

2

मैं सी # में विशेषज्ञ नहीं हूं लेकिन AFAIK आपको एन्टी का उपयोग करना है जैसा कि आपने ऊपर किया है, फिर से करें। जिस स्ट्रिंग को आप ढूंढ रहे हैं उसे .Address संपत्ति से प्राप्त किया जा सकता है। उदाहरण के लिए

private void button1_Click(object sender, EventArgs e) 
    { 
     Microsoft.Office.Interop.Excel.Application xlexcel; 
     Microsoft.Office.Interop.Excel.Workbook xlWorkBook; 
     Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet; 
     Microsoft.Office.Interop.Excel.Range xlRange; 

     object misValue = System.Reflection.Missing.Value; 
     xlexcel = new Excel.Application(); 

     xlWorkBook = xlexcel.Workbooks.Add(); 

     // Set Sheet 1 as the sheet you want to work with 
     xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); 

     xlRange = xlWorkSheet.get_Range("A7:A9,A12,A14", misValue); 

     MessageBox.Show(xlRange.EntireRow.Address); 

     xlRange = xlWorkSheet.get_Range(xlRange.EntireRow.Address, misValue); 

     MessageBox.Show(xlRange.Address); 
    } 

तो आप ऊपर के रूप में

private void button1_Click(object sender, EventArgs e) 
    { 
     Microsoft.Office.Interop.Excel.Application xlexcel; 
     Microsoft.Office.Interop.Excel.Workbook xlWorkBook; 
     Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet; 
     Microsoft.Office.Interop.Excel.Range xlRange; 

     object misValue = System.Reflection.Missing.Value; 
     xlexcel = new Excel.Application(); 

     xlWorkBook = xlexcel.Workbooks.Add(); 

     // Set Sheet 1 as the sheet you want to work with 
     xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); 

     xlRange = xlWorkSheet.get_Range("$7:$9,$12:$12,$14:$14", misValue); 

     MessageBox.Show(xlRange.Address); 
    } 

हिस्सा

xlRange = xlWorkSheet.get_Range("$7:$9,$12:$12,$14:$14", misValue); 
5

यहाँ लिख सकते हैं कोड आप देख रहे हैं है देखें:

int startRow, endRow, startCol, endCol, row,col; 
var singleData = new object[col]; 
var data = new object[row,col]; 
//For populating only a single row with 'n' no. of columns. 
var startCell = (Range)worksheet.Cells[startRow, startCol]; 
startCell.Value2 = singleData; 
//For 2d data, with 'n' no. of rows and columns. 
var endCell = (Range)worksheet.Cells[endRow, endCol]; 
var writeRange = worksheet.Range[startCell, endCell]; 
writeRange.Value2 = data; 

आप पूरी रेंज हो सकती है, यह 1 आयामी या 2 आयामी हो कोशिकाओं की सरणी

यह विधि विशेष रूप से सहायक होती है जबकि संपूर्ण एक्सेल शीट के माध्यम से लूपिंग होती है और जहां और जब आवश्यक डेटा पॉप्युलेट करते हैं।

0

Reafidy's edited answer is a great start, लेकिन मैं टिप्पणी में जितना कर सकता था उससे अधिक विस्तार करना चाहता था। sheet.get_Range(rangeselect) पंक्ति से पंक्ति पर जाने से कहीं अधिक तेज है, लेकिन एक बात जो मैंने अभी तक नहीं देखी है वह है कि get_Range पैरामीटर में 255 वर्ण सीमा है।

कि सीमा के आस-पाने के लिए, की तरह पर्वतमाला का एक सेट का निर्माण "8: 8,10: 13,14: 55" सामान्य रूप में तो यह कोड का एक संस्करण का उपयोग करें:

string rangeSelectPart; 
while (rangeSelect.Length >= 255) 
{ 
    rangeSelectPart = rangeSelect.Substring(0, rangeSelect.Substring(0,255).LastIndexOf(',')); 
    Range multiRangePart = sheet.get_Range(rangeSelectPart, Type.Missing); 

    //do something with the range here using multiRangePart 

    rangeSelect= rangeSelect.Substring(rangeSelectPart.Length + 1); 
} 
Range multiRange = sheet.get_Range(rangeSelect, Type.Missing); 
// do the same something with the last part of the range using multiRange 
// now that the remaining rows are described in less than 255 characters 

हो जाएगा ताकि व्यक्तिगत पंक्तियों पर संचालन करने से काफी तेज हो, लेकिन बड़े गैर-संगत पंक्ति सेटों के साथ प्रस्तुत होने पर भी असफल नहीं होगा।


ध्यान दें कि SutharMonil's answer is way faster आईएफएफ सन्निहित आयताकार श्रेणियों में मूल्यों की स्थापना। सी # से एक्सेल तक जाने वाली बाधा आमतौर पर COM ऑब्जेक्ट्स के माध्यम से बार-बार कॉल होती है जो बनाए और अद्यतन होने पर अवरुद्ध होती है, और उसका जवाब अच्छी तरह से कॉल को समेकित करता है।

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

object[,] colors; 
//use C# to set appropriate colors to each location in array... 
for(int i = 0; i < colors.get_Length(0); i++){ 
    for(int j = 0; j < colors.get_Length(1); j++){ 
     colors[i,j] = XlThemeColor.xlThemeColorAccent6; 
    } 
} 

//below causes a type error 
formatRange.Interior.ThemeColor = color; 

मैं इसे काम करने के लिए अपडेट करने के लिए याद रखने की कोशिश करूंगा।


दोहराया कार्यों के लिए

अन्त में Globals.ThisAddIn.Application.ScreenUpdating = false; सेट और फिर सही पर सेट करें जब आप काम हो गया। इसके बिना, एक्सेल श्रेणी सेट के प्रत्येक सेट को अद्यतन करने के बाद स्क्रीन अपडेट करने के लिए बंद हो जाता है और यह ऑपरेशन में बहुत समय जोड़ सकता है।

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

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