Интеграция F # и Excel для .NET 4.0 (Visual Studio 2010 Beta 1) - PullRequest
3 голосов
/ 31 июля 2009

Может ли кто-нибудь дать веб-ссылку или продемонстрировать здесь, как выполнить интеграцию F # и Excel с использованием .NET 4.0 (Visual Studio 2010 Beta 1)?

Я знаю, как это сделать в выпуске CTP, но насколько я знаю, в .NET 4.0 должно быть проще (Visual Studio 2010 Beta 1).

Ответы [ 2 ]

12 голосов
/ 31 июля 2009

В последний выпуск FTP CTP (Visual Studio 2010 Beta1) для улучшения взаимодействия с Office не добавлен «секретный соус». Возможно, вы перепутали F # с новой поддержкой C # для Dynamic .

Однако взаимодействие Office в F # такое же, как в C # - вы можете использовать собственные API-интерфейсы COM или более новые управляемые библиотеки Visual Studio Tools for Office (VSTO). К сожалению, F # не имеет UI-дизайнеров для создания надстроек VSTO, таких как C #, поэтому самый простой способ взаимодействия с Office - это использование COM API.

Следующий фрагмент создает лист Excel с информацией о изображениях в папке «Мои рисунки»:

#r "Microsoft.Office.Interop.Excel"

open System
open System.IO
open System.Reflection
open Microsoft.Office.Interop.Excel


let app = ApplicationClass(Visible = true)


let sheet = app.Workbooks
               .Add()
               .Worksheets.[1] :?> _Worksheet


let setCellText (x : int) (y : int) (text : string) = 
    let range = sprintf "%c%d" (char (x + int 'A')) (y+1)
    sheet.Range(range).Value(Missing.Value) <- text


let printCsvToExcel rowIdx (csvText : string) =
    csvText.Split([| ',' |])
    |> Array.iteri (fun partIdx partText -> setCellText partIdx rowIdx partText)


let rec filesUnderFolder basePath = 
    seq {
        yield! Directory.GetFiles(basePath)
        for subFolder in Directory.GetDirectories(basePath) do
            yield! filesUnderFolder subFolder 
    }


// Print header
printCsvToExcel 0 "Directory, Filename, Size, Creation Time"


// Print rows
filesUnderFolder (Environment.GetFolderPath(Environment.SpecialFolder.MyPictures))
|> Seq.map (fun filename -> new FileInfo(filename))
|> Seq.map (fun fileInfo -> sprintf "%s, %s, %d, %s" 
                                fileInfo.DirectoryName 
                                fileInfo.Name 
                                fileInfo.Length 
                                (fileInfo.CreationTime.ToShortDateString()))
|> Seq.iteri (fun idx str -> printCsvToExcel (idx + 1) str)
1 голос
/ 18 апреля 2011

Просто напишите пустую оболочку VSTO, а затем создайте библиотеки сборки F # и используйте ее. Я всегда использую отличных дизайнеров VS2010, а затем связываю их с F # DLL, и вы получите лучшее из обоих миров ....

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