以编程方式使用 M2Doc:生成的 .docx 文档中的错误
Posted
技术标签:
【中文标题】以编程方式使用 M2Doc:生成的 .docx 文档中的错误【英文标题】:Using M2Doc programmatically : Error in the generated .docx document 【发布时间】:2019-08-19 08:48:45 【问题描述】:我正在尝试以编程方式使用 M2Doc,我设法生成了我的 .docx
文件,而在验证部分没有出现错误,但在生成的文档中出现以下错误:
m:self.Name Couldn't find the 'aqlFeatureAccess(org.eclipse.emf.common.util.URI.Hierarchical,java.lang.String)' service
“self.Name”部分是我在模板中写的。
我认为我缺少对服务的某种引用,但我不知道如何修复它。
self 变量是对基于我创建的元模型的模型的引用。但我不确定我是否在代码中正确导入了它。
我的代码基于我在 M2Doc website 上找到的代码 + 我在他们的 GitHub 上找到的一些代码,尤其是关于如何在 queryEnvironment 中添加服务的代码。
我搜索了 acceleo 和 M2Doc 的源代码,看看他们添加了哪些服务,但似乎他们已经导入了我正在使用的所有服务。
正如我所说,验证部分进展顺利,并没有生成验证文件。
public static void parseDocument(String templateName) throws Exception
final URI templateURI = URI.createFileURI("Template/"+templateName+"."+M2DocUtils.DOCX_EXTENSION_FILE);
final IQueryEnvironment queryEnvironment =
org.eclipse.acceleo.query.runtime.Query.newEnvironmentWithDefaultServices(null);
final Map<String, String> options = new HashMap<>(); // can be empty
M2DocUtils.prepareEnvironmentServices(queryEnvironment, templateURI, options); // delegate to IServicesConfigurator
prepareEnvironmentServicesCustom(queryEnvironment, options);
final IClassProvider classProvider = new ClassProvider(ClassLoader.getSystemClassLoader()); // use M2DocPlugin.getClassProvider() when running inside Eclipse
try (DocumentTemplate template = M2DocUtils.parse(templateURI, queryEnvironment, classProvider))
ValidationMessageLevel validationLevel = validateDocument(template, queryEnvironment, templateName);
if(validationLevel == ValidationMessageLevel.OK)
generateDocument(template, queryEnvironment, templateName, "Model/ComplexKaosModel.kaos");
public static void prepareEnvironmentServicesCustom(IQueryEnvironment queryEnvironment, Map<String, String> options)
Set<IService> services = ServiceUtils.getServices(queryEnvironment, FilterService.class);
ServiceUtils.registerServices(queryEnvironment, services);
M2DocUtils.getConfigurators().forEach((configurator) ->
ServiceUtils.registerServices(queryEnvironment, configurator.getServices(queryEnvironment, options));
);
public static void generateDocument(DocumentTemplate template, IQueryEnvironment queryEnvironment,
String templateName, String modelPath)throws Exception
final Map<String, Object> variable = new HashMap<>();
variable.put("self", URI.createFileURI(modelPath));
final Monitor monitor = new BasicMonitor.Printing(System.out);
final URI outputURI = URI.createFileURI("Generated/"+templateName+".generated."+M2DocUtils.DOCX_EXTENSION_FILE);
M2DocUtils.generate(template, queryEnvironment, variable, outputURI, monitor);
【问题讨论】:
【参考方案1】:变量“self”包含一个URI:
variable.put("self", URI.createFileURI(modelPath));
您必须加载您的模型并将 self 的值设置为您模型中的一个元素,例如:
final ResourceSet rs = new ResourceSetImpl();
final Resource r = rs.getResource(uri, true);
final EObject value = r.getContents()...;
variable.put("self", value);
您可以在EMF documentation 中获取有关资源加载的更多详细信息。
【讨论】:
感谢您的回答!这个链接特别帮助了我很多Binding XML to Java,我已经按照相同的步骤注册了我的元模型,但我不知道我也需要为我的模型做这件事,现在效果很好!以上是关于以编程方式使用 M2Doc:生成的 .docx 文档中的错误的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 M2DOC 在我的 wordx 中打印图表(DRepresentation 的集合)
LibreOffice/OpenOffice 能否以编程方式向现有的 .docx/.xlsx/.pptx 文件添加密码?
通过将文件(即 docx、xlsx、txt)发送到“Microsoft XPS Document Writer”打印机,以编程方式将文件(即 docx、xlsx、txt)转换(保存)为 XPS