f # чтение файла xls - как разобрать объект value2 - PullRequest
6 голосов
/ 17 мая 2011

Я пытался использовать 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

Проблема в том, как я могу разобрать значения в тип F #?в fsx.exe значения отображаются как

'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

спасибо,

1 Ответ

3 голосов
/ 17 мая 2011

Тип Value2 равен obj. Если диапазон представляет только одну ячейку, фактическим типом будет некоторый примитивный тип (int, float, decimal, string). Если диапазон представляет несколько ячеек (ваш случай), то возвращаемое значение представляет собой двумерный массив .NET типа obj[,].

Вы можете привести значение, возвращаемое 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...