使用F#自动化Excel 2010

时间:2011-01-22 14:46:30

标签: visual-studio visual-studio-2010 excel f# excel-2010

我一直在寻找常见问题解答告诉我如何打开Excel工作簿/工作表以及如何在完成后保存文件。

我注意到在大多数常见问题解答和我在F#上购买的所有书籍都展示了如何创建新的工作簿/工作表,但从未显示如何打开或保存它。

作为F#的新手,如果有人能给我一个答案或者几个指针,我会非常感激吗?

更新

为什么F#而不是C#或VB?

我很高兴地说,尽管是新手(除了Forth,VBA和Excel 2003,2007& 2010和Visual Basic),我可以在VB,VBA和& C#因为我已经在医疗方面退休了,不幸的是我手上有足够的时间,我喜欢不断设置自己的挑战,让我的小灰细胞保持活跃,成为尝试新语言的傻瓜......好吧! / p>

F#现在是Visual Studio 2010的一个整体部分所以我想 - 为什么不呢。考虑一下 - 如果我们不愿意使用或至少尝试一种新语言 - 我总是会怀疑我是否可能更喜欢VBA,VB,C#.....如果你从另一个角度看它如果没有人会使用它 - 为什么要在第一时间创建它?我想你可以说洞穴男人是不是通过两根棍子一起练习和制造火 - 我们现在在哪里,会发明匹配?

虽然一个完整的答案会很好,但我更喜欢一些指示,以保持我的挑战。

最后但并非最不重要 - 谢谢你不厌其烦地回应!

2 个答案:

答案 0 :(得分:3)

我不认为它们是Office的特定F#库,因此您将使用与VB.NET / C#中使用的完全相同的.NET库。 F#是一种.NET语言,所以在C#中可以完成的任何事情都可以在F#中完成(但你可能已经知道了:))。 API调用将完全相同,只是它们将使用F#语法而不是VB / C#语言完成。例如,看起来像这样的东西

public void SaveMyWorkbook() {
    string filePath = @"C:\failworkbooks\catfail.xlsx";
    workbook.Save(filepath);
}

将以F#表示为

let filePath = "C:\\failworkbooks\\catfail.xlsx";

let saveWorkbook() = workbook.Save(filePath) |> ignore //if the Save method return something

现在,您将很快意识到,API并非完全旨在从功能语言中轻松使用。它可以完成,但特别是这个任务更适合C#/ VB.NET。

如果你真的想要享受F#,我建议你在它的力量真正显示的领域使用。我的个人经验是,当涉及到大量数学时,功能语言非常棒。如果你想在你的应用程序中轻松引入并行性(因为F#代码通常没有副作用),这也是非常了不起的。因此,任何需要对大量数据进行数据处理的事情都是完美的。但是对于主要包括将一堆API调用放在一个外部库中的任务,F#就是一种meh。你可以说F#有点像图形卡编程语言,而C#是一种通用的CPU编程语言。使用C#可以很好地运行,但是在F#上运行得更好的东西真的更好。

但是如果你真的想要走这条路线,我的建议是尝试使用你已经知道的Office API,但是使用F#语法。如果在某些时候你真的不知道如何执行特定的任务,请在stackoverflow上用你的代码询问一个关于它的问题,并且确实想要你想做。与广泛的无所不包的问题相比,这些问题得到的回答非常快,所以你不会等待很长时间。 (程序员似乎喜欢具体答案的精确问题^^)

我希望它有所帮助。

答案 1 :(得分:1)

我发现这个http://iouri-khramtsov.blogspot.co.uk/2011/12/automating-excel-with-f.html有用的建议。简而言之,你会使用这样的东西:

#r "Microsoft.Office.Interop.Excel"  // Assuming it's a script

let excel = ApplicationClass(Visible = true)

let openFileName = @"C:\MyDir\MyFilenameToOpen.xls"
excel.Workbooks.Open(openFileName)

// Do stuff

let savedFileName = @"C:\MyDir\MyFilename.xls"
workbook.SaveAs(savedFileName)

在Excel中使用F#似乎很自然。

在Excel中获得结果需要使用多个不可变值,每个值都由公式驱动。 Excel有一个出色的用户界面,一个可爱的世界模型 - 我喜欢行,列和单元格 - 但自动化或自定义的东西需要宏。为什么在使用F#时学习这个?公式和不可变值是其设计的基础。

理想情况下,您也可以在F#中自己编写公式作为用户定义函数(UDF) - 请参阅http://excel-dna.net/。然后,也许,你想用对象/类型做一些有趣的事情 - 寻找“github com mndrake ExcelObjectHandler”(我没有足够的声誉发布第三个链接)。

杰克