C#代码实现在Excel中添加或设置批注格式

 更新时间:2026年04月09日 14:23:47   作者:2501_93070778  
在 Excel 中,批注用于解释单元格中的内容,或添加对读者有帮助的附加信息,本文将从以下两个部分演示如何使用 C#/VB.NET 以编程方式向 Excel 工作表添加批注,希望对大家有所帮助

在 Excel 中,批注用于解释单元格中的内容,或添加对读者有帮助的附加信息。使用 Spire.XLS for .NET,我们不仅可以轻松地为 Excel 单元格添加批注,还可以通过设置批注框大小或为批注文本应用字体样式来自定义其外观。本文将从以下两个部分演示如何使用 C#/VB.NET 以编程方式向 Excel 工作表添加批注。

安装 Spire.XLS for .NET

首先,您需要将 Spire.XLS for .NET 包中包含的 DLL 文件添加为 .NET 项目的引用。这些 DLL 文件可以通过下载获取,也可以通过 NuGet 进行安装。

PM> Install-Package Spire.XLS

在 Excel 工作表中添加批注

Spire.XLS 提供了 CellRange.AddComment() 方法,用于在 Excel 工作表中添加普通文本批注。具体步骤如下:

  1. 初始化 Workbook 类的一个实例。
  2. 使用 Workbook.LoadFromFile() 方法加载 Excel 文件。
  3. 通过 Workbook.Worksheets[int] 属性获取 Excel 文件中的第一个工作表。
  4. 使用 CellRange.AddComment() 方法在指定单元格区域添加批注,并通过 ExcelComment 对象的 Text 属性设置批注内容。
  5. 使用 Workbook.SaveToFile() 方法将文档保存为另一个文件。

示例代码如下:

using Spire.Xls;

namespace WordDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建 Workbook 对象
            Workbook workbook = new Workbook();

            // 加载示例工作簿
            workbook.LoadFromFile("Sample.xlsx");

            // 获取第一个工作表
            Worksheet sheet = workbook.Worksheets[0];

            // 在指定单元格区域 C6 添加普通批注
            CellRange range = sheet.Range["C6"];
            ExcelComment comment = range.AddComment();
            comment.Text = "普通批注";                      
            
            // 保存 Excel 工作簿
            workbook.SaveToFile("Addcomment.xlsx", ExcelVersion.Version2016);

        }
    }
}

在 Excel 工作表中为批注应用格式

Spire.XLS 提供了 Comment.RichText.SetFont() 方法,可用于为 Excel 工作表中的批注设置字体格式。

  1. 初始化 Workbook 类的一个实例。
  2. 使用 Workbook.LoadFromFile() 方法加载 Excel 文件。
  3. 通过 Workbook.Worksheets[int] 属性获取 Excel 文件中的第一个工作表。
  4. 使用 CellRange.AddComment() 方法在指定单元格区域添加批注,并设置批注内容。
  5. 创建一个 ExcelFont 对象,并使用 ExcelComment.RichText.SetFont() 方法将字体应用到批注文本。
  6. 使用 Workbook.SaveToFile() 方法将文档保存为另一个文件。

示例代码如下:

using Spire.Xls;

namespace ExcelComment
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建 Workbook 对象
            Workbook workbook = new Workbook();

            // 加载示例工作簿
            workbook.LoadFromFile("Sample.xlsx");

            // 获取第一个工作表
            Worksheet sheet = workbook.Worksheets[0];

            // 在指定单元格区域 C6 添加批注                                              
            CellRange range = sheet.Range["C6"];
            ExcelComment comment = range.AddComment();
            comment.Text = "带格式的批注";                      
            
            // 设置宽度和高度
            comment.Width = 100;
            comment.Height = 200;

            // 显示批注
            comment.Visible = true;

            // 创建字体
            ExcelFont font = workbook.CreateFont();
            font.FontName = "Calibri";
            font.Size = 14;
            font.KnownColor = ExcelColors.LightBlue;
            font.IsBold = true;

            // 将字体应用到批注文本
            comment.RichText.SetFont(0, 27, font);

            // 保存 Excel 工作簿
            workbook.SaveToFile("AddcommentwithFormat.xlsx", ExcelVersion.Version2016);

        }
    }
}

知识扩展

1. 添加批注与设置基础文本

添加批注是所有操作的第一步,不同库的写法差异很大。

EPPlus:该库对批注的添加和格式设置提供了强大而直观的支持。你可以通过 AddComment 方法为单元格添加批注,并立即通过返回的 ExcelComment 对象进行基础样式设置。

// 获取或创建单元格
var cell = worksheet.Cells[rowIndex, columnIndex];
// 添加批注,作者参数不可为空
var comment = cell.AddComment("批注内容", "作者姓名");
// 基础样式设置(EPPlus特有)
comment.Font.Bold = true;      // 设置粗体
comment.AutoFit = true;        // 自动调整大小
// 高级富文本样式
var richText = comment.RichText.Add("内容");
richText.Bold = false; // 单独设置部分文本样式

上述代码来自 EPPlus 的官方实践。需注意,AddComment 的第二个参数必须提供有效的作者名。

NPOI:添加批注的过程相对复杂,需要通过 HSSFPatriarch(或 XSSFDrawing)来创建绘图对象,然后再创建批注并关联到单元格。

// 步骤较多,需先创建绘图对象
HSSFPatriarch patriarch = (HSSFPatriarch)sheet.CreateDrawingPatriarch();
// 定义批注的位置和大小
HSSFComment comment = (HSSFComment)patriarch.CreateComment(new HSSFClientAnchor(...));
// 设置批注内容和作者
comment.String = new HSSFRichTextString("批注内容");
comment.Author = "作者姓名";
// 将批注与单元格关联
cell.SetCellComment(comment);

上述代码是 NPOI 添加批注的标准流程。虽然步骤繁琐,但提供了极高的定制性。

Interop:这是最直接的方式,调用单元格的 AddComment 方法即可完成添加,与手动在 Excel 中操作非常相似。

// 获取单元格
Range cell = worksheet.Cells[row, column];
// 添加批注
cell.AddComment("批注内容");

2. 设置批注文本格式(字体、颜色、大小)

让批注文本更美观或突出,需要设置其字体、颜色、大小等格式。

EPPlus:使用 RichText 属性可以实现丰富的文本样式,为批注文本的不同部分设置独立的样式。

var comment = cell.AddComment("", "作者");
var rt = comment.RichText.Add("普通文本");
rt.Bold = true; // 设置加粗
rt.Color = Color.Red; // 设置字体颜色
rt.FontName = "Calibri";
rt.Size = 11;
// 可以继续添加更多不同样式的文本
var rt2 = comment.RichText.Add("不同样式的文本");
rt2.Italic = true;

NPOI:同样支持丰富的文本格式设置,通过创建 HSSFFont 对象并将其应用到批注的 RichTextString 上。

// 创建字体对象
HSSFFont font = workbook.CreateFont();
font.FontName = "宋体";
font.FontHeightInPoints = 11;
font.Color = HSSFColor.Red.Index;
font.IsBold = true;
// 创建富文本字符串并应用字体
HSSFRichTextString richString = new HSSFRichTextString("格式化的文本");
richString.ApplyFont(0, 5, font); // 对指定字符范围应用字体
comment.String = richString;

Interop:同样支持丰富的格式设置,通过修改 Comment.Shape.TextFrame.Characters 对象的 Font 属性来实现。

// 获取批注对象
Comment comment = cell.Comment;
// 设置文本和格式
comment.Text("批注内容");
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. 设置批注框样式(大小、可视性)

除了文本格式,批注框本身的外观(如大小、是否始终显示)也是可以控制的。

EPPlus:可以控制批注框的自动调整大小和背景色等属性。

var comment = cell.AddComment("批注内容", "作者");
comment.AutoFit = true;      // 自动调整大小
comment.BackgroundColor = Color.LightYellow;

NPOI:可以通过 ClientAnchor 精确控制批注框的位置和大小,并设置其可视状态。

// 创建锚点,精确控制位置和大小
HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, col1, row1, col2, row2);
HSSFComment comment = (HSSFComment)patriarch.CreateComment(anchor);
comment.Visible = true; // 设置批注始终可见,而非悬停时显示
comment.FillColor = HSSFColor.LightYellow.Index;

4. 读取已有的批注

从已有的 Excel 文件中读取批注信息,是数据解析和审核的重要一环。

EPPlusExcelWorksheet.Comments 集合提供了遍历和访问所有批注的能力,可以轻松获取批注文本、作者等信息。

foreach (ExcelComment comment in worksheet.Comments)
{
    string cellAddress = comment.Address; // 获取批注所在单元格地址
    string text = comment.Text;           // 获取批注文本
    string author = comment.Author;       // 获取批注作者
    // 进行处理...
}

NPOI:需要从 HSSFSheet 中获取 HSSFComment 集合进行遍历,获取文本和作者等属性。

List<HSSFComment> comments = new List<HSSFComment>();
// 获取sheet中所有的批注对象
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; // 获取位置
}

批量处理与性能考量

在处理大量批注时,性能是需要重点关注的。

  • 批量添加:使用循环逐批添加即可,关键是在循环外部创建好 Workbook 和 Worksheet 对象,避免重复创建。
  • 读取批注EPPlus 的 Comments 集合在内部使用了高效的数据结构,读取性能较好。NPOI 则需从 DrawingPatriarch 中提取,HSSFShape 集合的访问性能稍逊一筹。

常见问题与避坑指南

问题解决方案
NPOI 批注无法显示中文需确保为批注设置了中文字体,如 "宋体",并确保环境编码支持中文。
EPPlus 批注显示不全可尝试设置 comment.AutoFit = true 让批注框自适应,或手动设置批注框的宽高。
Interop 内存泄漏必须使用双重循环确保 COM 对象被正确释放,并对每个对象调用 Marshal.ReleaseComObject
库的选择如果需要处理 .xls 文件且要求免费,NPOI 是唯一的选择。处理 .xlsx 且不介意授权,EPPlus 是更现代化的选择。

总结与建议

  • 首选 EPPlus:如果你是处理 .xlsx 格式,并且项目允许使用其许可协议,EPPlus 以其现代化的 API、强大的功能和卓越的性能,应成为你的首选。
  • 备选 NPOI:如果项目有免费、开源的严格要求,或者需要兼容旧的 .xls 格式,NPOI 是一个成熟、可靠的备选方案。
  • 避免 Interop:除非你是在编写一个需要精确模拟用户操作的简单自动化脚本,否则应避免在生产环境中使用 Microsoft.Office.Interop.Excel,其稳定性和性能问题会带来很多麻烦。

到此这篇关于C#代码实现在Excel中添加或设置批注格式的文章就介绍到这了,更多相关C# Excel添加和设置批注格式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#实现在Excel中添加筛选器并执行筛选的操作

    C#实现在Excel中添加筛选器并执行筛选的操作

    自动筛选器是 Excel 中的一个基本但极其有用的功能,它可以让你根据特定的条件来自动隐藏和显示你的数据,当有大量的数据需要处理时,这个功能可以帮你快速找到你需要的信息,下面将介绍如何使用免费.NET Excel库在Excel中添加、应用和删除自动筛选器,需要的朋友可以参考下
    2024-05-05
  • C#实现简单的RSA非对称加密算法示例

    C#实现简单的RSA非对称加密算法示例

    这篇文章主要介绍了C#实现简单的RSA非对称加密算法,结合实例形式分析了C#实现RSA加密的具体步骤与相关操作技巧,需要的朋友可以参考下
    2017-08-08
  • C#圆形头像框制作并从数据库读取

    C#圆形头像框制作并从数据库读取

    本文主要介绍了C#圆形头像框制作并从数据库读取,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 基于.net中突破每客户端两个http连接限制的详细介绍

    基于.net中突破每客户端两个http连接限制的详细介绍

    本篇文章是对.net中突破每客户端两个http连接限制进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Winform消除button按下出现的虚线简单实现方法

    Winform消除button按下出现的虚线简单实现方法

    这篇文章主要介绍了Winform消除button按下出现的虚线简单实现方法,通过重写button设置Selectable参数实现该功能,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • C#实现读取和设置文件与文件夹的权限

    C#实现读取和设置文件与文件夹的权限

    这篇文章主要为大家详细介绍了如何使用C#实现读取和设置文件与文件夹的权限,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • C# Process.Start()系统找不到指定文件的问题分析及解决

    C# Process.Start()系统找不到指定文件的问题分析及解决

    文章内容:文章描述了由于系统找不到可启动的exe文件,路径出现问题导致无法启动应用程序的情况,作者通过修改应用程序的启动路径,将路径中的“\\”改为“\”,从而解决了路径问题,使应用程序能够正常启动
    2025-11-11
  • C# 中如何利用lambda实现委托事件的挂接

    C# 中如何利用lambda实现委托事件的挂接

    在写一个小程序的时候,碰到了这样的问题,需要用委托来挂接事件,但是又想在这事件中使用局部的变量,而委托一旦定义好后,挂接方就没有办法再添加额外的形参了。那有没有什么办法,可以实现呢
    2013-07-07
  • C#中通过Command模式实现Redo/Undo方案

    C#中通过Command模式实现Redo/Undo方案

    这篇文章介绍了C#中通过Command模式实现Redo/Undo方案的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C#使用TextBox作数据输入方法

    C#使用TextBox作数据输入方法

    笔者最近需要上位机与下位机进行数据交互,在广泛参考大佬的资料后,较为完善地使用Textbox控件进行数据输入的功能。感兴趣的可以了解一下
    2021-06-06

最新评论