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))“
整个东西太大了,放在这个盒子里,但看看这里 。
- “Microsoft.ACE.OLEDB.12.0”提供程序未在本地计算机上注册“将xlsx导入到sql server时出错
- 从Excel VBA发送电子邮件 – 名称未被识别
- 手动打开Excel文件允许公式运行,用VBScript或PowerShell或Python的win32com打开excel文件不会
- 将richtextstring转换为excel
- 用作从代码调用的计算引擎的Microsoft Excel电子表格
- 试图find一个基于值的单元格,然后使用单元格(列)位置作为我公式的一部分
- 对于每个循环的反向顺序
- 无法运行macros。 macros在此工作簿中可能不可用
- 将一列中的Excel单元格中的某个string复制到另一列中