2009-07-31 104 views

回答

12

为了提高Office互操作性,最新的F#CTP版本(Visual Studio 2010 Beta1)没有添加“秘密酱油”。也许你有F#与C#'s new support for Dynamic混淆。

但是,F#中的Office interop与C#相同 - 您可以使用本机COM API或更新的托管的Visual Studio Tools for Office(VSTO)库。不幸的是,F#没有用于创建像C#这样的VSTO加载项的UI设计器,因此执行Office interop最简单的方法就是使用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) 
+2

嗨克里斯,这是疯了。我只是通过Dom Syme观看这段视频http://channel9.msdn.com/Blogs/David+Gristwood/An-F-Tutorial-with-Don-Syme-2-of-4他在那里用F# 。我觉得那很酷。能够将Excel作为前端拍打,只会让人头晕目眩。谢谢! – gjvdkamp 2011-04-12 20:11:21

1

只需写写空VSTO壳,然后创建F#集DLL并使用它。我总是使用优秀的VS2010设计师,然后将其链接到F#DLL,你将得到最好的两个世界....

相关问题