.NET 4.0的F#和Excel集成(Visual Studio 2010 Beta 1)

时间:2022-04-30 17:36:14

Can anyone give a web link to or demonstrate here how to do F# and Excel integration using .NET 4.0 (Visual Studio 2010 Beta 1)?

任何人都可以提供Web链接或在此演示如何使用.NET 4.0(Visual Studio 2010 Beta 1)进行F#和Excel集成?

I know how to do this in the CTP release but as far as I know it should be simpler in .NET 4.0 (Visual Studio 2010 Beta 1).

我知道如何在CTP版本中执行此操作,但据我所知,它应该在.NET 4.0(Visual Studio 2010 Beta 1)中更简单。

2 个解决方案

#1


12  

There is no 'secret sauce' added to the latest F# CTP release (Visual Studio 2010 Beta1) to improve Office interop. Perhaps you have F# confused with C#'s new support for Dynamic.

最新的F#CTP版本(Visual Studio 2010 Beta1)没有添加“秘密酱”来改进Office互操作。也许你把F#与C#对Dynamic的新支持混淆了。

However, Office interop in F# is the same as C# - you can use the native COM APIs or the newer, managed Visual Studio Tools for Office (VSTO) libraries. Unfortunately F# doesn't have the UI-designers for creating VSTO add-ins like C#, so the simplest way to do Office interop is to use the COM APIs.

但是,F#中的Office互操作与C#相同 - 您可以使用本机COM API或较新的托管Visual Studio Tools for Office(VSTO)库。不幸的是,F#没有用于创建像C#这样的VSTO加载项的UI设计器,因此执行Office互操作的最简单方法是使用COM API。

The following snippet creates an Excel worksheet with information about the pictures in your My Pictures folder:

以下代码段创建一个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)

#2


1  

Simply write an empty VSTO shell and then create F# assembly DLLs and use it. I am always using excellent VS2010 designers and then link it to F# DLLs and you will get the best from both worlds....

只需编写一个空的VSTO shell,然后创建F#汇编DLL并使用它。我总是使用优秀的VS2010设计师,然后将它链接到F#DLLs,你将从这两个世界中获得最好的....

#1


12  

There is no 'secret sauce' added to the latest F# CTP release (Visual Studio 2010 Beta1) to improve Office interop. Perhaps you have F# confused with C#'s new support for Dynamic.

最新的F#CTP版本(Visual Studio 2010 Beta1)没有添加“秘密酱”来改进Office互操作。也许你把F#与C#对Dynamic的新支持混淆了。

However, Office interop in F# is the same as C# - you can use the native COM APIs or the newer, managed Visual Studio Tools for Office (VSTO) libraries. Unfortunately F# doesn't have the UI-designers for creating VSTO add-ins like C#, so the simplest way to do Office interop is to use the COM APIs.

但是,F#中的Office互操作与C#相同 - 您可以使用本机COM API或较新的托管Visual Studio Tools for Office(VSTO)库。不幸的是,F#没有用于创建像C#这样的VSTO加载项的UI设计器,因此执行Office互操作的最简单方法是使用COM API。

The following snippet creates an Excel worksheet with information about the pictures in your My Pictures folder:

以下代码段创建一个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)

#2


1  

Simply write an empty VSTO shell and then create F# assembly DLLs and use it. I am always using excellent VS2010 designers and then link it to F# DLLs and you will get the best from both worlds....

只需编写一个空的VSTO shell,然后创建F#汇编DLL并使用它。我总是使用优秀的VS2010设计师,然后将它链接到F#DLLs,你将从这两个世界中获得最好的....