Copy or Move a Report Page to a Different Report

How can I move a page from 1 report to another report? I do not see an easy way to do it.

Iā€™m wondering the same, I want to duplicate a page in the same report

Any way to do this simply? I am also wondering.

Bump, same question. It is painful to duplicate one currently..

Well, by some definition of "easy", this works. I put this all in the script console, but you should able to park the script in the project library and just invoke from the script console.

Grumble grumble don't call into support if this doesn't work. This snippet is provided with no warranty, no expectations or disclaimers of support, your mileage may vary, etc. If you are encountering an issue with this, please post it here on this thread or make a new public forum thread about it, linking to this post.

from time import sleep
from java.awt import EventQueue
from java.lang import Runnable
from com.inductiveautomation.rm.editor import RMEditorClipboard, RMEditorPaneUtils
from com.inductiveautomation.reporting.designer.workspace import ReportingResourceWorkspace
from com.inductiveautomation.ignition.designer import IgnitionDesigner
from com.inductiveautomation.reporting.common.resource import ReportResource
from com.inductiveautomation.ignition.common.project.resource import ResourcePath

def copyPage(sourceReport, sourcePage, targetReport, targetPage = -1):
	designer = IgnitionDesigner.getFrame()
	workspaceManager = designer.workspace
	
	reportWorkspace = None
	for i in range(workspaceManager.workspaceCount):
		workspace = workspaceManager.getWorkspace(i)
		if workspace.key == ReportingResourceWorkspace.WORKSPACE_KEY:
			reportWorkspace = workspace
	
	class OpenReport(Runnable):
		def __init__(self, path):
			self.path = path
		
		def run(self):
			resourcePath = ResourcePath(ReportResource.RESOURCE_TYPE, self.path)
			reportWorkspace.open(resourcePath)
			sleep(1)
			sourceEditor = reportWorkspace.findEditor(resourcePath).orElseThrow()
		
			sourceEditor.showDesignPanel()
			sleep(1)
	
	EventQueue.invokeAndWait(OpenReport(sourceReport))
	sleep(1)
	
	pageToCopy = RMEditorPaneUtils.getMainEditor().document.getPage(sourcePage)
	
	EventQueue.invokeAndWait(OpenReport(targetReport))
	sleep(1)
	
	if targetPage >= 0:
		RMEditorPaneUtils.getMainEditor().document.addPage(pageToCopy, targetPage)
		print "Copied page", sourcePage, "from report", sourceReport, "to report", targetReport, "at page", targetPage
	else:
		RMEditorPaneUtils.getMainEditor().document.addPage(pageToCopy)
		print "Copied page", sourcePage, "from report", sourceReport, "to the end of report", targetReport

sourceReport = "a"
sourcePage = 0 # 0 index
targetReport = "b"
targetPage = -1 # -1 to append to the end, or a 0-indexed page to insert

copyPage(sourceReport, sourcePage, targetReport, targetPage)
1 Like

Hah!

Thank you for the "easy" solution, it works like a charm!

1 Like

Isn't sleep a concern?

Yes, but less so when called from the scripting console.

I saw copy on a page when I right clicked it. When I pasted, which I could only seem to paste to another page, one single element was pasted.

Why is copying pages in the reports not easier?

I am happy I can copy whole reports.

Because it's very rarely useful, I would guess. It's relatively uncommon that you would actually want an exact duplicate of a whole page in another report, and duplicating it exactly would actually work.

If it's some kind of a "styling" thing you're trying to achieve, expect some news on that front in future updates of Ignition.

Copying saves me time.

If I want to move my page 14 to the 18th page, do I need the script?