2011-05-17 14 views
6

Traté de usar F # leer un archivo xls de la siguiente maneraf # leer xls - cómo analizar un objeto valor2

open Microsoft.Office.Interop.Excel 
let app = ApplicationClass(Visible = false) 
let book = app.Workbooks.Open "test.xls" 
let sheet = book.Worksheets.[1] :?> _Worksheet 
let vals = sheet.UsedRange.Value2 

El problema es cómo puedo analizar Vals en un tipo F #? en fsx.exe, el vals mostraron como

'val vals: obj = [bound1 
        bound2 
        ["colname1"; "colname2"; ...] 
        [1234,5678,]...] 

quería recuperar el represetation primera cadena, pero printfn "%A" vals.ToString();; espectáculos "System.Object[,]" solamente. Pues si yo trato de acceso vals.[1,1], que ha obtenido un error The field,constructor or member 'item' is not defined

gracias,

Respuesta

3

El tipo de Value2 es obj. Si el rango representa solo una celda, el tipo real será de tipo primitivo (int, float, decimal, string). Si el rango representa varias celdas (su caso), entonces el valor devuelto es una matriz .NET bidimensional de tipo obj[,].

Puede convertir el valor devuelto por Value2 a una matriz y acceder a él mediante indexadores:

let vals = sheet.UsedRange.Value2 :?> obj[,] 
vals.[1, 1] 

Tenga en cuenta que la matriz devuelta se basa-1 (y no es cero basa, como de costumbre). El indexador vuelve a mostrar obj, por lo que debe convertir los valores a su tipo real. Dependiendo de su situación, esta será probablemente flotar o cadena:

let firstTitle = vals.[1, 1] :?> string 
let firstValue = vals.[2, 1] :?> float 

(suponiendo que tiene un título en A1 y un número en A2)

+0

gracias ¿Puedo utilizar rebanar índice en obj [,] como Vals . [1,1 ..]? – matlabdbuser

+0

@matlabdbuser: Sí, creo que debería funcionar (porque estás trabajando con una simple matriz .NET). Si obtienes un subintervalo que contiene solo números, también puedes convertirlo en una matriz 2D de flotantes usando 'float vals 'Array2D.map. –

Cuestiones relacionadas