13.5.1 将数据写到 Excel

13.5.1 将数据写到 Excel



Excel 的互操作都是标准的 。NET 程序集,我们可以在 F# Interactive 为使用 #r 指令,来引用。一旦我们这样做了,就可以使用类,运行 Excel 作为独立(可见的或不可见的)的应用程序,以及写脚本。清单 13.18 显示如何启动 Excel,创建一个新工作簿,有一个工作表,并在这个工作表中写入数据。



Listing 13.18 Starting Excel and creating worksheet (F#)



#r "office.dll"
#r "Microsoft.Office.Interop.Excel.dll"
open System
open Microsoft.Office.Interop.Excel

let app = new ApplicationClass(Visible = true)
let workbook = app.Workbooks.Add(XlWBATemplate.xlWBATWorksheet)
let worksheet = (workbook.Worksheets.[1] :?> _Worksheet)

worksheet.Range("C2").Value2 <- "1990"
worksheet.Range("C2", "E2").Value2 <- [| "1990"; "2000"; "2005" |]



在清单 13.18,我们创建了 ApplicationClass 类的一个新实例。这个类型来自 Excel 命名空间,表示应用程序。运行这行以后,应该显示一个新的 Excel 窗口。下一行创建一个工作簿,所以,运行以后,应该看到平常的 Excel 网格。下一行,我们获取一个对象,表示工作簿中的第一个工作表(工作表显示在应用程序左下角)。可以看到,我们需要把这个对象强制转换为 Worksheet 类,因为 Excel API 在很多地方是弱类型的。一旦我们得到这个工作表,就可以开始将数据写入网格。这可以使用 Range 索引器和 Value2 属性完成。此属性的类型是object,所以,可以用各种方式使用它。第一个示例将一个字符串值写到一列,第二个用来自 .NET 数组中的值填充一个范围 (一行三列)。净的。在图 13.1 中可以看到,运行代码后创建的 Excel 工作表。


13.5.1 将数据写到 Excel
图 13.1 从 F# Interactive 中启动Excel 应用程序,以编程方式输入数据。



到目前为止,我们已经创建想要显示的表头,因此,下一步是最重要的,用所有剩余的信息填充,即,包含不同年份的森林面积的矩阵。清单 13.19 将数据转换成一个二维数组,这也是Value2 属性的一个有效的数据源。



Listing 13.19 Exporting data to Excel worksheet (F#)



let statsArray = stats |> Array.ofSeq
let names = Array2D.init statsArray.Length 1 (fun index _ –>
let name, _ = statsArray.[index]
name )

let dataArray = Array2D.init statsArray.Length 3 (fun index year –>
let _, values = statsArray.[index]
let yearValue = values.[year]
yearValue / 1000000.0 )

let endColumn = string(statsArray.Length + 2)

worksheet.Range("B3", "B" + endColumn).Value2 <- namesVert
worksheet.Range("C3", "E" + endColumn).Value2 <- tableArr



当数据写入到 Excel 工作表时,可以使用基元值、数组或二维数组。一维数组可用于写入的数据行,像我们在第一个示例中看到的,但如果我们想要用数据填充一个矩阵或一列,必须使用二维数组。在清单 13.19 中,我们首先创建一个二维数组,来保存垂直的地区名。为此,创建一个简单的数组,包含名称,然后,使用 Array2D.init 函数,将其转换为二维数组。init 函数取数组的宽和高作为前两个参数值,跟着一个函数,运行为每个坐标生成一个值。生成的数组仅包含一个列,所以,在初始化过程中,可以忽略第二个坐标。

下一步是用地区数据生成二维数组。将输入序列转换成一个数组,当再次使用 Array2D.init 函数生成二维数组时,以便可以索引它。在 lambda 函数中,每个数组的单元格都执行,我们首先获得有关该地区的信息,然后,找到指定年份的值,把它除以 100 万,以更可读的形式显示输出。最后,我们计算 Excel 工作表中的右边范围(取决于地区的数量) ,并使用前面示例中相同的方法,设置数据。

运行这段代码之后,数据应该出现在 Excel 中。我们可以使用它,在我们执行 F# 脚本的同时,因此,如果调整刚生成的表设计,将看到类似于图 13.2。

现在,我们在 Excel 中,了解数据要容易得多。我们可以迈出另一步,用数据创建图表。你可以手工做到,但是,生成一个完整的 Excel 文件,其中包含图表,在 F# 中是很容易的。


13.5.1 将数据写到 Excel
图 13.2 由我们的 F# 脚本生成的 Excel 表格,显示在过去 20 年里,世界各地森林覆盖的面积的变化。