如何获取默认Excel工作表字体?
我们在C#中有Excel 2013-2016外接程序。我们使用以下方法: 在用户更改某个特定单元格的字体之前,一切都正常。例如,用户更改单元格A1并设置字体“Arial”。默认情况下,我们有字体“Calibri”。 此后,当我们试图通过如何获取默认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
工作表.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;