在 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 工作表中添加普通文本批注。具体步骤如下:
- 初始化 workbook 类的一个实例。
- 使用 workbook.loadfromfile() 方法加载 excel 文件。
- 通过 workbook.worksheets[int] 属性获取 excel 文件中的第一个工作表。
- 使用 cellrange.addcomment() 方法在指定单元格区域添加批注,并通过 excelcomment 对象的 text 属性设置批注内容。
- 使用 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 工作表中的批注设置字体格式。
- 初始化 workbook 类的一个实例。
- 使用 workbook.loadfromfile() 方法加载 excel 文件。
- 通过 workbook.worksheets[int] 属性获取 excel 文件中的第一个工作表。
- 使用 cellrange.addcomment() 方法在指定单元格区域添加批注,并设置批注内容。
- 创建一个 excelfont 对象,并使用 excelcomment.richtext.setfont() 方法将字体应用到批注文本。
- 使用 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 文件中读取批注信息,是数据解析和审核的重要一环。
epplus:excelworksheet.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添加和设置批注格式内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论