如何使用 Excel Interop 设置列宽?
How does one set column width with Excel Interop?
我使用 Microsoft.Office.Interop.Excel
库成功写入 Excel
范围、设置字体颜色等。我无法做的一件事:设置列宽。无法找到特定于 F# 的文档并且调整我为 C# 找到的内容似乎不起作用。例如,这段代码没有效果:
worksheet.Columns.AutoFit()
这行代码甚至无法编译:
worksheet.Columns.[1].Columnwidth <- 15.0
有什么建议吗?
首先,在 ExcelProvider.
的帮助下,在 F# 中使用 Excel 会容易得多
但是,如果您意识到从 F# 处理 COM 的复杂性,使用裸 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 的盒子上使用 FSI
的上述 fsx
脚本应该产生类似于以下的输出:
--> Referenced 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Visual Studio Tools for Office\PIA\Office15\Microsoft.Office.Interop.Excel.dll'
Current width of column 1 is 8.430000
New width of column 1 is 15.000000
Press any key to exit
在停止脚本之前,您可能需要找到打开的 Excel 应用程序 window 并观察第一列宽度是否真的发生了变化。
更新: 涵盖原始问题的 Autofit
部分:需要认识到的重要信息是范围的单元格宽度和高度的拟合只能完成 after 范围被填满。将 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
并观察视觉效果:
我使用 Microsoft.Office.Interop.Excel
库成功写入 Excel
范围、设置字体颜色等。我无法做的一件事:设置列宽。无法找到特定于 F# 的文档并且调整我为 C# 找到的内容似乎不起作用。例如,这段代码没有效果:
worksheet.Columns.AutoFit()
这行代码甚至无法编译:
worksheet.Columns.[1].Columnwidth <- 15.0
有什么建议吗?
首先,在 ExcelProvider.
的帮助下,在 F# 中使用 Excel 会容易得多但是,如果您意识到从 F# 处理 COM 的复杂性,使用裸 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 的盒子上使用 FSI
的上述 fsx
脚本应该产生类似于以下的输出:
--> Referenced 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Visual Studio Tools for Office\PIA\Office15\Microsoft.Office.Interop.Excel.dll' Current width of column 1 is 8.430000 New width of column 1 is 15.000000 Press any key to exit
在停止脚本之前,您可能需要找到打开的 Excel 应用程序 window 并观察第一列宽度是否真的发生了变化。
更新: 涵盖原始问题的 Autofit
部分:需要认识到的重要信息是范围的单元格宽度和高度的拟合只能完成 after 范围被填满。将 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
并观察视觉效果: