[英]Excel prefix formula F#
我有一個簡單的Excel電子表格,其中每個單元格都不包含任何內容,一個值或以下形式的簡單2參數公式:
Function(Cell,Cell),(例如,單元格A3可能具有公式“ = A1 + A2”)
我希望能夠使用F#打開Excel文件,並獲取任何單元格的內容:
1-空(因為該單元格沒有值,也沒有公式)
2-十進制或字符串(用於值)
3-(字符串,字符串字符串)的元組,其中第一個值是函數(例如“ +”,元組的第二和第三部分是單元格名稱(例如“ A1”和“ A2”))
因此:Get(“ A1”)和Get(“ A2”)都將返回一個double,但是Get(“ A3”)將返回一個元組(“ +”,“ A1”,“ A2”)
我將如何在F#中執行此操作?
一旦獲得對工作表對象的引用(啟動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)
這確實給了我一個主意,我嘗試使用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)“”((最小,(RANGE,A3,A20)))“”((+,A1,(*,B4,C6))“”
整個東西太大了,無法放入此盒子,但在這里看看。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.