# Report Designer XML Copy and Paste

**URL:** <https://forum.inductiveautomation.com/t/report-designer-xml-copy-and-paste/59230>\
**Category:** Ignition\
**Created:** [May 5, 2022, 2:15am UTC](https://forum.inductiveautomation.com/t/report-designer-xml-copy-and-paste/59230 "2022-05-05T02:15:06Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Aaron\_Shivne](https://avatars.discourse-cdn.com/v4/letter/a/a8b319/32.png) [@Aaron\_Shivne](https://forum.inductiveautomation.com/u/Aaron_Shivne)\
**Post date:** [May 5, 2022, 2:15am UTC](https://forum.inductiveautomation.com/t/report-designer-xml-copy-and-paste/59230/1 "2022-05-05T02:15:06Z")

</div>

It would be extremely helpful to be able to Copy out of the Report Designer, edit the XML file and paste it back in. This topic hints to a solution but I do not know how to make his code work for this propose.

> [@Report Designer XML Copy Out works, Paste back?](https://forum.inductiveautomation.com/t/report-designer-xml-copy-out-works-paste-back/20973):
>
> Hello, I use the Report Designer a lot. Its tedious to click through the GUI to align the Various Column Widths to be the same between a Header/ Details row or across align Column widths across Peer Tables. So I got a tip from Ignition Support that you can copy out a Table/ Table Group to Notepad. Just curious if anyone figured out how to get the XML back into to Report Designer? At least the XML copy out allows me to see all the Columns Widths I need to clean up to be the same. [TableGroup Co…](https://us1.discourse-cdn.com/inductiveautomation/original/2X/6/608d6aded53f0bfa7693ee17e7c79c335ee08585.txt)

I would appreciate an explanation of the script or an outright solution.

Thank you,

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [May 5, 2022, 3:42pm UTC](https://forum.inductiveautomation.com/t/report-designer-xml-copy-and-paste/59230/2 "2022-05-05T15:42:25Z")

</div>

Reporting only expects data to be pasted in in a certain “dataflavor” - that’s the cross-platform abstraction Java/Swing uses to interact with the system clipboard. So the script I have there is _mostly_ boilerplate to create a ‘MockReportMillClipboard’ Java object, which then gets copied to the system clipboard.  
This section at the end is the only part that actually _does_ anything with the data in the clipboard:

```auto
	dataflavor = None
	for df in clip.getAvailableDataFlavors():
		if df.mimeType == 'application/x-java-serialized-object; class=java.lang.String':
			dataflavor = df
			break
	if dataflavor:
		data = clip.getData(dataflavor)
		regex = r"<text(.*)>"
		subst = r'<text\g<1> url="%s">' % url
		result = re.sub(regex, subst, data, re.MULTILINE)
		print "Added URL to clipboard object"
		clip.setContents(MockReportMillClipboard(result), None)

```

First, it tries to extract the data from reportmill as a string (this will be the XML). `clip.getData(dataflavor)` returns that as a string. Then at the end, `clip.setContents` is used with the ‘MockReportMillClipboard’ to create an object that acts the same as real ReportMill data, which means the rest of the system just accepts it and lets you paste it in.

I recommend running that script in the designer, since the script console is available and gives you ~easy access to running scripts at the same time you’re editing a report.

---

<div class="post-metadata">

**Author:** ![Aaron\_Shivne](https://avatars.discourse-cdn.com/v4/letter/a/a8b319/32.png) [@Aaron\_Shivne](https://forum.inductiveautomation.com/u/Aaron_Shivne)\
**Post date:** [May 9, 2022, 11:53pm UTC](https://forum.inductiveautomation.com/t/report-designer-xml-copy-and-paste/59230/3 "2022-05-09T23:53:02Z")

</div>

I am giving this a try and get this error. I am trying to copy a Table component.  
This actually did work for graph component.

```auto
19:50:40.927 [AWT-EventQueue-0] WARN reporting.ReportMill.Editor - Exception encountered when retrieving shapes from clipboard
com.inductiveautomation.rm.base.RMException: Element type "text" must be followed by either attribute specifications, ">" or "/>".
	at com.inductiveautomation.rm.archiver.RXElement.getElement(RXElement.java:66)
	at com.inductiveautomation.rm.archiver.RXArchiver.readObject(RXArchiver.java:137)
	at com.inductiveautomation.rm.editor.RMEditorClipboard.getShapesFromClipboard(RMEditorClipboard.java:243)
	at com.inductiveautomation.rm.editor.RMEditorClipboard.paste(RMEditorClipboard.java:141)
	at com.inductiveautomation.rm.editor.RMEditorClipboard.paste(RMEditorClipboard.java:121)
	at com.inductiveautomation.rm.editor.RMEditor.paste(RMEditor.java:707)
	at com.inductiveautomation.reporting.designer.workspace.design.DesignerPanel.doRMPaste(DesignerPanel.java:120)
	at com.inductiveautomation.reporting.designer.workspace.ReportingResourceWorkspace$ReportDesignerEditActionHandler.doPaste(ReportingResourceWorkspace.java:759)
	at com.inductiveautomation.ignition.designer.IgnitionDesigner$Handler.handlePaste(IgnitionDesigner.java:2863)
	at com.inductiveautomation.ignition.designer.IgnitionDesigner$Handler$15.actionPerformed(IgnitionDesigner.java:2421)
	at java.desktop/javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at java.desktop/javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at java.desktop/javax.swing.AbstractButton.doClick(Unknown Source)
	at java.desktop/javax.swing.AbstractButton.doClick(Unknown Source)
	at java.desktop/javax.swing.plaf.basic.BasicMenuItemUI$Actions.actionPerformed(Unknown Source)
	at java.desktop/javax.swing.SwingUtilities.notifyAction(Unknown Source)
	at java.desktop/javax.swing.JComponent.processKeyBinding(Unknown Source)
	at java.desktop/javax.swing.JMenuBar.processBindingForKeyStrokeRecursive(Unknown Source)
	at java.desktop/javax.swing.JMenuBar.processBindingForKeyStrokeRecursive(Unknown Source)
	at java.desktop/javax.swing.JMenuBar.processBindingForKeyStrokeRecursive(Unknown Source)
	at java.desktop/javax.swing.JMenuBar.processKeyBinding(Unknown Source)
	at java.desktop/javax.swing.KeyboardManager.fireBinding(Unknown Source)
	at java.desktop/javax.swing.KeyboardManager.fireKeyboardAction(Unknown Source)
	at java.desktop/javax.swing.JComponent.processKeyBindingsForAllComponents(Unknown Source)
	at java.desktop/javax.swing.JComponent.processKeyBindings(Unknown Source)
	at java.desktop/javax.swing.JComponent.processKeyEvent(Unknown Source)
	at com.inductiveautomation.rm.viewer.RMViewer.processKeyEvent(RMViewer.java:943)
	at java.desktop/java.awt.Component.processEvent(Unknown Source)
	at java.desktop/java.awt.Container.processEvent(Unknown Source)
	at com.inductiveautomation.rm.editor.RMEditor.processEvent(RMEditor.java:1029)
	at java.desktop/java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.desktop/java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.desktop/java.awt.Component.dispatchEvent(Unknown Source)
	at java.desktop/java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
	at java.desktop/java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
	at java.desktop/java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
	at java.desktop/java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
	at java.desktop/java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
	at java.desktop/java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.desktop/java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.desktop/java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.desktop/java.awt.Component.dispatchEvent(Unknown Source)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.desktop/java.awt.EventQueue$4.run(Unknown Source)
	at java.desktop/java.awt.EventQueue$4.run(Unknown Source)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.desktop/java.awt.EventQueue$5.run(Unknown Source)
	at java.desktop/java.awt.EventQueue$5.run(Unknown Source)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.desktop/java.awt.EventQueue.dispatchEvent(Unknown Source)
	at com.inductiveautomation.snap.swing.RibsEventQueue.dispatchEvent(RibsEventQueue.java:99)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.run(Unknown Source)
Caused by: com.inductiveautomation.rm.base.RMException: Element type "text" must be followed by either attribute specifications, ">" or "/>".
	at com.inductiveautomation.rm.archiver.RXElementParser.fatalError(RXElementParser.java:184)
	at java.xml/com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(Unknown Source)
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(Unknown Source)
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.seekCloseOfStartTag(Unknown Source)
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
	at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
	at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
	at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
	at com.inductiveautomation.rm.archiver.RXElementParser.parse(RXElementParser.java:74)
	at com.inductiveautomation.rm.archiver.RXElement.getElement(RXElement.java:64)
	... 61 common frames omitted
Caused by: org.xml.sax.SAXParseException: Element type "text" must be followed by either attribute specifications, ">" or "/>".
	at java.xml/com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
	... 78 common frames omitted

```

---

<div class="post-metadata">

**Author:** ![bkarabinchak.psi](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/bkarabinchak.psi/32/83567_2.png) [@bkarabinchak.psi](https://forum.inductiveautomation.com/u/bkarabinchak.psi)\
**Post date:** [March 6, 2026, 4:04pm UTC](https://forum.inductiveautomation.com/t/report-designer-xml-copy-and-paste/59230/4 "2026-03-06T16:04:49Z")

</div>

Reviving a dead topic after having the displeasure of trying to match a report in ignition to an existing report in a differnet scada and needing to make things precise sizes. Right now the only way to make a row an exact size in the simple table is by dragging the row or column dividers still, you cannot manually set the pixels which makes getting exact sizing very difficult.

There are obvious xml properties that seem like changing would make this simple

```python
  <cell-table x="72" y="409" width="485" height="72" format-template-style="5" header-row-count="1" header-column-count="0">
    <column width="243" />
    <column width="242" />
    <row height="18" />
    <row height="18" />
    <row height="18" />
    <row height="18" />

```

Luckily my situation I know the rows were all identical heights so I just made the size correct from the start and then modified the number of rows and it was smart enough to equally divide. But width wise I was still left dragging column dividers. The normal table works a bit better but if I had many rows that were not repeating out of a dataset, I’d still be stuck doing each cell by hand.

It would be very very nice if we could edit the XML of the report design directly. I also ran into the situation mentioned in a prior post where font’s were not rendering correctly in PDF Viewer and I had to go and change 100’s of labels by hand with what could have otherwise been a control+F.

---

<div class="post-metadata">

**Author:** ![Vi\_Quang](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/vi_quang/32/82707_2.png) [@Vi\_Quang](https://forum.inductiveautomation.com/u/Vi_Quang)\
**Post date:** [March 9, 2026, 2:35pm UTC](https://forum.inductiveautomation.com/t/report-designer-xml-copy-and-paste/59230/5 "2026-03-09T14:35:37Z")

</div>

XML can be edited in 8.3.3

> **New in 8.3.3**
> 
> By holding the Shift key and right-clicking on the report, the Copy XML To Clipboard and Set XML From Clipboard options will be available at the bottom of the right-click menu. These allow you to copy the contents of a report in an XML format, and then paste the XML into another report.

> **[Report Designer Interface | Ignition User Manual](https://www.docs.inductiveautomation.com/docs/8.3/ignition-modules/reporting/report-designer-interface)**
>
> Built to be intuitive and familiar, the Reporting workspace has a logical workflow which makes it easy for anyone to create meaningful reports. Before we talk about the workflow, let's first mention where you create and find your Reports. Any report...

---

<div class="post-metadata">

**Author:** ![Porter\_Ellis](https://avatars.discourse-cdn.com/v4/letter/p/ed8c4c/32.png) [@Porter\_Ellis](https://forum.inductiveautomation.com/u/Porter_Ellis)\
**Post date:** [April 23, 2026, 3:53pm UTC](https://forum.inductiveautomation.com/t/report-designer-xml-copy-and-paste/59230/6 "2026-04-23T15:53:45Z")

</div>

Shift+Right-Click does not bring up the options for XML copying/pasting on my 8.3.5 designer. It also does not work on any of my 8.1 designers. Is there a toggle I need to change, or is this a bug?

---

<div class="post-metadata">

**Author:** ![Vi\_Quang](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/vi_quang/32/82707_2.png) [@Vi\_Quang](https://forum.inductiveautomation.com/u/Vi_Quang)\
**Post date:** [April 23, 2026, 8:44pm UTC](https://forum.inductiveautomation.com/t/report-designer-xml-copy-and-paste/59230/7 "2026-04-23T20:44:37Z")

</div>

I just tested this on both Windows and MacOS, and it works on both. This in only in 8.3. I would say try again and make sure that you have a Report selected the first. Then shift + right click on that selected report.

---

<div class="post-metadata">

**Author:** ![Porter\_Ellis](https://avatars.discourse-cdn.com/v4/letter/p/ed8c4c/32.png) [@Porter\_Ellis](https://forum.inductiveautomation.com/u/Porter_Ellis)\
**Post date:** [April 23, 2026, 9:06pm UTC](https://forum.inductiveautomation.com/t/report-designer-xml-copy-and-paste/59230/8 "2026-04-23T21:06:05Z")

</div>

I figured it out. Originally I was clicking on an object in the window when I should have been clicking on the tag browser.
