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

时间:2016-09-15 11:02:21

标签: excel excel-vba ms-office office-interop vba

我们在C#中使用Excel 2013-2016加载项。我们使用以下方法get worksheet font

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是max size of worksheet)。我不知道这些方法的含义,所以我想知道它是否存在一些“合法”的方式来获取工作表的默认字体,没有这样的拐杖?

1 个答案:

答案 0 :(得分:0)

使用时你走的是正确的道路:

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

Normal样式工作表的默认字体,但工作表实际上可能没有默认字体(或Normal样式)的任何实例,或者,所有使用Normal样式修饰的单元格都可能在每种单元格格式上覆盖了字体。

如果用户将自己的字体应用于各种范围,则该工作表可能会包含多种字体,并且 none 保证与字体相同以Normal风格。 Font.Name在工作表中可能会有所不同,在这种情况下,Font.Name会返回null,即使Font.Size可能一致(或者如果不一致,那么它也会返回null)。

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

此外,通常的做法是在更改UsedRange的字体时选择所有表格中的单元格(以便按比例调整行高),即使{{ 1}}只是所有UsedRange的一小部分。

因此,您必须选择工作表中使用的字体的代表性字体,或将字体应用于新范围,就像它们是Cells一样。这个选择应该通过你对表格的了解以及你打算用字体做什么来告知:

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

  • 如果您要添加的新范围与Normal不相邻,那么可能希望默认使用UsedRange样式。< / p>

  • 如果您正在寻找Normal的代表字体,您可能希望避免前几行和列,因为它们往往是标题,最后一行有时可以是总计。您需要遍历范围内的单元格以找到合适的单元格格式。

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

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