我正在使用 Aspose (Java) 和 LINQ 报告语法来动态构建报告。这篇文档解释了如何在文档中插入超链接。通常,它看起来像这样
<<link [uri_or_bookmark_expression] [display_text_expression]>>
最后一段指出“在构建报告时...”,我将其解释为正在执行buildReport()。出于显而易见的原因,我们无论如何都需要执行 buildReport。但是我们使用 buildReport() 时的输出是无效的,因此没有正确转换为 Word 文档中的超链接。
_engine = new ReportingEngine();
_engine.getKnownTypes().add(Helper.class);
_engine.setOptions(ReportBuildOptions.ALLOW_MISSING_MEMBERS | ReportBuildOptions.REMOVE_EMPTY_PARAGRAPHS);
Document document = new Document;
DocumentBuilder builder = new DocumentBuilder(document);
builder.writer("<<link LinkLabel>>");
//document.getText(): <<link LinkLabel>>
_engine.buildReport(document, dataSource, "NewDoc");
//document.getText() now: HYPERLINK \l "LinkLabel"
建造前:
<<link LinkLabel>>
构建后:
HYPERLINK \l "LinkLabel"
所以看起来尝试将 LINQ 报告语法转换为 Word 友好代码。但是 Word 友好的结果是无效的。 当我在 Word 中手动创建超链接时,它会生成以下代码(当我使用 Alt+F9 显示它时):
{ HYPERLINK \l "LinkLabel" }
。因此,在 buildReport 中似乎去掉了波浪形括号({ 和 }
)。为什么要放弃它们?还是我的一个/一些假设不对?
LinkLabel
在你的表达式中应该用方括号括起来。所以构建报告之前的表达式应该是这样的:
<<link [LinkLabel]>>
其中
LinkLabel
是包含 url 或书签名称的变量名称。例如看下面的代码:
Document document = new Document();
DocumentBuilder builder = new DocumentBuilder(document);
builder.write("<<link [LinkLabel]>>");
ReportingEngine engine = new ReportingEngine();
engine.buildReport(document, "https://www.aspose.com/", "LinkLabel");
document.save("C:\\Temp\\out.docx");
在这种情况下,url 也用作显示的文本。如果需要使用不同的值作为显示文本,则应使用第二个参数:
Document document = new Document();
DocumentBuilder builder = new DocumentBuilder(document);
// Define variables with url and displayed text.
// In real case the data will come from your data source.
builder.write("<<var [url=\"https://www.aspose.com/\"]>>");
builder.write("<<var [displayed_text=\"Link To Aspose Web Site\"]>>");
builder.write("<<link [url] [displayed_text]>>");
ReportingEngine engine = new ReportingEngine();
engine.buildReport(document, new Object());
document.save("C:\\Temp\\out.docx");