C#解決Excel邊框樣式無法復制及格式刷功能
問題現(xiàn)象
在運行數(shù)據表數(shù)據導出到 EXCEL 數(shù)據輸出時遇到了一個問題,開發(fā)者設計了單行細線下邊框的輸出模板,如下圖設計:

其中 <%system.excel.title.dyna.by.craneoffice%> 字符標記用于輸出報表標題替換。數(shù)據從A5列開始至D5列結束,按行輸出。期望得到如下輸出樣式:

雖然已經自定義了復制樣式的方法,包括邊框風格的復制,但實際輸出遇到了如下情況:

實際想要得到的單行細線下邊框輸出沒有實現(xiàn),使用簡單 Borders.LineStyle 賦值沒有奏效,以后輸出的行復制第一行的樣式沒有成功,因此需要調整樣式輸出策略,實現(xiàn)類似格式刷那樣的操作,這樣即實現(xiàn)了格式輸出的完整性,也保證了性能。
范例運行環(huán)境
操作系統(tǒng): Windows Server 2019 DataCenter
.net版本: .netFramework4.0 或以上
Office Excel 2016
開發(fā)工具:VS2019 C#
解決方案
剪貼板加特殊粘貼
使用 COM 操作的流程原理如下圖:

實現(xiàn)代碼,示例如下:
SRange.Copy(); //將源選定范圍復制到剪貼板 Range.PasteSpecial(Excel.XlPasteType.xlPasteFormats); //特殊粘貼格式到目標選定范圍
Copy() 方法實現(xiàn)了復制所有數(shù)據到剪貼板功能,其中也包括了樣式。 PasteSpecial() 方法實現(xiàn)了指定粘貼的功能,其中 Excel.XlPasteType.xlPasteFormats 表示只粘貼格式樣式,至此實現(xiàn)了模擬格式刷的功能。 但此方法可能會引起多 Excel 應用的復制沖突,因此相對保險的寫法可以改成如下代碼:
SRange.Copy(Range);
但這樣會有一個問題是,如果像模板輸出還好,但想要僅粘貼格式則無法實現(xiàn),因此也有局限性。而且這種實現(xiàn)原理,微軟可能也會有所調整,也無法保障以后的應用是否會引起復制沖突。所以我們在下個小節(jié)通過自定義樣式的方式來模擬格式刷的功能。
自定義樣式
使用 COM 操作的流程原理如下圖:


示例代碼如下:
string stylename = Guid.NewGuid().ToString(); WorkBook xb=WorkBooks[1]; Style newStyle = xb.Styles.Add(stylename); 設置樣式屬性 newStyle.Font.Name = "宋體"; newStyle.Font.Size = 11; newStyle.Font.Bold = true; newStyle.Borders.Weight = XlBorderWeight.xlHairline; //最細的線 newStyle.Borders.LineStyle = XlLineStyle.xlContinuous; //實線
以上是添加樣式的示例,因為樣式很多,實現(xiàn)格式復制的簡單方法,是創(chuàng)建新名稱并直接引用源單元格的樣式,應用到目標選范圍上即可,如果有需要移除或修改的樣式,可以繼續(xù)對新建樣式進行賦值,修改后如下代碼示例:
string stylename = Guid.NewGuid().ToString(); WorkBook xb=WorkBooks[1]; Style newStyle = xb.Styles.Add(stylename); newStyle = SRange.Style; //將源選定范圍樣式賦值到自定義新建樣式 newStyle.Font.Name="宋體"; //修改字體為宋體 Range.Style = newStyle.Name;
直接賦值
Range.Style 是一個 dynamic 類型,可以賦予任何可以正確實現(xiàn)的類型,如自定義樣式名稱(newStyle.Name),也可以直接賦值為 Style 類型,簡單而暴力,代碼如下:
Range.Style = SRange.Style; //將源選定范圍樣式賦值到目標
完美方案
在實際的運行中,無論是自定義樣式還是直接賦值模式,對復制字體時出現(xiàn)了無法復制的問題,因此還是需要結合自定義復制樣式方法來彌補問題,代碼如下:
public void copyRangeStyle(Excel.Range srcRange,Excel.Range desRange)
{
desRange.Font.Background=srcRange.Font.Background;
desRange.Font.Bold=srcRange.Font.Bold;
desRange.Font.Color=srcRange.Font.Color;
desRange.Font.Italic=srcRange.Font.Italic;
desRange.Font.Name=srcRange.Font.Name;
desRange.Font.OutlineFont=srcRange.Font.OutlineFont;
desRange.Font.Shadow=srcRange.Font.Shadow;
desRange.Font.Size=srcRange.Font.Size;
desRange.Font.Strikethrough=srcRange.Font.Strikethrough;
desRange.Font.Underline=srcRange.Font.Underline;
desRange.RowHeight=srcRange.RowHeight;
desRange.HorizontalAlignment=srcRange.HorizontalAlignment;
desRange.VerticalAlignment=srcRange.VerticalAlignment;
}copyRangeStyle 自定義復制樣式方法包括 源選定范圍參數(shù)(Excel.Range srcRange)和目標選定范圍參數(shù)(Excel.Range desRange),至此,完整代碼可修整如下:
Range.Style = SRange.Style; copyRangeStyle(SRange, Range);
至此結合 copyRangeStyle 方法完美解決樣式復制問題。
copyRangeStyle 方法請根據實際需要的樣式進行擴充或調整。
小結
關于 Range.Borders 的COM 操作如下圖:

這個樣式的設定是有點擊順序的,選邊框后點擊樣式是無效的,需要點擊樣式再進行選邊框的切換,才會得到預期效果。正常可通過 Range.Borders 直接表示所有6個框線的集合,直接為其賦值,如下代碼:
newStyle.Borders.Weight = XlBorderWeight.xlHairline; //最細的線 newStyle.Borders.LineStyle = XlLineStyle.xlContinuous; //實線類型邊框 newStyle.Borders.Color = Color.Red; //紅色邊框
如果想只設置某一邊框,則需要獲取 Borders 集合里的 Border,如下幾種方式都可以獲取其中的某一個 Border 對象:
//右、左、下、上邊框 Range.Borders.get_Item(XlBordersIndex.xlEdgeRight).LineStyle = XlLineStyle.xlLineStyleNone; Range.Borders.get_Item(XlBordersIndex.xlEdgeLeft).LineStyle = XlLineStyle.xlContinuous; Range.Borders.get_Item(XlBordersIndex.xlEdgeBottom).LineStyle = XlLineStyle.xlContinuous; Range.Borders.get_Item(XlBordersIndex.xlEdgeTop).LineStyle = XlLineStyle.xlContinuous; //內部交叉斜線 Range.Borders.Item[XlBordersIndex.xlDiagonalDown].LineStyle = XlLineStyle.xlLineStyleNone; Range.Borders[XlBordersIndex.xlDiagonalUp].LineStyle = XlLineStyle.xlLineStyleNone;
我們可以使用 Borders.get_Item 方法或引用 Item 索引或直接引用索引的方法得到 Border,但實際的使用過程中,預期效果不理想,因此我們使用了樣式賦值,類似格式刷的方法來解決。
以上就是C#解決Excel邊框樣式無法復制及格式刷功能的詳細內容,更多關于C# Excel邊框樣式無法復制的資料請關注腳本之家其它相關文章!
相關文章
C#通過第三方組件生成二維碼(QR Code)和條形碼(Bar Code)
用C#如何生成二維碼,我們可以通過現(xiàn)有的第三方dll直接來實現(xiàn),下面列出幾種不同的生成方法2016-12-12
C#使用WebSocket與網頁實時通信的實現(xiàn)示例
本文主要介紹了C#使用WebSocket與網頁實時通信的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-08-08

