将deedle框架复制到excel

NoI*_*his 3 excel f# deedle

我的目标是有效地将一个deedle框架复制到F#中.我从未使用过F#的excel.我受到了本教程的启发.

这是我的代码:

#r "Microsoft.Office.Interop.Excel"
open Microsoft.Office.Interop.Excel
/// Export data frame to excel
let exportFrameToExcel (frame: Frame<DateTime, string>) (x,y) = 
    // Run Excel as a visible application
    let app = new ApplicationClass(Visible = true) 
    // Create new file and get the first worksheet
    let workbook = app.Workbooks.Add(XlWBATemplate.xlWBATWorksheet) 
    // Note that worksheets are indexed from one instead of zero
    let worksheet = (workbook.Worksheets.[1] :?> Worksheet) 

    let mutable col = y+1
    for key in frame.ColumnKeys do
        worksheet.Cells.[x, col] <- key
        col <- col + 1
    for i = 0 to frame.RowCount-1 do
        let row = frame.GetRowAt(i)
        let rowKey = frame.GetRowKeyAt(i)
        worksheet.Cells.[i+x+1, y] <- rowKey
        for j = 0 to frame.ColumnCount-1 do
            let value = row.GetAtAs<float>(j)
            worksheet.Cells.[i+x+1, j+y+1] <- value
Run Code Online (Sandbox Code Playgroud)

如果我在复制数据时触摸excel窗口,它会很慢并且可能会崩溃.我确信还有很大的改进空间,例如我认为ApplicationClass应该visible只在数据被复制时转向.

我将非常感谢以有效和惯用的方式完成这项任务的一些指导/帮助.谢谢.

Tom*_*cek 5

在BlueMountain(我们在Deedle上做了大部分工作),他们实际上有一个用于将数据传递给Excel的实用程序.我们想在Deedle中包含它,但从未设法发布它,因为它需要一些时间来完善和记录事物.

我们实际上将源代码放在GitHub上(作为我的一个演示会话的一部分),所以你可以在这里得到它.
使用它,你应该能够写:

xl?A1 <- deedleFrame
Run Code Online (Sandbox Code Playgroud)

你可以做更多的事情 - 看看这个Xl类型的成员.

另外,我们最初使用的是NetOffice,这是一个更容易使用的Excel COM互操作包装器 - 引用的示例没有使用它,但它可能是一个好主意.