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

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

雖然已經(jīng)自定義了復(fù)制樣式的方法,包括邊框風(fēng)格的復(fù)制,但實(shí)際輸出遇到了如下情況:

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

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


示例代碼如下:
string stylename = Guid.NewGuid().ToString(); WorkBook xb=WorkBooks[1]; Style newStyle = xb.Styles.Add(stylename); 設(shè)置樣式屬性 newStyle.Font.Name = "宋體"; newStyle.Font.Size = 11; newStyle.Font.Bold = true; newStyle.Borders.Weight = XlBorderWeight.xlHairline; //最細(xì)的線 newStyle.Borders.LineStyle = XlLineStyle.xlContinuous; //實(shí)線
以上是添加樣式的示例,因?yàn)闃邮胶芏?,?shí)現(xiàn)格式復(fù)制的簡(jiǎn)單方法,是創(chuàng)建新名稱并直接引用源單元格的樣式,應(yīng)用到目標(biāo)選范圍上即可,如果有需要移除或修改的樣式,可以繼續(xù)對(duì)新建樣式進(jìn)行賦值,修改后如下代碼示例:
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 是一個(gè) dynamic 類型,可以賦予任何可以正確實(shí)現(xiàn)的類型,如自定義樣式名稱(newStyle.Name),也可以直接賦值為 Style 類型,簡(jiǎn)單而暴力,代碼如下:
Range.Style = SRange.Style; //將源選定范圍樣式賦值到目標(biāo)
完美方案
在實(shí)際的運(yùn)行中,無(wú)論是自定義樣式還是直接賦值模式,對(duì)復(fù)制字體時(shí)出現(xiàn)了無(wú)法復(fù)制的問(wèn)題,因此還是需要結(jié)合自定義復(fù)制樣式方法來(lái)彌補(bǔ)問(wè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 自定義復(fù)制樣式方法包括 源選定范圍參數(shù)(Excel.Range srcRange)和目標(biāo)選定范圍參數(shù)(Excel.Range desRange),至此,完整代碼可修整如下:
Range.Style = SRange.Style; copyRangeStyle(SRange, Range);
至此結(jié)合 copyRangeStyle 方法完美解決樣式復(fù)制問(wèn)題。
copyRangeStyle 方法請(qǐng)根據(jù)實(shí)際需要的樣式進(jìn)行擴(kuò)充或調(diào)整。
小結(jié)
關(guān)于 Range.Borders 的COM 操作如下圖:

這個(gè)樣式的設(shè)定是有點(diǎn)擊順序的,選邊框后點(diǎn)擊樣式是無(wú)效的,需要點(diǎn)擊樣式再進(jìn)行選邊框的切換,才會(huì)得到預(yù)期效果。正常可通過(guò) Range.Borders 直接表示所有6個(gè)框線的集合,直接為其賦值,如下代碼:
newStyle.Borders.Weight = XlBorderWeight.xlHairline; //最細(xì)的線 newStyle.Borders.LineStyle = XlLineStyle.xlContinuous; //實(shí)線類型邊框 newStyle.Borders.Color = Color.Red; //紅色邊框
如果想只設(shè)置某一邊框,則需要獲取 Borders 集合里的 Border,如下幾種方式都可以獲取其中的某一個(gè) Border 對(duì)象:
//右、左、下、上邊框 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; //內(nèi)部交叉斜線 Range.Borders.Item[XlBordersIndex.xlDiagonalDown].LineStyle = XlLineStyle.xlLineStyleNone; Range.Borders[XlBordersIndex.xlDiagonalUp].LineStyle = XlLineStyle.xlLineStyleNone;
我們可以使用 Borders.get_Item 方法或引用 Item 索引或直接引用索引的方法得到 Border,但實(shí)際的使用過(guò)程中,預(yù)期效果不理想,因此我們使用了樣式賦值,類似格式刷的方法來(lái)解決。
以上就是C#解決Excel邊框樣式無(wú)法復(fù)制及格式刷功能的詳細(xì)內(nèi)容,更多關(guān)于C# Excel邊框樣式無(wú)法復(fù)制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#調(diào)用郵箱應(yīng)用發(fā)送帶附件的郵件
這篇文章主要為大家詳細(xì)介紹了C#如何調(diào)用郵箱應(yīng)用發(fā)送帶附件的郵件,文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下2025-07-07
C#通過(guò)第三方組件生成二維碼(QR Code)和條形碼(Bar Code)
用C#如何生成二維碼,我們可以通過(guò)現(xiàn)有的第三方dll直接來(lái)實(shí)現(xiàn),下面列出幾種不同的生成方法2016-12-12
C#SuperSocket的搭建并配置啟動(dòng)總結(jié)
在本篇文章里我們給大家總結(jié)了關(guān)于C#SuperSocket的搭建并配置啟動(dòng)的相關(guān)內(nèi)容,正在學(xué)習(xí)的朋友們跟著參考下。2019-05-05
C#中GraphicsPath的Warp方法用法實(shí)例
這篇文章主要介紹了C#中GraphicsPath的Warp方法用法,實(shí)例分析了Warp方法的相關(guān)使用技巧,需要的朋友可以參考下2015-06-06
ADO.NET實(shí)體數(shù)據(jù)模型詳細(xì)介紹
本文將詳細(xì)介紹ADO.NET實(shí)體數(shù)據(jù)模型,下面先看看簡(jiǎn)單的單表的增刪改查操作,然后再看多表的關(guān)聯(lián)查詢,帶參數(shù)查詢等2012-11-11
C#創(chuàng)建WCF服務(wù)控制臺(tái)應(yīng)用程序詳解
這篇文章主要為大家詳細(xì)介紹了C#創(chuàng)建WCF服務(wù)控制臺(tái)應(yīng)用程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
WPF實(shí)現(xiàn)自定義Panel面板的示例詳解
WPF中的Panel(面板),是繼承自FrameworkElement的抽象類,表示一個(gè)可以用來(lái)排列子元素的面板,本文主要來(lái)和大家聊聊WPF如何實(shí)現(xiàn)自定義Panel,感興趣的可以了解下2023-09-09
C#使用WebSocket與網(wǎng)頁(yè)實(shí)時(shí)通信的實(shí)現(xiàn)示例
本文主要介紹了C#使用WebSocket與網(wǎng)頁(yè)實(shí)時(shí)通信的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08

