找回密码
 立即注册

QQ登录

只需一步,快速开始

Winny

超级版主

141

主题

263

帖子

1696

积分

超级版主

Rank: 8Rank: 8

积分
1696
Winny
超级版主   /  发表于:2022-1-20 12:30  /   查看:2669  /  回复:4
本帖最后由 Winny 于 2022-1-27 09:45 编辑

常见的表格产品提供了插入批注的功能,具体的展现形式如下:
image.png46194457.png
使用该功能,不同的用户可以对同一区域的内容做出解释说明,建立对话。GCExcel5.0对该功能进行了支持。
下面介绍该功能的一些使用说明:
1. 使用IWorksheet.CommentsThreaded来获取工作表上的所有上下文批注集合,集合中的顺序先按行排序,再按列顺序;
2. 使用IRange.AddCommentThreaded(String text,String author)将新的批注添加到对应区域中,如果author为空,则批注会使用集合列表中的最后一位作者,如果集合列表为空,则添加一个空的author;
3. 使用Icommentsthread[int index]从上下文批准列表中按索引获取批注;
4. 使用ICommentsThreaded.Count可获取当前工作表中上下文批注的数量;
5. 使用ICommentThreaded.IsResolved获取或设置上下文批注的锁定状态,如果IsResolved为true,则禁止对批注进行编辑和回复;
6. 使用ICommentThreaded.Text获取或设置批注的文本内容。如果IsResolved为true,则在设置内容时抛出InvalideException;
7. 使用ICommentThreaded.Replies获取指定批注的所有答复,答复按照时间戳排序,如果某一批注本身是回复,则返回null;
8. 使用ICommentThreaded.Date以获取一个日期,该日期表示在本地时间中添加上下文批注的日期和时间;
9. 使用ICommentThreaded.Next()获取下一条上下文批注(答复),如果当前sheet中只有一条批注或当前批注是最后一条,返回null。如果当前批注是某一个批注的最后一个回复,也返回null;
10. 使用ICommentThreaded.Previous()获取前一条批注(答复),如果当前sheet中只有一条批注,则返回null,如果当前批注是某一批注的第一条回复,也返回null;
11. 使用ICommentThreaded.Parent获取当前回复的父对象(如果当前批注是一个回复),如果该上下文批注为顶级批注,返回null;
12. 使用ICommentThreaded.AddReply(String text,String author=null)向上下文批注添加回复。如果当前批注是顶级批注,它将向其“回复”集合添加回复。
如果当前批注是回复,它将向其父级的回复集合添加回复;
13. 使用ICommentThreaded.Delete()删除指定的批注,如果当前批注是顶级批注,则删除该批注的同时,删除与之关联的回复。如果当前批注是一个回复,则从它的父级答复列别中删除本身;
14. 使用ICommentThreaded.Author来获取批注的作者。
15. 使用 IAuthor.Name来设置或获取批注的名称;
16. 导出Html时支持上下文批注;
17. 导出json时支持线程注释;
18. 导出PDF/图像时不支持上下文批注。

需要注意的是,由于SpreadJS目前并不支持上下文批注,因此在到处json时,GCExcel会将批注转为普通注释。
与之相关的API有以下几个:
  1. public interface IWorksheet
  2. {
  3. //获取当前WorkSheet中的所有上下文对象
  4. ICommentsThreaded CommentsThreaded { get; }
  5. }
复制代码
  1. public interface IRange
  2. {
  3. //清空当前区域的上下文批注
  4. void ClearCommentsThreaded();
  5. //当前区域添加批注
  6. ICommentThreaded AddCommentThreaded(string text, string author = null);
复制代码
  1. public interface IAuthor
  2. {
  3. //获取批注作者名称
  4. string Name { get; set; }
  5. }
复制代码
  1. public interface ICommentsThreaded
  2. {
  3. //获取特定索引的批注
  4. ICommentThreaded this[int Index] { get; }
  5. //获取批注数量
  6. int Count { get; }
  7. }
复制代码
  1. public interface ICommentThreaded
  2. {
  3. //当前批注添加回复
  4. ICommentThreaded AddReply(string text, string author = null);
  5. //删除批注或回复
  6. void Delete();
  7. // 设置或获取批注锁定状态
  8. bool IsResolved { get; set; }
  9. //获取或设置批注内容
  10. string Text { get; set; }
  11. //获取批注回复的集合
  12. ICommentsThreaded Replies { get; }
  13. //获取批注作者名称
  14. IAuthor Author { get; }
  15. //获取批注添加时间
  16. DateTime Date { get; }//获取下一条批注,如果当前批注是sheet中的最后一个顶层批注,返回null。如果当前批注是最后一个回复,也返回null。
  17. ICommentThreaded Next();//获取上一条批注,如果当前批注是sheet中第一个顶层批注,返回null。如果当前批注是第一个回复,也返回null。
  18. ICommentThreaded Previous();
  19. // 获取父级批注
  20. ICommentThreaded Parent { get; }
  21. }
复制代码
最后,提供一个简单的测试用例:
  1. Workbook workbook = new Workbook();
  2. IWorksheet worksheet = workbook.getActiveSheet();
  3. //Add a threaded comment
  4. ICommentThreaded commentThreaded =worksheet.getRange("A1").addCommentThreaded("Test CommentThreaded to json01","Winny");
  5. ICommentThreaded reply = commentThreaded.addReply("hello Winny","memo");        
  6. workbook.save("out.xlsx");
复制代码
在搭建好的java项目中运行上述代码之后,将生成的文件打开,展示效果如下:
image.png353484801.png 相关的一些其它API如下所示:
  1. Workbook workbook = new Workbook();
  2. IWorksheet worksheet = workbook.getActiveSheet();
  3. //添加批注
  4. ICommentThreaded commentThreaded = worksheet.getRange("A1").addCommentThreaded("Test CommentThreaded to json01","Winny");
  5. //当前批注添加回复
  6. ICommentThreaded reply01 = commentThreaded.addReply("hello Winny","memo");
  7. ICommentThreaded reply02 = commentThreaded.addReply("Hi memo","Winny");
  8. ICommentThreaded reply03 = commentThreaded.addReply("this is a cat","Mario");
  9. //添加批注
  10. worksheet.getRange("B1").addCommentThreaded("Test CommentThreaded to json02", "Dextor");
  11. //获取当前sheet中的所有批注
  12. ICommentsThreaded comments = worksheet.getCommentsThreaded();
  13. //获取批注数量
  14. int count = comments.getCount();
  15. //获取第一个批注
  16. ICommentThreaded comment0 = comments.get(0);
  17. //获取当前批注的所有回复
  18. ICommentsThreaded replies = comment0.getReplies();
  19. //获取当前批注的回复总数量
  20. int count02 = replies.getCount();
  21. //获取当前批注的第三个回复
  22. ICommentThreaded replay01 = replies.get(2);
  23. //获取当前批注(回复)的下一条批注(回复),如果已经是最后一条,返回null
  24. ICommentThreaded nextComment =  comment0.next();
  25. //获取当前批注(回复)的上一条批注(回复),如果已经是最后一条,返回null
  26. ICommentThreaded preComment = comment0.previous();
  27. //获取回复的顶级批注
  28. ICommentThreaded parent = replay01.getParent();
复制代码



评分

参与人数 1满意度 +5 收起 理由
bakefish + 5

查看全部评分

4 个回复

倒序浏览
bakefish
金牌服务用户   /  发表于:2022-1-28 10:36:50
沙发
这个功能很有用,我们自己做了一个前后端结合的,期待spreadjs早点能上去
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-1-28 14:59:32
板凳
您的建议我们会反馈给产品部门,感谢您的宝贵建议。
回复 使用道具 举报
树上摇摆的猪
注册会员   /  发表于:2022-2-15 15:28:35
地板
Clark.Pan 发表于 2022-1-28 14:59
您的建议我们会反馈给产品部门,感谢您的宝贵建议。

ICommentsThreaded和IComment两个有什么关系?
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-2-15 16:30:23
5#
ICommentsThreaded是有上下文的批注,IComment是普通批注,没有上下文
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部