C#代碼實(shí)現(xiàn)在Excel中添加或設(shè)置批注格式
在 Excel 中,批注用于解釋單元格中的內(nèi)容,或添加對(duì)讀者有幫助的附加信息。使用 Spire.XLS for .NET,我們不僅可以輕松地為 Excel 單元格添加批注,還可以通過(guò)設(shè)置批注框大小或?yàn)榕⑽谋緫?yīng)用字體樣式來(lái)自定義其外觀。本文將從以下兩個(gè)部分演示如何使用 C#/VB.NET 以編程方式向 Excel 工作表添加批注。
安裝 Spire.XLS for .NET
首先,您需要將 Spire.XLS for .NET 包中包含的 DLL 文件添加為 .NET 項(xiàng)目的引用。這些 DLL 文件可以通過(guò)下載獲取,也可以通過(guò) NuGet 進(jìn)行安裝。
PM> Install-Package Spire.XLS
在 Excel 工作表中添加批注
Spire.XLS 提供了 CellRange.AddComment() 方法,用于在 Excel 工作表中添加普通文本批注。具體步驟如下:
- 初始化 Workbook 類的一個(gè)實(shí)例。
- 使用 Workbook.LoadFromFile() 方法加載 Excel 文件。
- 通過(guò) Workbook.Worksheets[int] 屬性獲取 Excel 文件中的第一個(gè)工作表。
- 使用 CellRange.AddComment() 方法在指定單元格區(qū)域添加批注,并通過(guò) ExcelComment 對(duì)象的 Text 屬性設(shè)置批注內(nèi)容。
- 使用 Workbook.SaveToFile() 方法將文檔保存為另一個(gè)文件。
示例代碼如下:
using Spire.Xls;
namespace WordDemo
{
class Program
{
static void Main(string[] args)
{
// 創(chuàng)建 Workbook 對(duì)象
Workbook workbook = new Workbook();
// 加載示例工作簿
workbook.LoadFromFile("Sample.xlsx");
// 獲取第一個(gè)工作表
Worksheet sheet = workbook.Worksheets[0];
// 在指定單元格區(qū)域 C6 添加普通批注
CellRange range = sheet.Range["C6"];
ExcelComment comment = range.AddComment();
comment.Text = "普通批注";
// 保存 Excel 工作簿
workbook.SaveToFile("Addcomment.xlsx", ExcelVersion.Version2016);
}
}
}在 Excel 工作表中為批注應(yīng)用格式
Spire.XLS 提供了 Comment.RichText.SetFont() 方法,可用于為 Excel 工作表中的批注設(shè)置字體格式。
- 初始化 Workbook 類的一個(gè)實(shí)例。
- 使用 Workbook.LoadFromFile() 方法加載 Excel 文件。
- 通過(guò) Workbook.Worksheets[int] 屬性獲取 Excel 文件中的第一個(gè)工作表。
- 使用 CellRange.AddComment() 方法在指定單元格區(qū)域添加批注,并設(shè)置批注內(nèi)容。
- 創(chuàng)建一個(gè) ExcelFont 對(duì)象,并使用 ExcelComment.RichText.SetFont() 方法將字體應(yīng)用到批注文本。
- 使用 Workbook.SaveToFile() 方法將文檔保存為另一個(gè)文件。
示例代碼如下:
using Spire.Xls;
namespace ExcelComment
{
class Program
{
static void Main(string[] args)
{
// 創(chuàng)建 Workbook 對(duì)象
Workbook workbook = new Workbook();
// 加載示例工作簿
workbook.LoadFromFile("Sample.xlsx");
// 獲取第一個(gè)工作表
Worksheet sheet = workbook.Worksheets[0];
// 在指定單元格區(qū)域 C6 添加批注
CellRange range = sheet.Range["C6"];
ExcelComment comment = range.AddComment();
comment.Text = "帶格式的批注";
// 設(shè)置寬度和高度
comment.Width = 100;
comment.Height = 200;
// 顯示批注
comment.Visible = true;
// 創(chuàng)建字體
ExcelFont font = workbook.CreateFont();
font.FontName = "Calibri";
font.Size = 14;
font.KnownColor = ExcelColors.LightBlue;
font.IsBold = true;
// 將字體應(yīng)用到批注文本
comment.RichText.SetFont(0, 27, font);
// 保存 Excel 工作簿
workbook.SaveToFile("AddcommentwithFormat.xlsx", ExcelVersion.Version2016);
}
}
}知識(shí)擴(kuò)展
1. 添加批注與設(shè)置基礎(chǔ)文本
添加批注是所有操作的第一步,不同庫(kù)的寫法差異很大。
EPPlus:該庫(kù)對(duì)批注的添加和格式設(shè)置提供了強(qiáng)大而直觀的支持。你可以通過(guò) AddComment 方法為單元格添加批注,并立即通過(guò)返回的 ExcelComment 對(duì)象進(jìn)行基礎(chǔ)樣式設(shè)置。
// 獲取或創(chuàng)建單元格
var cell = worksheet.Cells[rowIndex, columnIndex];
// 添加批注,作者參數(shù)不可為空
var comment = cell.AddComment("批注內(nèi)容", "作者姓名");
// 基礎(chǔ)樣式設(shè)置(EPPlus特有)
comment.Font.Bold = true; // 設(shè)置粗體
comment.AutoFit = true; // 自動(dòng)調(diào)整大小
// 高級(jí)富文本樣式
var richText = comment.RichText.Add("內(nèi)容");
richText.Bold = false; // 單獨(dú)設(shè)置部分文本樣式上述代碼來(lái)自 EPPlus 的官方實(shí)踐。需注意,AddComment 的第二個(gè)參數(shù)必須提供有效的作者名。
NPOI:添加批注的過(guò)程相對(duì)復(fù)雜,需要通過(guò) HSSFPatriarch(或 XSSFDrawing)來(lái)創(chuàng)建繪圖對(duì)象,然后再創(chuàng)建批注并關(guān)聯(lián)到單元格。
// 步驟較多,需先創(chuàng)建繪圖對(duì)象
HSSFPatriarch patriarch = (HSSFPatriarch)sheet.CreateDrawingPatriarch();
// 定義批注的位置和大小
HSSFComment comment = (HSSFComment)patriarch.CreateComment(new HSSFClientAnchor(...));
// 設(shè)置批注內(nèi)容和作者
comment.String = new HSSFRichTextString("批注內(nèi)容");
comment.Author = "作者姓名";
// 將批注與單元格關(guān)聯(lián)
cell.SetCellComment(comment);上述代碼是 NPOI 添加批注的標(biāo)準(zhǔn)流程。雖然步驟繁瑣,但提供了極高的定制性。
Interop:這是最直接的方式,調(diào)用單元格的 AddComment 方法即可完成添加,與手動(dòng)在 Excel 中操作非常相似。
// 獲取單元格
Range cell = worksheet.Cells[row, column];
// 添加批注
cell.AddComment("批注內(nèi)容");2. 設(shè)置批注文本格式(字體、顏色、大?。?/h3>
讓批注文本更美觀或突出,需要設(shè)置其字體、顏色、大小等格式。
EPPlus:使用 RichText 屬性可以實(shí)現(xiàn)豐富的文本樣式,為批注文本的不同部分設(shè)置獨(dú)立的樣式。
var comment = cell.AddComment("", "作者");
var rt = comment.RichText.Add("普通文本");
rt.Bold = true; // 設(shè)置加粗
rt.Color = Color.Red; // 設(shè)置字體顏色
rt.FontName = "Calibri";
rt.Size = 11;
// 可以繼續(xù)添加更多不同樣式的文本
var rt2 = comment.RichText.Add("不同樣式的文本");
rt2.Italic = true;NPOI:同樣支持豐富的文本格式設(shè)置,通過(guò)創(chuàng)建 HSSFFont 對(duì)象并將其應(yīng)用到批注的 RichTextString 上。
// 創(chuàng)建字體對(duì)象
HSSFFont font = workbook.CreateFont();
font.FontName = "宋體";
font.FontHeightInPoints = 11;
font.Color = HSSFColor.Red.Index;
font.IsBold = true;
// 創(chuàng)建富文本字符串并應(yīng)用字體
HSSFRichTextString richString = new HSSFRichTextString("格式化的文本");
richString.ApplyFont(0, 5, font); // 對(duì)指定字符范圍應(yīng)用字體
comment.String = richString;Interop:同樣支持豐富的格式設(shè)置,通過(guò)修改 Comment.Shape.TextFrame.Characters 對(duì)象的 Font 屬性來(lái)實(shí)現(xiàn)。
// 獲取批注對(duì)象
Comment comment = cell.Comment;
// 設(shè)置文本和格式
comment.Text("批注內(nèi)容");
comment.Shape.TextFrame.Characters().Font.Name = "宋體";
comment.Shape.TextFrame.Characters().Font.Size = 12;
comment.Shape.TextFrame.Characters().Font.Color = Color.Red;
comment.Shape.TextFrame.Characters().Font.Bold = true;3. 設(shè)置批注框樣式(大小、可視性)
除了文本格式,批注框本身的外觀(如大小、是否始終顯示)也是可以控制的。
EPPlus:可以控制批注框的自動(dòng)調(diào)整大小和背景色等屬性。
var comment = cell.AddComment("批注內(nèi)容", "作者");
comment.AutoFit = true; // 自動(dòng)調(diào)整大小
comment.BackgroundColor = Color.LightYellow;NPOI:可以通過(guò) ClientAnchor 精確控制批注框的位置和大小,并設(shè)置其可視狀態(tài)。
// 創(chuàng)建錨點(diǎn),精確控制位置和大小 HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, col1, row1, col2, row2); HSSFComment comment = (HSSFComment)patriarch.CreateComment(anchor); comment.Visible = true; // 設(shè)置批注始終可見(jiàn),而非懸停時(shí)顯示 comment.FillColor = HSSFColor.LightYellow.Index;
4. 讀取已有的批注
從已有的 Excel 文件中讀取批注信息,是數(shù)據(jù)解析和審核的重要一環(huán)。
EPPlus:ExcelWorksheet.Comments 集合提供了遍歷和訪問(wèn)所有批注的能力,可以輕松獲取批注文本、作者等信息。
foreach (ExcelComment comment in worksheet.Comments)
{
string cellAddress = comment.Address; // 獲取批注所在單元格地址
string text = comment.Text; // 獲取批注文本
string author = comment.Author; // 獲取批注作者
// 進(jìn)行處理...
}NPOI:需要從 HSSFSheet 中獲取 HSSFComment 集合進(jìn)行遍歷,獲取文本和作者等屬性。
List<HSSFComment> comments = new List<HSSFComment>();
// 獲取sheet中所有的批注對(duì)象
foreach (HSSFShape shape in sheet.DrawingPatriarch.Children)
{
if (shape is HSSFComment comment)
{
comments.Add(comment);
}
}
foreach (HSSFComment comment in comments)
{
string text = comment.String.ToString(); // 批注文本
string author = comment.Author; // 批注作者
string address = comment.Row + ":" + comment.Column; // 獲取位置
}批量處理與性能考量
在處理大量批注時(shí),性能是需要重點(diǎn)關(guān)注的。
- 批量添加:使用循環(huán)逐批添加即可,關(guān)鍵是在循環(huán)外部創(chuàng)建好
Workbook和Worksheet對(duì)象,避免重復(fù)創(chuàng)建。 - 讀取批注:
EPPlus的Comments集合在內(nèi)部使用了高效的數(shù)據(jù)結(jié)構(gòu),讀取性能較好。NPOI 則需從DrawingPatriarch中提取,HSSFShape集合的訪問(wèn)性能稍遜一籌。
常見(jiàn)問(wèn)題與避坑指南
| 問(wèn)題 | 解決方案 |
|---|---|
| NPOI 批注無(wú)法顯示中文 | 需確保為批注設(shè)置了中文字體,如 "宋體",并確保環(huán)境編碼支持中文。 |
| EPPlus 批注顯示不全 | 可嘗試設(shè)置 comment.AutoFit = true 讓批注框自適應(yīng),或手動(dòng)設(shè)置批注框的寬高。 |
| Interop 內(nèi)存泄漏 | 必須使用雙重循環(huán)確保 COM 對(duì)象被正確釋放,并對(duì)每個(gè)對(duì)象調(diào)用 Marshal.ReleaseComObject。 |
| 庫(kù)的選擇 | 如果需要處理 .xls 文件且要求免費(fèi),NPOI 是唯一的選擇。處理 .xlsx 且不介意授權(quán),EPPlus 是更現(xiàn)代化的選擇。 |
總結(jié)與建議
- 首選 EPPlus:如果你是處理
.xlsx格式,并且項(xiàng)目允許使用其許可協(xié)議,EPPlus 以其現(xiàn)代化的 API、強(qiáng)大的功能和卓越的性能,應(yīng)成為你的首選。 - 備選 NPOI:如果項(xiàng)目有免費(fèi)、開(kāi)源的嚴(yán)格要求,或者需要兼容舊的
.xls格式,NPOI 是一個(gè)成熟、可靠的備選方案。 - 避免 Interop:除非你是在編寫一個(gè)需要精確模擬用戶操作的簡(jiǎn)單自動(dòng)化腳本,否則應(yīng)避免在生產(chǎn)環(huán)境中使用
Microsoft.Office.Interop.Excel,其穩(wěn)定性和性能問(wèn)題會(huì)帶來(lái)很多麻煩。
到此這篇關(guān)于C#代碼實(shí)現(xiàn)在Excel中添加或設(shè)置批注格式的文章就介紹到這了,更多相關(guān)C# Excel添加和設(shè)置批注格式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C#在Excel表格中插入、編輯和刪除批注
- C#借助Spire.XLS?for?.NET實(shí)現(xiàn)一鍵移除Excel條件格式
- 使用C#導(dǎo)出Excel數(shù)據(jù)并保存多種格式的完整示例
- .NET中利用C#實(shí)現(xiàn)Excel條件格式的自動(dòng)化設(shè)置
- C#快速實(shí)現(xiàn)Excel多類數(shù)字格式的設(shè)置
- 使用C#實(shí)現(xiàn)自動(dòng)化設(shè)置Excel表格中條件格式
- 使用C#實(shí)現(xiàn)設(shè)置 Excel單元格格式的示例詳解
- .NET使用C#設(shè)置Excel單元格數(shù)值格式
相關(guān)文章
C#實(shí)現(xiàn)在Excel中添加篩選器并執(zhí)行篩選的操作
自動(dòng)篩選器是 Excel 中的一個(gè)基本但極其有用的功能,它可以讓你根據(jù)特定的條件來(lái)自動(dòng)隱藏和顯示你的數(shù)據(jù),當(dāng)有大量的數(shù)據(jù)需要處理時(shí),這個(gè)功能可以幫你快速找到你需要的信息,下面將介紹如何使用免費(fèi).NET Excel庫(kù)在Excel中添加、應(yīng)用和刪除自動(dòng)篩選器,需要的朋友可以參考下2024-05-05
C#實(shí)現(xiàn)簡(jiǎn)單的RSA非對(duì)稱加密算法示例
這篇文章主要介紹了C#實(shí)現(xiàn)簡(jiǎn)單的RSA非對(duì)稱加密算法,結(jié)合實(shí)例形式分析了C#實(shí)現(xiàn)RSA加密的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
基于.net中突破每客戶端兩個(gè)http連接限制的詳細(xì)介紹
本篇文章是對(duì).net中突破每客戶端兩個(gè)http連接限制進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
Winform消除button按下出現(xiàn)的虛線簡(jiǎn)單實(shí)現(xiàn)方法
這篇文章主要介紹了Winform消除button按下出現(xiàn)的虛線簡(jiǎn)單實(shí)現(xiàn)方法,通過(guò)重寫button設(shè)置Selectable參數(shù)實(shí)現(xiàn)該功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
C#實(shí)現(xiàn)讀取和設(shè)置文件與文件夾的權(quán)限
這篇文章主要為大家詳細(xì)介紹了如何使用C#實(shí)現(xiàn)讀取和設(shè)置文件與文件夾的權(quán)限,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
C# Process.Start()系統(tǒng)找不到指定文件的問(wèn)題分析及解決
文章內(nèi)容:文章描述了由于系統(tǒng)找不到可啟動(dòng)的exe文件,路徑出現(xiàn)問(wèn)題導(dǎo)致無(wú)法啟動(dòng)應(yīng)用程序的情況,作者通過(guò)修改應(yīng)用程序的啟動(dòng)路徑,將路徑中的“\\”改為“\”,從而解決了路徑問(wèn)題,使應(yīng)用程序能夠正常啟動(dòng)2025-11-11
C# 中如何利用lambda實(shí)現(xiàn)委托事件的掛接
在寫一個(gè)小程序的時(shí)候,碰到了這樣的問(wèn)題,需要用委托來(lái)掛接事件,但是又想在這事件中使用局部的變量,而委托一旦定義好后,掛接方就沒(méi)有辦法再添加額外的形參了。那有沒(méi)有什么辦法,可以實(shí)現(xiàn)呢2013-07-07
C#中通過(guò)Command模式實(shí)現(xiàn)Redo/Undo方案
這篇文章介紹了C#中通過(guò)Command模式實(shí)現(xiàn)Redo/Undo方案的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06

