2012-08-31 57 views
6

Estoy usando el LinqToExcel library. Funciona muy bien hasta ahora, excepto que necesito iniciar la consulta en una fila específica. Esto se debe a que la hoja de cálculo de Excel del cliente usa algunas imágenes e información de "encabezado" en la parte superior del archivo de Excel antes de que los datos realmente comiencen.LinqToExcel - Necesito comenzar en una fila específica

Los datos en sí serán fáciles de leer y son bastante genéricos, solo necesito saber cómo decirle al ExcelQueryFactory que comience en una fila específica.

Conozco la opción WorksheetRange<Company>("B3", "G10"), pero no deseo especificar una fila final, justo donde comienza leyendo el archivo.

Utilizando la última v. De LinqToExcel con C#

Respuesta

1

Ha intentado WorksheetRange<Company>("B3", "G")

+0

Sí, unfortuantly me da un error "argumento endrange 'G' es un formato no válido para el nombre de la celda" – contactmatt

0

Unforunatly, en este momento y la iteración en el marco LinqToExcel, no parece haber ninguna manera de hacer esto.

Para evitar esto, le solicitamos al cliente que cargue los datos en su propia "hoja" dentro del documento de Excel. La fila de encabezado en la primera fila y los datos debajo de ella. Si quieren algún "metadato", deberán incluirlo en otra hoja. A continuación se muestra un ejemplo del LinqToExcel documentation sobre cómo consultar una hoja específica.

var excel = new ExcelQueryFactory("excelFileName"); 
var oldCompanies = from c in repo.Worksheet<Company>("US Companies") //worksheet name = 'US Companies' 
        where c.LaunchDate < new DateTime(1900, 0, 0) 
        select c; 
2

Sólo traté de este código y parece que ha funcionado muy bien:

var book = new LinqToExcel.ExcelQueryFactory(@"E:\Temporary\Book1.xlsx"); 

var query = 
    from row in book.WorksheetRange("A4", "B16384") 
    select new 
    { 
     Name = row["Name"].Cast<string>(), 
     Age = row["Age"].Cast<int>(), 
    }; 

sólo me dieron vuelta las filas con datos.

4

supongo que ya resuelto esto, pero tal vez para otros - parece que se puede utilizar

var excel = new ExcelQueryFactory(path); 
var allRows = excel.WorksheetNoHeader(); 

//start from 3rd row (zero-based indexing), length = allRows.Count() or computed range of rows you want 
for (int i = 2; i < length; i++) 
{ 
    RowNoHeader row = allRows.ElementAtOrDefault(i); 
    //process the row - access columns as you want - also zero-based indexing 
} 

No es tan simple como que especifica algunos Range ("B3", ...), sino también la forma . Espero que esto ayude al menos a alguien;)

+0

en la que asignará la variable 'length'? – CodeArtist

+0

Bueno, normalmente sería 'allRows.Count' o' allRows.Count() 'o' allRows.Length' (no lo sé ahora, lo siento), si quiere leer todas las líneas. O como una sustitución para especificar (no existente) 'Rango (" B3 "," G10 ")' tiene que calcularlo. 'Longitud' se usó solo para mostrar los propósitos. En aquel entonces, no había una solución simple AFAIK ... Buen punto, publicación original editada. – podvlada

2

Había intentado esto, funciona bien para mi situación.

//get the sheets info 
     var faceWrksheet = excel.Worksheet(facemechSheetName); 
     // get the total rows count. 
     int _faceMechRows = faceWrksheet.Count(); 

     // append with End Range. 
    var faceMechResult = excel.WorksheetRange<ExcelFaceMech>("A5", "AS" + _faceMechRows.ToString(), SheetName). 
         Where(i => i.WorkOrder != null).Select(x => x).ToList(); 
+0

Acabo de encontrar esto muy útil, pero quería señalar que necesita agregar el valor de la fila de inicio al recuento de registros o perder ese número de líneas al final, por lo que debe ser int _faceMechRows = faceWrksheet.Count() + 5; –

+0

@DavidMolyneux No estoy seguro de esto fue hace 2 años, pero en mi caso fue para omitir algunos registros de encabezado. – Eldho

+0

Hola, estás en lo correcto. He examinado esto un poco más, si tienes datos en las filas superiores, funciona bien. Si, como yo, son solo filas en blanco, entonces no están cargadas, y el recuento total de filas es corto por la cantidad de filas vacías.Entonces, si tiene 5 filas en blanco y 15 filas de datos (20 filas en total), el recuento total de filas es 15, por lo que su rango pasaría de la fila 5 a la fila 15, faltando las últimas 5 filas agregadas en las filas omitidas lo devolverá al correcto total –

Cuestiones relacionadas