我们在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)。我不知道这些方法的含义,所以我想知道它是否存在一些“合法”的方式来获取工作表的默认字体,没有这样的拐杖?
答案 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
中每个单元格和每个单元格的字体。
最右下角的单元格不一定与UsedRange
或Normal
中使用的字体或多或少相似,所以我建议不要使用它。