Search code examples
c#excelcommentscellnpoi

How to add a cell comment using NPOI Excel in C#?


I want to create a cell comment iusing NPOI Excel in C#. I have not find any clear document of that. I wrote something by myself as below.

NPOI.HSSF.Record.NoteRecord nr = new NPOI.HSSF.Record.NoteRecord();
nr.Author = "Some Author";
NPOI.HSSF.Record.TextObjectRecord tor = new NPOI.HSSF.Record.TextObjectRecord();
tor.Str = new HSSFRichTextString("something");

HSSFComment cm = new HSSFComment(nr, tor);
cm.Visible = true;

sheet.GetRow(i).Cells[k + 8].CellComment = cm;   

That code is not working correctly. I can not see any comment on that cell in the generated excel file. Is there anybody to know how can I add a comment in the specific cell?


Solution

  • You need to use a drawing patriarch to create a cell comment. Then you can define your author and text. You can also apply some font customization.

    Please try this code, I commented the different steps:

    HSSFWorkbook workbook = new HSSFWorkbook();
    HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet("Sheet1");
    HSSFRow row = (HSSFRow)sheet.CreateRow(0);
    HSSFCell cell = (HSSFCell)row.CreateCell(0);
    cell.SetCellValue("Cell1");
    
    // Create the drawing patriarch (top level container for all shapes including cell comments)
    IDrawing patriarch = (HSSFPatriarch)sheet.CreateDrawingPatriarch();
    
    // Client anchor defines size and position of the comment in the worksheet
    IComment comment = patriarch.CreateCellComment(new HSSFClientAnchor(0, 0, 0, 0, 2, 1, 4, 4));
    
    // Set comment author
    comment.Author = "Author";
    
    // Set text in the comment
    comment.String = new HSSFRichTextString($"{comment.Author}:{Environment.NewLine}A comment");
    
    // If you want the author displayed in bold on top like in Excel
    // The author will be displayed in the status bar when on mouse over the commented cell
    IFont font = workbook.CreateFont();
    font.Boldweight = (short)FontBoldWeight.Bold;
    comment.String.ApplyFont(0, comment.Author.Length, font);
    
    // Set comment visible
    comment.Visible = true;
    
    // Assign comment to a cell
    cell.CellComment = comment;
    
    using (MemoryStream exportData = new MemoryStream())
    {
        workbook.Write(exportData);
        Response.ContentEncoding = Encoding.UTF8;
        Response.Charset = Encoding.UTF8.EncodingName;
        Response.ContentType = "application/vnd.ms-excel";
        Response.AddHeader("content-disposition", $"attachment; filename=test.xls");
        Response.Clear();
        Response.BinaryWrite(exportData.GetBuffer());
        Response.End();
    }
    

    References: