如何获得默认Excel工作表字体



我们在c#中有Excel 2013-2016插件。我们使用以下方法获取工作表字体:

var defaultFont = Microsoft.Office.Interop.Excel.Worksheet.Cells.Font

一切正常,直到用户改变某些特定单元格的字体。例如,用户更改单元格A1并设置字体"Arial"。默认情况下,我们有字体"Calibri"。此后,当我们尝试通过Worksheet.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样式装饰的单元格可能在每个单元格格式上都覆盖了字体。

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

当用户将自定义字体应用于已经具有Normal样式的范围时,则Style 仍然与相关联,并且该字体覆盖该样式中定义的任何字体。

此外,在更改UsedRange的字体时,通常选择所有单元格(以便行高按比例调整),即使UsedRange仅占所有Cells的一小部分。

因此,您必须选择代表工作表中使用的字体的字体,或者将字体应用于新范围,就像它们是Normal一样。这个选择应该根据你对表格的了解,以及你打算用字体做什么来决定:
  • 如果你插入一个列或行,然后我建议你模仿Excel的行为和使用相邻的格式。

  • 如果你要添加一个新的范围,不是相邻的UsedRange,那么你将可能想要默认为Normal的样式。

  • 如果您正在寻找UsedRange的代表性字体,您可能希望避免前几行和列,因为这些往往是标题,而最后几行有时可能是总数。您需要遍历区域中的单元格以找到合适的单元格格式。

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

右下角的单元格不一定与NormalUsedRange中使用的字体相似,所以我建议不要使用它。

最新更新