2016-09-15 120 views
2

我們在C#中有Excel 2013-2016加載項。我們用下面的方法來get worksheet font如何獲取默認的Excel工作表字體?

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; 

此解決方案將返回正是我需要的 - 我的「宋體」字體。但後來我發現,這是因爲該字體是所有新工作表/工作簿的默認字體(可以在Excel的選項中進行設置)。如果用戶選擇工作表中的所有單元格並將默認字體更改爲「Times New Roman」,那麼它將不起作用,那麼我將得到「Calibri」 - 因爲這是默認字體將在創建新工作表/工作簿時使用。當我無法獲取當前工作表的實際默認字體時,我又遇到了問題。我的下一個想法是在工作表的邊緣,是不是用戶像很多可用來獲得一些特定的細胞的字體:

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

它看起來很奇怪,但很有效。我假設用戶不使用工作表上的最後一個單元格。 (1048576和16384是max size of worksheet)。我不知道這些方法的含義,所以我想知道它是否存在一些「合法」的方式來獲取工作表的默認字體,沒有這樣的柺杖?

回答

0

您使用時是在正確的道路上:

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使用的字體任何或多或少相似的,所以我建議不要使用它。