2011-05-27 16 views
7

que estoy tratando de conseguir un rango de Excel, que tiene múltiples áreas especificadas, en esencia lo que tengo ...Excel Get_Range con múltiples áreas

int StartColumn
int EndColumn
int [] ColumnsToSkip

Cuando combina esto, es posible producir un rango con áreas no contiguas. Lamentablemente no puedo entender la llamada para obtener esto ... MSDN no es muy útil ...

Hoja de trabajo;

sheet.get_Range(what goes in here???); 

¿Alguien sirve de ayuda? Aclamaciones.

Respuesta

8

una solución muy simple es especificar diferentes áreas en forma separada por comas:

sheet.get_Range("A1:B1,E1:G1"); 

Para las combinaciones de rango programáticas, también hay los Union y Intersection métodos del objeto ExcelApplication. Esos son un poco torpes para usar en C# debido a muchos parámetros opcionales. Vea aquí

http://codeidol.com/csharp/c-sharp-in-office/Working-with-Excel-Objects/Working-with-the-Range-Object/

de ejemplos.

EDIT: algunos consejos adicionales:

En su caso, primero se debe transformar el "ColumnsToSkip" en "ColumnsToKeep", ya que eso es lo que se necesita para cualquier tipo de unión celular. Aquí es una solución LINQ:

int[] ColumnsToKeep = Enumerable.Range(StartColumn, EndColumn -StartColumn + 1) 
         .Except(ColumnsToSkip) 
         .ToArray(); 

A continuación, puede crear algo en la línea de este ejemplo:

Excel.Range totalRange = null; 
    foreach(int col in ColumnsToKeep) 
    { 
     totalRange = Union(excelApp,totalRange,(Excel.Range)sh.Cells[row, col]); 
    } 

donde se define "Unión", por ejemplo, así:

static Excel.Range Union(Excel.Application app, Excel.Range r1, Excel.Range r2) 
    { 
     if (r1 == null && r2 == null) 
      return null; 
     if (r1 == null) 
      return r2; 
     if (r2 == null) 
      return r1; 
     return app.Union(r1, r2, 
      null, null, null, null, null, null, 
      null, null, null, null, null, null, 
      null, null, null, null, null, null, 
      null, null, null, null, null, null, 
      null, null, null, null); 
    } 
+0

Es un poco más incómodo, ya que estoy lidiando con indicios, pero si es la única forma ... – Ian

+0

@Ian: vea mi respuesta elaborada arriba. –

+0

No lo he probado todavía pero parece que hará el trabajo. A punto de darle un giro. Tengo que amar el sentido inteligente de esa aplicación. Método de unión, ¡es bueno tener al fin params opcionales en C#! – Ian

0

Otra forma de trabajar con rangos no contiguos es simplemente combinarlos dentro de Excel utilizando un rango con nombre, por ejemplo:

=CHOOSE({1;2;3},RANGE1,RANGE2,RANGE3)

Esto producirá una matriz que consta de los rangos "apilados" uno encima del otro. Asigne esta fórmula a un rango con nombre y puede usarla programáticamente como cualquier otro objeto Range.

Cuestiones relacionadas