簡體   English   中英

Excel前綴公式F#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM