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);
}
Es un poco más incómodo, ya que estoy lidiando con indicios, pero si es la única forma ... – Ian
@Ian: vea mi respuesta elaborada arriba. –
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