如何获取默认Excel工作表字体?

如何获取默认Excel工作表字体?,excel,ms-office,office-interop,vba,Excel,Ms Office,Office Interop,Vba,我们在C#中有Excel 2013-2016外接程序。我们使用以下方法: 在用户更改某个特定单元格的字体之前,一切都正常。例如,用户更改单元格A1并设置字体“Arial”。默认情况下,我们有字体“Calibri”。 此后,当我们试图通过工作表.Cells.font获取默认字体时,我们什么也得不到——只有空对象。我假设由于歧义:A1有字体“Arial”,其他单元格-默认字体“Calibri”。我的目标是获得默认字体,即“Calibri”。 到目前为止,我重新编写了代码,现在我也检查了样式: var

我们在C#中有Excel 2013-2016外接程序。我们使用以下方法:

在用户更改某个特定单元格的字体之前,一切都正常。例如,用户更改单元格A1并设置字体“Arial”。默认情况下,我们有字体“Calibri”。 此后,当我们试图通过
工作表.Cells.font
获取默认字体时,我们什么也得不到——只有空对象。我假设由于歧义:A1有字体“Arial”,其他单元格-默认字体“Calibri”。我的目标是获得默认字体,即“Calibri”。 到目前为止,我重新编写了代码,现在我也检查了样式:

var workbookFont = Microsoft.Office.Interop.Excel.Worksheet.Parent.Styles["Normal"].Font;
这个解决方法返回的正是我需要的——我的“Calibri”字体。但后来我发现,这是因为这种字体是所有新工作表/工作簿的默认字体(可以在Excel的选项中设置)。若用户选择了工作表中的所有单元格,并将默认字体更改为“Times New Roman”,那个么我将得到“Calibri”,因为这是创建新工作表/工作簿后将使用的默认字体。当我无法获得当前工作表的实际默认字体时,我再次面临这个问题。我的下一个想法是在工作表的边缘获得一些特定单元格的字体,这些字体对于用户来说用处不大,比如:

var defaultFont = workSheet.Cells[1048576][16384].Font

这看起来很奇怪,但很管用。我假设用户不使用工作表上的最后一个单元格。(1048576和16384分别为)。我不知道这些方法的含义,所以我想知道是否存在一些“合法”的方法来获得工作表的默认字体,而不需要这样的拐杖

使用以下命令时,您的路径是正确的:

var workbookFont = Microsoft.Office.Interop.Excel.Worksheet.Parent.Styles["Normal"].Font;
Normal
样式是工作表的默认字体,但工作表可能实际上没有默认字体(或
Normal
样式)的任何实例,或者,使用
Normal
样式装饰的所有单元格都可能在每个单元格格式上覆盖了该字体

如果用户将自己的字体应用于不同的范围,那么工作表中可能会有许多字体,并且这些字体都不能保证与
正常
样式中的字体相同。
Font.Name
在一张工作表中可能不同,在这种情况下
Font.Name
返回
null
,即使
Font.Size
可能是一致的(或者如果不一致,那么它也返回
null

当用户将自定义字体应用于已具有
Normal
样式的范围时,
style
将与该范围保持关联,并且该字体将覆盖该样式中定义的任何字体

此外,在更改
UsedRange
字体时,通常会选择工作表上的所有单元格(以便按比例调整行高),即使
UsedRange
只是所有
单元格的一小部分

因此,您必须选择一种代表工作表中使用的字体的字体,或者将字体应用于新范围,就像它们是
普通的
。该选择应根据您对工作表的了解以及您打算如何使用字体来确定:

  • 如果您要插入一列或一行,那么我建议您模仿Excel的行为并使用相邻的格式

  • 如果要添加与
    UsedRange
    不相邻的新范围,则可能需要默认为
    Normal
    样式

  • 如果您正在寻找具有代表性的
    UsedRange
    ,您可能希望避免使用前几行和前几列,因为它们往往是标题,最后几行有时可能是总计。您需要在范围内的单元格上循环,以找到合适的单元格格式

  • 如果要以其他格式复制工作表内容,则需要检查每个单元格的字体以及
    UsedRange
    中的每个单元格

最右下角的单元格不一定与
Normal
UsedRange
中使用的字体相似,因此我建议不要使用它

var workbookFont = Microsoft.Office.Interop.Excel.Worksheet.Parent.Styles["Normal"].Font;