I tried to use F# read a xls file as below
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
The problem is how can I parse vals into a F# type? in fsx.exe, the vals showed as
'val vals: obj = [bound1
bound2
["colname1"; "colname2"; ...]
[1234,5678,]...]
I wanted to retrieve the string represetation first, but
printfn "%A" vals.ToString();;
shows "System.Object[,]"
only. If I then try to access vals.[1,1]
, I got error The field,constructor or member 'item' is not defined
thanks,
The type of Value2
is obj
. If the range represents just a single cell, the actual type will be some primitive type (int, float, decimal, string). If the range represents several cells (your case), then the returned value is a two-dimensional .NET array of type obj[,]
.
You can cast the value returned by Value2
to an array and access it using indexers:
let vals = sheet.UsedRange.Value2 :?> obj[,]
vals.[1, 1]
Note that the returned array is 1-based (and not zero based as usual). The indexer again returns obj
, so you need to cast the values to their actual type. Depending on your sheet, this will be probably float or string:
let firstTitle = vals.[1, 1] :?> string
let firstValue = vals.[2, 1] :?> float
(Assuming you have a title in A1 and a number in A2)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With