2011-03-23 11 views
12

Estoy tratando de obtener una columna, pero limitándola a rango utilizado ...¿Cómo obtengo una columna completa en el rango utilizado?

public static Excel.Application App = new Excel.Application(); 
public static Excel.Workbook WB; 

WB = App.Workbooks.Open("xxx.xls", ReadOnly: true); 

var sheet = (WB.Sheets[1] as Excel.Worksheet); 

// returns 65536 rows, I want only 82 (used range) 
sheet.get_Range("F:F"); 

sheet.UsedRange.get_Range("F:F").Rows.Count; // 65536 

¿Cómo puedo conseguirlo?

Respuesta

17

Puede utilizar

sheet.UsedRange.Columns[6, Type.Missing].Rows.Count 

o esta

sheet.UsedRange.Columns["F:F", Type.Missing].Rows.Count 
+0

1 no es válido. 2 y 3 trabajado! ¡Gracias! – BrunoLM

3

suena como desea que el Application.Intersect del UsedRange y la Columna ("F: F")

+0

Creo que esta es la respuesta más elegante de todas. Funciona de maravilla – Juan

2

este es el forma optimizada para leer un archivo de Excel columna por columna (o fila por fila):

static void ReadExcelFile(filename) { 
    Excel.Application xlApp = new Excel.Application(); 
    Excel.Workbook xlWorkBook = xlApp.Workbooks.Open(filename, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); 
    Excel.Worksheet xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); // 1st sheet 
    // the entire table : 
    Excel.Range range = xlWorkSheet.UsedRange; // range.Rows.Count, range.Columns.Count 

    for (int col = 1; col <= range.Columns.Count; col++) { 
     // this line does only one COM interop call for the whole column 
     object[,] currentColumn = (object[,])range.Columns[col, Type.Missing].Value; 
     double sum = 0; 
     for (int i = 1; i < currentColumn.Length; i++) { 
      object val = currentColumn[i, 1]; 
      sum += (double)val; // only if you know that the values are numbers 
      // if it was a string column : 
      //Console.WriteLine("{0}",(string)val); 
     } 
    } 
} 
Cuestiones relacionadas