pub struct CellComment {
pub cell: String,
pub author: String,
pub text: String,
pub rich_text: Option<Vec<RichTextRun>>,
}Expand description
A comment attached to a cell (legacy xl/comments*.xml + VML drawing, CT_Comment). Only
plain-text comments with a fixed author are modeled — CT_Comment’s rich-text (CT_RElt runs)
body and threaded-comment reply chains (CT_ThreadedComment, the modern Excel 365 “@mention”
comment form) are out of scope.
Fields§
§cell: StringThe cell this comment is attached to (e.g. "B2").
The comment’s author (shown in the comment box’s first bold line by Excel’s own convention,
and stored as a separate <author> entry — not otherwise validated).
text: StringThe comment’s body text — when rich_text is Some, this is
simply the plain-text concatenation of every run’s own text (kept in sync automatically by
CellComment::with_rich_text), not a separate independent value.
rich_text: Option<Vec<RichTextRun>>The comment’s body as per-run formatted text (<text><r>..</r></text>, reusing
RichTextRun — the same per-run bold/italic/color/size/ name/underline/strike model a
rich-text cell’s shared-string runs already use). None writes the plain single-run
<text><r><t>..</t></r></text> form instead, using text verbatim.
Implementations§
Source§impl CellComment
impl CellComment
Sourcepub fn new(
cell: impl Into<String>,
author: impl Into<String>,
text: impl Into<String>,
) -> CellComment
pub fn new( cell: impl Into<String>, author: impl Into<String>, text: impl Into<String>, ) -> CellComment
Creates a plain-text comment.
Examples found in repository?
13fn main() -> office_toolkit::Result<()> {
14 let path = output_path("xlsx_rich_data.xlsx");
15
16 let dates_and_booleans_sheet = Sheet::new("Dates and booleans")
17 .with_row(Row::new().with_cell(Cell::date(ExcelDateTime::date(2026, 7, 21))))
18 .with_row(Row::new().with_cell(Cell::date(
19 ExcelDateTime::date(2026, 7, 21).with_time(14, 30, 0),
20 )))
21 .with_row(
22 Row::new()
23 .with_cell(Cell::boolean(true))
24 .with_cell(Cell::boolean(false)),
25 );
26
27 // An array/shared formula's `ref` must be a range whose top-left cell
28 // is the cell the `<f t="array"|"shared">` element actually sits in —
29 // `with_cell` fills a row left-to-right starting at column A, so each
30 // formula cell below is positioned to land exactly on its own `ref`'s
31 // first cell, with plain cached-value cells (no `<f>`) filling out the
32 // rest of the declared range, matching how Excel itself writes a
33 // multi-cell array/shared formula. The previous version declared
34 // ranges like "D1:D3"/"E1:E3" while the formula cells actually landed
35 // in column A — a real cell/range mismatch Excel refuses to open
36 // without repairing.
37 let formulas_sheet = Sheet::new("Formulas")
38 .with_row(
39 Row::new()
40 .with_cell(Cell::number(10.0))
41 .with_cell(Cell::number(20.0))
42 .with_cell(Cell::formula("A1+B1").with_cached_value(30.0)),
43 )
44 .with_row(
45 Row::new()
46 .with_cell(Cell::array_formula("A1:A3*2", "A2:C2").with_cached_value(20.0))
47 .with_cell(Cell::number(40.0))
48 .with_cell(Cell::number(60.0)),
49 )
50 .with_row(
51 Row::new()
52 .with_cell(Cell::shared_formula("A1+1", 0, "A3:C3").with_cached_value(11.0))
53 .with_cell(Cell::shared_formula_follower(0).with_cached_value(21.0))
54 .with_cell(Cell::shared_formula_follower(0).with_cached_value(31.0)),
55 );
56
57 let rich_text_sheet =
58 Sheet::new("Rich text").with_row(Row::new().with_cell(Cell::rich_text(vec![
59 RichTextRun::new("Bold red, ").with_bold(true).with_font_color("FFC00000"),
60 RichTextRun::new("then italic blue.").with_italic(true).with_font_color("FF2E74B5"),
61 ])));
62
63 let hyperlinks_sheet = Sheet::new("Hyperlinks")
64 .with_row(
65 Row::new()
66 .with_text("Visit Rust")
67 .with_text("Jump to C1")
68 .with_text("You've arrived"),
69 )
70 .with_hyperlink(
71 CellHyperlink::external("A1", "https://www.rust-lang.org")
72 .with_tooltip("Opens in your browser"),
73 )
74 .with_hyperlink(CellHyperlink::internal("B1", "'Hyperlinks'!C1"));
75
76 let comments_sheet = Sheet::new("Comments")
77 .with_row(
78 Row::new()
79 .with_text("Hover B1 for a comment")
80 .with_text("Reviewed"),
81 )
82 .with_comment(CellComment::new(
83 "A1",
84 "Reviewer",
85 "Double-check this figure before publishing.",
86 ))
87 .with_comment(
88 CellComment::new("B1", "Reviewer", "Looks correct.")
89 .with_rich_text(vec![RichTextRun::new("Looks correct.").with_bold(true)]),
90 );
91
92 let workbook = Workbook::new()
93 .with_sheet(dates_and_booleans_sheet)
94 .with_sheet(formulas_sheet)
95 .with_sheet(rich_text_sheet)
96 .with_sheet(hyperlinks_sheet)
97 .with_sheet(comments_sheet);
98
99 workbook.save_to_file(&path)?;
100 println!("Wrote {}", path.display());
101 Ok(())
102}Sourcepub fn with_rich_text(self, runs: Vec<RichTextRun>) -> CellComment
pub fn with_rich_text(self, runs: Vec<RichTextRun>) -> CellComment
Sets this comment’s body as per-run formatted text and returns it for chaining. Also
resolves text (the plain-text fallback) to the concatenation of every run’s own text, so
both fields stay consistent.
Examples found in repository?
13fn main() -> office_toolkit::Result<()> {
14 let path = output_path("xlsx_rich_data.xlsx");
15
16 let dates_and_booleans_sheet = Sheet::new("Dates and booleans")
17 .with_row(Row::new().with_cell(Cell::date(ExcelDateTime::date(2026, 7, 21))))
18 .with_row(Row::new().with_cell(Cell::date(
19 ExcelDateTime::date(2026, 7, 21).with_time(14, 30, 0),
20 )))
21 .with_row(
22 Row::new()
23 .with_cell(Cell::boolean(true))
24 .with_cell(Cell::boolean(false)),
25 );
26
27 // An array/shared formula's `ref` must be a range whose top-left cell
28 // is the cell the `<f t="array"|"shared">` element actually sits in —
29 // `with_cell` fills a row left-to-right starting at column A, so each
30 // formula cell below is positioned to land exactly on its own `ref`'s
31 // first cell, with plain cached-value cells (no `<f>`) filling out the
32 // rest of the declared range, matching how Excel itself writes a
33 // multi-cell array/shared formula. The previous version declared
34 // ranges like "D1:D3"/"E1:E3" while the formula cells actually landed
35 // in column A — a real cell/range mismatch Excel refuses to open
36 // without repairing.
37 let formulas_sheet = Sheet::new("Formulas")
38 .with_row(
39 Row::new()
40 .with_cell(Cell::number(10.0))
41 .with_cell(Cell::number(20.0))
42 .with_cell(Cell::formula("A1+B1").with_cached_value(30.0)),
43 )
44 .with_row(
45 Row::new()
46 .with_cell(Cell::array_formula("A1:A3*2", "A2:C2").with_cached_value(20.0))
47 .with_cell(Cell::number(40.0))
48 .with_cell(Cell::number(60.0)),
49 )
50 .with_row(
51 Row::new()
52 .with_cell(Cell::shared_formula("A1+1", 0, "A3:C3").with_cached_value(11.0))
53 .with_cell(Cell::shared_formula_follower(0).with_cached_value(21.0))
54 .with_cell(Cell::shared_formula_follower(0).with_cached_value(31.0)),
55 );
56
57 let rich_text_sheet =
58 Sheet::new("Rich text").with_row(Row::new().with_cell(Cell::rich_text(vec![
59 RichTextRun::new("Bold red, ").with_bold(true).with_font_color("FFC00000"),
60 RichTextRun::new("then italic blue.").with_italic(true).with_font_color("FF2E74B5"),
61 ])));
62
63 let hyperlinks_sheet = Sheet::new("Hyperlinks")
64 .with_row(
65 Row::new()
66 .with_text("Visit Rust")
67 .with_text("Jump to C1")
68 .with_text("You've arrived"),
69 )
70 .with_hyperlink(
71 CellHyperlink::external("A1", "https://www.rust-lang.org")
72 .with_tooltip("Opens in your browser"),
73 )
74 .with_hyperlink(CellHyperlink::internal("B1", "'Hyperlinks'!C1"));
75
76 let comments_sheet = Sheet::new("Comments")
77 .with_row(
78 Row::new()
79 .with_text("Hover B1 for a comment")
80 .with_text("Reviewed"),
81 )
82 .with_comment(CellComment::new(
83 "A1",
84 "Reviewer",
85 "Double-check this figure before publishing.",
86 ))
87 .with_comment(
88 CellComment::new("B1", "Reviewer", "Looks correct.")
89 .with_rich_text(vec![RichTextRun::new("Looks correct.").with_bold(true)]),
90 );
91
92 let workbook = Workbook::new()
93 .with_sheet(dates_and_booleans_sheet)
94 .with_sheet(formulas_sheet)
95 .with_sheet(rich_text_sheet)
96 .with_sheet(hyperlinks_sheet)
97 .with_sheet(comments_sheet);
98
99 workbook.save_to_file(&path)?;
100 println!("Wrote {}", path.display());
101 Ok(())
102}Trait Implementations§
Source§impl Clone for CellComment
impl Clone for CellComment
Source§fn clone(&self) -> CellComment
fn clone(&self) -> CellComment
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more