Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Excel互操作设置列宽?_Excel_F#_Excel Interop - Fatal编程技术网

如何使用Excel互操作设置列宽?

如何使用Excel互操作设置列宽?,excel,f#,excel-interop,Excel,F#,Excel Interop,我使用Microsoft.Office.Interop.Excel库成功地写入Excel范围,设置字体颜色等。有一件事我做不到:设置列宽。找不到特定于F#的文档,而修改我为C#找到的内容似乎不起作用。例如,此代码无效: worksheet.Columns.AutoFit() 这行代码甚至不编译: worksheet.Columns.[1].Columnwidth <- 15.0 工作表.Columns.[1].Columnwidth首先,在的帮助下,从F#使用Excel要容易得多 然而

我使用
Microsoft.Office.Interop.Excel
库成功地写入
Excel
范围,设置字体颜色等。有一件事我做不到:设置列宽。找不到特定于F#的文档,而修改我为C#找到的内容似乎不起作用。例如,此代码无效:

worksheet.Columns.AutoFit()
这行代码甚至不编译:

worksheet.Columns.[1].Columnwidth <- 15.0

工作表.Columns.[1].Columnwidth首先,在的帮助下,从F#使用Excel要容易得多

然而,考虑到处理F#的复杂性,使用裸Excel操作并不是一件太复杂的事情

由于您没有提供足够的详细信息来指出您自己的尝试到底出了什么问题,下面是一个自包含的片段,演示如何使用工作表列宽进行操作,包括可视化演示:

#r "Microsoft.Office.Interop.Excel"
open Microsoft.Office.Interop.Excel
open System
let ex = new ApplicationClass(Visible=true)
let exO = ex.Workbooks.Add()
let exOWs = exO.Worksheets.[1] :?> Worksheet
exOWs.Name <- "TestSheet"
let col1 = exOWs.Columns.[1] :?> Range
let oldW = col1.ColumnWidth |> unbox
printfn "Current width of column 1 is %f" oldW
col1.ColumnWidth <- 15.0
let newW = col1.ColumnWidth |> unbox
printfn "New width of column 1 is %f" newW
printfn "Press any key to exit"
Console.ReadLine() |> ignore
exO.Close(false, false, Type.Missing)
ex.Quit()
在停止脚本之前,您可能希望找到打开的Excel应用程序窗口,并观察第一列的宽度是否确实发生了变化

更新:涵盖原始问题的
Autofit
部分:需要认识的重要小贴士是,只有在填充范围后才能对范围的单元格宽度和高度进行拟合。将
Autofit()
应用于空范围是没有用的,而对于已填充的范围,它会按预期工作

让我们用不同长度的字符串填充示例工作表第1行的前4列,然后通过在显示
newW
值的行后放置以下内容来应用
Autofit

let rowContents = "Our widths are flexible".Split(' ') in
    (exOWs.Rows.[1] :?> Range).Resize(ColumnSize=rowContents.Length).Value2 <- rowContents
exOWs.Columns.AutoFit() |> ignore
let rowContents=“我们的宽度是灵活的”。在
(exOWs.Rows.[1]:?>范围)。调整大小(ColumnSize=rowContents.Length)。值2忽略
并观察视觉效果:

非常感谢。我会调查的。我不知道我必须向下转换到
范围
。有没有办法根据内容自动调整列宽?更一般地说,有没有一个地方可以让我更多地了解F#和Interop?@Soldalma我在回答中添加了列宽自动调整的说明。至于
F#和一般的互操作
——对我来说,它关注的是更有趣的方面,比如in,而不是在F#中完成的低级Excel自动化。如果我使用VB或C#而不是F#,则不会有太大区别,只需考虑某些F#的细节,如调用接口上的方法、转换为静态类型等。再次感谢。为了好玩和赚钱,我在《代码》杂志上读了很多文章,但我并不知道这篇文章。顺便说一句,我也读(买)了你的书。干得好!我非常感谢您的支持。我看了一下ExcelProvider的示例,所有这些示例都从电子表格中获得了价值。在任何情况下,都不能在电子表格中设置值或设置列宽等属性。根据我与其他类型提供程序的经验,它们只能用于从源获取数据。我这么想是不是错了?
let rowContents = "Our widths are flexible".Split(' ') in
    (exOWs.Rows.[1] :?> Range).Resize(ColumnSize=rowContents.Length).Value2 <- rowContents
exOWs.Columns.AutoFit() |> ignore