Excel前缀公式F#

我有一个简单的Excel电子表格,其中每个单元格不包含任何内容,值或表单的简单2参数公式:

函数(单元格,单元格)(例如单元格A3可能具有公式“= A1 + A2”)

我想能够使用F#打开一个Excel文件,并为任何单元格获取:

1 – null(因为单元格没有值,也没有公式)

2 – 十进制或string(对于一个值)

3 – 第一个值是函数(例如“+”,元组的第二和第三部分是单元格名称(例如“A1”和“A2”))的元组(string,stringstring)

所以:Get(“A1”)和Get(“A2”)都会返回一个double,但是Get(“A3”)会返回一个元组(“+”,“A1”,“A2”)

我将如何在F#中执行此操作?

一旦你得到一个工作表对象的引用(在启动excel并用你的数据打开这个文件之后),你可以使用Range成员来获得一个指定的单元格。 然后你可以使用Value2属性来获得一个值(例如string/双),这也返回一个公式的结果。 要获得公式,可以使用Formula成员。

我没有find任何testing值是否自动计算的好方法,但可以检查Formula值是否以=字符开头。 如果你真的只需要像你所描述的那样简单的公式(没有括号等),那么简单的正则expression式就可以做到这一点:

 let reg = new Regex("=([AZ]+[0-9]+)([^A-Z0-9]+)([AZ]+[0-9]+)") let getInfo (cell:Range) = let formula = cell.Formula.ToString().Replace(" ", "") match formula.StartsWith("="), cell.Value2 with | true, _ -> let g = reg.Match(formula).Groups Formula(g.Item(1),g.Item(2),g.Item(3)) | :? float as n -> Float(n) | :? string as s -> String(s) | _ -> Empty 

这将返回以下数据types的值,它涵盖了所有的情况:

 type CellInfo = | Empty | Float of float | String of string | Formula of string * string * string 

顺便说一句:要加载F#交互式的Excel,你需要这样的事情:

 #r "Microsoft.Office.Interop.Excel.dll" // Run Excel as a visible application let app = new ApplicationClass(Visible = true) // Create new file using the default template let workbook = app.Workbooks.Add(XlWBATemplate.xlWBATWorksheet) // Get the first worksheet let worksheet = (workbook.Worksheets.[1] :?> _Worksheet) 

这真的给了我一个想法,我试图使用FsLex / FsYacc处理您的Excel单元格。 这可能不是你所想象的,但可能是有用的,也不是很大。 基本上,我写的代码运行如下:

 let teststrings = [ "1002"; "=SUM(B2:B12)"; "=A1+AVERAGE(B2:B4)"; "=B3+G7"; "=MIN(MEAN(A3:A20))"; "=A1+B4*C6" ]; teststrings |> List.iter (fun s -> (convert s |> printfn "%A" s)) 

和输出看起来像

(+,A1,(AVERAGE,(RANGE,B2,B4)))“”(+,B3,G7)“”(MIN,(MEAN ,(RANGE,A3,A20)))“”(+,A1,(*,B4,C6))“

整个东西太大了,放在这个盒子里,但看看这里 。