我尝试使用F#读取xls文件,如下所示
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
问题是如何将val解析为F#类型?在fsx.exe中,val显示为
'val vals: obj = [bound1
bound2
["colname1"; "colname2"; ...]
[1234,5678,]...]
我想首先检索字符串表示,但是
printfn "%A" vals.ToString();;
仅显示"System.Object[,]"
。如果我尝试访问vals.[1,1]
,则会收到错误The field,constructor or member 'item' is not defined
感谢,
答案 0 :(得分:3)
Value2
的类型为obj
。如果范围仅表示单个单元格,则实际类型将是某种基本类型(int,float,decimal,string)。如果范围表示几个单元格(您的情况),则返回的值是类型为obj[,]
的二维.NET数组。
您可以将Value2
返回的值强制转换为数组并使用索引器访问它:
let vals = sheet.UsedRange.Value2 :?> obj[,]
vals.[1, 1]
请注意,返回的数组是基于1的(并且不像通常那样基于零)。索引器再次返回obj
,因此您需要将值转换为其实际类型。根据您的工作表,这可能是浮动或字符串:
let firstTitle = vals.[1, 1] :?> string
let firstValue = vals.[2, 1] :?> float
(假设您在A1中有一个标题,在A2中有一个数字)