2012-09-11 20 views
5

En un proyecto VSTO C#, quiero obtener un rango de filas de un conjunto de índices de fila.La forma más rápida de obtener un rango de filas de Excel

Los índices de fila pueden ser, por ejemplo, como "7,8,9,12,14".

Luego quiero el rango "7: 9,12,14" filas.

ahora hago esto:

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

pero es un poco ineficaz debido a la manipulación de especificación de extensión de cadena.

sheet.Rows["7:9"] 

obras, pero no puedo dar a este

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

Puede unir los rangos individuales, pero eso puede no ser más eficiente que usar la única llamada con la dirección concatenada. –

Respuesta

9

Prueba esto:

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

EDIT: Lo siento si con VSTO en C# que debería haber sido:

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

Yup '.get_Range' es la manera correcta :) –

+0

La parte importante que estaba tratando de mostrar es que puede usar números de fila en el método de rango y no necesita usar .entirerow. El OP ya tenía .get_range así que supongo que él sabía lo que quería decir. Teclado en marcha antes del cerebro. ;) – Reafidy

+0

Sí, esta parece ser mi respuesta, pero voy a intentarlo ahora. –

2

No soy un experto en C# pero AFAIK tienes que usar el Enti reRow como lo has hecho anteriormente. La cadena que está buscando se puede lograr desde la propiedad .Address. Por ejemplo

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); 
    } 

para que pueda escribir lo anterior como

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); 
    } 

Ver la parte

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

Aquí está el código que busca:

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; 

Usted puede tener un rango completo, ya sea 1 dimensional o 2 dimensional conjunto de celdas.

Este método es particularmente útil al pasar por toda la hoja de Excel y completar datos donde y cuando sea necesario.

0

Reafidy's edited answer is a great start, pero quería ampliarlo más de lo que podía hacer en un comentario. sheet.get_Range(rangeselect) es mucho más rápido que ir fila por fila, pero una cosa que no he mencionado aún es que el parámetro get_Range tiene un límite de 255 caracteres.

Para conseguir alrededor de esa limitación, construir un conjunto de rangos como "8: 8,10: 13,14: 55" como normal, entonces utilizar una variante de este código:

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 

Esta voluntad ser significativamente más rápido que realizar operaciones en filas individuales, pero tampoco fallará cuando se presenten grandes conjuntos de filas no contiguas.


Tenga en cuenta que el establecimiento SutharMonil's answer is way faster IFF valores en rangos rectangulares contiguos. El cuello de botella que pasa de C# a sobresalir suele ser la repetición de llamadas a través de los objetos COM que se bloquean durante la creación y actualización, y su respuesta consolida las llamadas.

Desafortunadamente en mis pruebas hasta el momento, intentar usarlo para trabajar con propiedades que no son de tipo cadena ha resultado en un error de tipo. Por ejemplo:

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; 

Trataré de recordar actualizar si logro que funcione.


último para operaciones repetidas conjunto Globals.ThisAddIn.Application.ScreenUpdating = false; y luego otra vez en cierto cuando haya terminado. Sin esto, Excel se detiene para actualizar la pantalla después de actualizar cada conjunto de propiedades de rango y eso puede agregar mucho tiempo a la operación.

Cuestiones relacionadas