用户指南 > 关于用户指南 > Word 和 Excel 模板 > Excel 模板 > 提示、技巧和常见问题解答
提示、技巧和常见问题解答
避免 Excel 单元格限制:删减较长的内容
Excel 内容存在某些限制,其中一项限制是单元格所含字符数不能超过 32767。这将导致您的模板导出说明字段时出现问题,因为说明字段文本长度可能会超过此限制。
要解决此问题,应在导出过程中对说明进行缩减。例如:
${StringUtils:abbreviate(items.description, 1000)}
如果超出此限制,Excel 将在打开结果 Excel 文件时报告错误:Repaired Records: String properties from /xl/sharedStrings.xml part (Strings),指示此类问题。
将说明和其他 Wiki 内容导出为 Wiki 源
“说明”字段或其他 Wiki 类型字段导出到 Excel 时,Excel 导出将包含 Wiki 源,而不是 Codebeamer 内部显示的相同输出。例如:
将内容 (例如,错误的说明) 从 Codebeamer 导出到 Excel 时,会将内容作为其 Wiki 源导出到 Excel。这意味着不会保留超链接、粗体文本、斜体文本等格式。这是因为 Excel 无法显示完整的 HTML 内容或富文本格式。
从 Wiki 导出到 Excel 的文本是包含富文本标记的纯文本。例如,粗体文本的富文本标记为 __double underscore__。这意味着,当导出在 Wiki 上显示为“粗体文本”时,导出的文本将在 Excel 中显示为括在双下划线之间:__bold text__
如果将 __bold text__ 导入回 Codebeamer,则其显示为“粗体文本”。这简化了“往返式”导出 (从 Codebeamer 导出到 Excel,然后导入回 Codebeamer)。
使用 Groovy 脚本将导出的内容转换为纯文本
如果要将 Codebeamer 内容导出到不带富文本标记的 Excel,则必须转换文本。以下 Groovy 脚本将导出的文本转换为不带富文本标记的纯文本:
org.apache.commons.text.StringEscapeUtils.unescapeHtml4(textFormatter.formatAsText(...))
具体来说,上述脚本包括两部分:
textFormatter.formatAsText(...)
org.apache.commons.text.StringEscapeUtils.unescapeHtml4(...)
脚本 (textFormatter.formatAsText(...)) 的第一部分具有以下功能:
1. 将 Wiki 呈现到 HTML。
2. 通过移除 HTML 标记将 HTML 转换为纯文本。例如,将 <b>bold</b> 转换为 bold
3. 使用 HTML4 转义对已转换的文本进行转义。这样做是为了避免任何 XSS 问题,因为此文本通常用于 WEB 页面。
HTML4 转义将导致转换的文本中出现一些构件。例如,脚本会将 " 转换为 &quot,因为 &quot" 的对等 HTML 实体。
脚本 (org.apache.commons.text.StringEscapeUtils.unescapeHtml4(...)) 的第二部分取消文本转义,这意味着在第一个脚本的最后一步撤消转义。例如,它会将 &quot 转换回 "
使用 Microsoft Word 导出 Codebeamer 内容
Microsoft Word 可以显示完整的 HTML 内容或富文本格式。使用 Word 将内容从 Wiki 中导出时,输出内容与 Codebeamer 内的文本相匹配。
使用正则表达式
正则表达式 (Regexp) 是您可能希望在 Excel 模板中使用的工具。例如,如果要从报告事项的用户的电子邮件中提取域名。下列用户/电子邮件已报告事项:
在像 javaforge 或 intland 这样应提取的单元格中获取域名,可以创建一份报告,说明按公司分组显示的错误报告的数量。因此,结果应为:
javaforge
intland
然后,可以使用正则表达式和下一个 Groovy 脚本,提取域部分:
<cb:groovy template="false" silent="false"> email = item.submitter.email; domainRegexp = /@(.*?)\./; matcher= (email =~ domainRegexp); return matcher[0][1];</cb:groovy>
使用此方法效果很好,但可能会比较复杂。另一种方法是使用可提取正则表达式的第一个匹配项的 Regexp:findFirst() 自定义函数。这将产生相同的结果:
${Regexp:findFirst(item.submitter.email, "@(.*?)\.", "$1")}
Regexp:findFirst() 函数将接受以下参数:
第 1 个参数是用于从中提取值的输入字符串。
第 2 个参数是在输入字符串中查找的正则表达式。
第 3 个参数为可选参数,包含用于指示提取对象的表达式。$0 文本提取完整匹配项,$1 从正则表达式中提取第 1 个组,依此类推。
此外,Regexp:findAll() 函数也可用,其工作原理与查找“第一个”方法类似,但会扫描所有匹配项,并将结果放入 (字符串) 列表中。
这对您有帮助吗?