NPOI-在光标左侧添加单元格注释

时间:2020-05-21 00:59:29

标签: c# excel comments cell npoi

我目前正在使用此代码显示给定单元格的注释:

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中,这会导致损坏的工作簿(其中的注释无效)或看不见的注释。有没有办法在光标左侧显示注释?

1 个答案:

答案 0 :(得分:0)

好的,下面是我的实验结果:

首先,如果您希望在其所属单元格悬停时能够精确定义评论的位置,您会感到失望。

这是不可能的。 Excel 根本不支持它。

将鼠标悬停在带有注释的单元格时,Excel 会自行决定放置注释的位置,并且似乎总是将其显示在单元格的右侧。您可以尝试在编辑模式下移动评论,当单元格悬停时,评论仍会显示在同一位置。 (我亲自体验过,并在此tutorial link中得到了确认。

那么,知道了这一点,您可以控制的是:

  • 评论框的大小。
  • 它的位置,但仅限于在编辑模式下

这两个特性都由 XSSFClientAnchor 属性控制。根据 npoi source codeCol1Row1Col2Row2 定义了两个单元格,它们依次代表了评论:单元格 #1 将包含在该区域中,而单元格 #2 不会。

  • 第一个单元格必须位于评论区的左上角(准确地说,单元格 #1 的左上角将是评论框的左上角)
  • 第二个必须在区域的右下角(准确地说,单元格 #2 的左上角将是评论框的右下角)

我认为这条规则解释了为什么您的一些尝试以奇怪或空洞的评论结束(我也复制了其中一些):鉴于上述规则,您必须始终拥有:Col2 > Col1Row2 > Row1。虽然我没有测试它,但我也怀疑(绝对)负列或行不起作用,因此当从输入单元格的列或行中减去值时,您应该确保结果不会以 < 0.. .

关于 XSSFClientAnchor 的最后一点:还有 4 个其他属性可以帮助您微调评论的大小和(仅限编辑模式)位置:Dx1Dy1、{ {1}} 和 Dx2:这四个属性允许您为单元格 x 和 y 坐标添加/减去一些大小。它们以一个奇怪的单位表示:Dy2。您可以将 9525 EMU 放入一个像素中。

利用所有这些知识,我制作了一个简单的测试(基于您和 npoi 教程的组合)。这是:

EMU

运行时,我最终得到以下结果(同时显示悬停位置和编辑模式位置):

enter image description here

enter image description here

为了完整起见,我仔细检查了结果 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