Search code examples
cpu-wordjsreport

JSReport -- working with docxChild. I can't resolve the error : "docxChild helper requires asset parameter to be set"


I'm trying many functionality on jsReport and word and got stuck on this one.

I want to create an asset usable in different template, assuming that my asset got the right data.

Using this documentation and the UI jsReport Studio I create a working template called test-word, I upload a docx test_jsReport.docx with some ahnddlebar in it, create some data and it work.

Then I create an asset, in the same folder, with a second docx test_jsReport2.docx ; put some code and try to generate it alone with the same data, it worked again.

At this point my project look like this : test project

Then, using this chapter I add in my docx test_jsReport.docx the following code : {{docxChild "test_jsReport2.docx"}}.

So I can no longer run my report, the error is the following.

Report "test-word" render failed.

Error while executing docx recipe
(because) error when evaluating engine handlebars for template anonymous
(because) "docxChild" helper call failed
(because) docxChild helper requires asset parameter to be set

(system-helpers.js line 706:11)

  704 |
  705 |   if (assetNamePathOrObject == null) {
> 706 |     throw new Error('docxChild helper requires asset parameter to be set')
      |           ^
  707 |   }
  708 |
  709 |   const docxChildInfo = {}

What is that aset parameter that I need to set ? And how to do it ?

I'm pretty sure that I should omehow declare some kind of link beween my two reports, but I can't find how to do that.

First I tried to use the asset property in jsReport studio on my report, like this :

first try

But it doesn't worked and I never really believe it, I think it's an option to define a link to the physical docx I modify, so I don't have to upload after each save.

Second I read and try to mimic some other systems I can find in the doc like this and that and but it's for HTML report not word.

Lastly I tried to reference my report using a script like this :

const jsreport = require('jsreport-proxy')
// Use the "beforeRender" or "afterRender" hook
// to manipulate and control the report generation
async function beforeRender (req, res) {
    await jsreport.assets.registerHelpers('test_jsReport2.js')
}

It doesn't work either.

I'm a little lost here, what is the right way to use docxChild ?

Here is a link to an example of what I do : https://playground.jsreport.net/w/anon/Pm_vIEwF

Here is how I setup the example :

  1. I prepared my two word
  2. Right click > new entity > template
  3. Select handdlebars and docx > next > next
  4. Click on my template > in properties, in docx I upload my main.docx
  5. Right click > new entity > asset > upload, i put my subreport.docx

Solution

  • The docxChild feature works by searching a docx asset and take the content of such docx and insert it into the docx it was called from. You have follow the right steps, but the only issue is that you are using different characters for the quotes in your docxChild helper call. It was perhaps not your intention, for example on macos i noticed that whenever i try to use " it replace it for the characters present in your docx, so maybe if you are using macos this is the problem you are having.

    Your original template enter image description here

    What should look like to have it working enter image description here

    I've prepared a playground example with your same code but fixing the docxChild call to use the right quote characters "",