我目前正在使用此代码显示给定单元格的注释:
public static void AddCellComment(ICell cell, IDrawing patr)
{
var commentString = "Something";
var anchor = new XSSFClientAnchor
{
Col1 = cell.ColumnIndex,
Col2 = cell.ColumnIndex + 2,
Row1 = cell.RowIndex,
Row2 = cell.RowIndex + 1
};
var comment = patr.CreateCellComment(anchor);
comment.String = new XSSFRichTextString(commentString);
cell.CellComment = comment;
}
这将为光标右侧的给定单元格成功创建2列乘1行宽的注释。我尝试将cell.ColumnIndex - 2
放在Col1或Col2中,这会导致损坏的工作簿(其中的注释无效)或看不见的注释。有没有办法在光标左侧显示注释?
答案 0 :(得分:0)
好的,下面是我的实验结果:
首先,如果您希望在其所属单元格悬停时能够精确定义评论的位置,您会感到失望。
这是不可能的。 Excel 根本不支持它。
将鼠标悬停在带有注释的单元格时,Excel 会自行决定放置注释的位置,并且似乎总是将其显示在单元格的右侧。您可以尝试在编辑模式下移动评论,当单元格悬停时,评论仍会显示在同一位置。 (我亲自体验过,并在此tutorial link中得到了确认。
那么,知道了这一点,您可以控制的是:
这两个特性都由 XSSFClientAnchor
属性控制。根据 npoi source code、Col1
、Row1
和 Col2
,Row2
定义了两个单元格,它们依次代表了评论:单元格 #1 将包含在该区域中,而单元格 #2 不会。
我认为这条规则解释了为什么您的一些尝试以奇怪或空洞的评论结束(我也复制了其中一些):鉴于上述规则,您必须始终拥有:Col2 > Col1
和 Row2 > Row1
。虽然我没有测试它,但我也怀疑(绝对)负列或行不起作用,因此当从输入单元格的列或行中减去值时,您应该确保结果不会以 < 0.. .
关于 XSSFClientAnchor
的最后一点:还有 4 个其他属性可以帮助您微调评论的大小和(仅限编辑模式)位置:Dx1
、Dy1
、{ {1}} 和 Dx2
:这四个属性允许您为单元格 x 和 y 坐标添加/减去一些大小。它们以一个奇怪的单位表示:Dy2
。您可以将 9525 EMU 放入一个像素中。
利用所有这些知识,我制作了一个简单的测试(基于您和 npoi 教程的组合)。这是:
EMU
运行时,我最终得到以下结果(同时显示悬停位置和编辑模式位置):
为了完整起见,我仔细检查了结果 xslx 中写入的内容(解压缩后,我查看了 private static void Main()
{
var workbook = new XSSFWorkbook();
var sheet = workbook.CreateSheet("My sheet");
var row = sheet.CreateRow(10);
var cell = row.CreateCell(10);
cell.SetCellValue("Here");
var patr = sheet.CreateDrawingPatriarch();
AddCellComment(cell, patr);
using var stream = new FileStream(@"c:\temp\test.xlsx", FileMode.Create, FileAccess.Write);
workbook.Write(stream);
}
private static int PixelsToEmus(int pixels) => pixels * Units.EMU_PER_PIXEL;
private static void AddCellComment(ICell cell, IDrawing patr)
{
// Let's make a 3x2 cells comment area, then tweak it a bit
var anchor = new XSSFClientAnchor
{
// Top left cell
Col1 = 5, // 6th column
Row1 = 5, // 6th row
// Bottom right cell
Col2 = 8, // 3 cells wide
Row2 = 7, // 2 cells high
// Top left shift
Dx1 = PixelsToEmus(10), // 10 pixels to the left of 6th column's left border
Dy1 = PixelsToEmus(10), // 10 pixels to the bottom of 6th row's top border
// Bottom right shift
Dx2 = PixelsToEmus(30), // 30-10=20 pixels wider than 3 columns
Dy2 = PixelsToEmus(10), // exactly as high as 2 rows
};
var comment = patr.CreateCellComment(anchor);
comment.String = new XSSFRichTextString("Something");
cell.CellComment = comment;
}
,特别是我们发现的 Note 对象的 test\xl\drawings\vmlDrawing1.vml
标签我们在程序中设置的确切值:
<x:Anchor>
npoi 的源代码帮助我(也希望你)了解一切是如何工作的:
PS:对于这些测试,我使用了 .NET Core 3.1 应用程序和 NPOI v2.5.2 Nuget package