Excel前缀公式F#

时间:2010-09-14 01:10:08

标签: excel f#

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

  

功能(细胞,细胞),(例如细胞A3可能具有公式“= A1 + A2”)

我希望能够使用F#和任何单元格打开Excel文件:

1 - null(因为单元格没有值且没有公式)

2 - 十进制或字符串(对于值)

3 - (字符串,字符串字符串)的元组,其中第一个值是函数 (例如“+”和元组的第2和第3部分是单元名称(例如“A1”和“A2”)

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

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

2 个答案:

答案 0 :(得分:4)

获得对工作表对象的引用(在启动excel并使用您的数据打开文件后),您可以使用Range成员获取指定的单元格。然后,您可以使用Value2属性来获取值(例如字符串/双精度),这也会返回公式的结果。要获得公式,您可以使用Formula成员。

我没有找到任何测试值是否自动计算的好方法,但您可以检查Formula值是否以=字符开头。如果你真的只需要像你描述的那样简单的公式(没有括号等),那么一个简单的正则表达式应该可以解决这个问题:

let reg = new Regex("=([A-Z]+[0-9]+)([^A-Z0-9]+)([A-Z]+[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

这将返回以下数据类型的值,该值涵盖您的所有情况:

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

顺便说一句:要在F#Interactive中加载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) 

答案 1 :(得分:0)

这真的给了我一个想法,我尝试使用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))

,输出看起来像

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

整个事情太大了,无法放入此框,但看看here