xtrareports-devexpress-dot-xtrareports-dot-web-dot-webdocumentviewer-dot-webdocumentvieweroperationlogger-dot-n-f-y-8-p.md
The method allows you to implement custom logic for asynchronous export of a report document.
Namespace : DevExpress.XtraReports.Web.WebDocumentViewer
Assembly : DevExpress.XtraReports.v25.2.Web.dll
NuGet Package : DevExpress.Web.Reporting.Common
public virtual ExportedDocument ExportDocumentStarting(
string documentId,
string asyncExportOperationId,
string format,
ExportOptions options,
PrintingSystemBase printingSystem,
Func<ExportedDocument> doExportSynchronously
)
Public Overridable Function ExportDocumentStarting(
documentId As String,
asyncExportOperationId As String,
format As String,
options As ExportOptions,
printingSystem As PrintingSystemBase,
doExportSynchronously As Func(Of ExportedDocument)
) As ExportedDocument
| Name | Type | Description |
|---|---|---|
| documentId | String |
A String value that identifies a document.
| | asyncExportOperationId | String |
A String value that identifies the export operation.
| | format | String |
A String value that specifies the export format.
| | options | ExportOptions |
An ExportOptions object.
| | printingSystem | PrintingSystemBase |
A PrintingSystemBase object.
| | doExportSynchronously | Func<ExportedDocument> |
A System.Func delegate.
|
| Type | Description |
|---|---|
| ExportedDocument |
An exported document.
|
You can override the ExportDocumentStarting method to implement custom export procedures that allows you to modify a report before export or post-process an exported document.
Note
Register the MyOperationLogger service as described in the WebDocumentViewerOperationLogger topic.
The following code creates a “Hello World” report document and export it to PDF when the user executes the Export to PDF command. The command Export to XLS or Export to XLSX instantiates a custom report, modifies it and exports to a spreadsheet file.
using DevExpress.XtraPrinting;
using DevExpress.XtraReports.UI;
using DevExpress.XtraReports.Web.ClientControls;
using DevExpress.XtraReports.Web.WebDocumentViewer;
using System;
using System.IO;
public class MyOperationLogger : WebDocumentViewerOperationLogger
{
public override ExportedDocument ExportDocumentStarting(string documentId,
string asyncExportOperationId, string format, ExportOptions options,
PrintingSystemBase printingSystem, Func<ExportedDocument> doExportSynchronously)
{
switch (format)
{
case "pdf":
{
// Creates a one-page NEW report.
var report = new XtraReport();
var detail = new DetailBand();
detail.Controls.Add(new XRLabel() { Text = "Hello World!" });
report.Bands.Add(detail);
byte[] bytes;
using (MemoryStream ms = new MemoryStream())
{
report.ExportToPdf(ms, options.Pdf);
bytes = ms.ToArray();
}
return new ExportedDocument(bytes, @"application/pdf", "inline", "SampleOnePageReport.pdf");
}
case "xls":
case "xlsx":
{
// Modifies an existing report.
var report = new TestReport();
XRTable table = report.FindControl("table3", true) as XRTable;
table.BackColor = System.Drawing.Color.LightGreen;
byte[] bytes;
using (MemoryStream ms = new MemoryStream())
{
report.ExportToXlsx(ms, options.Xlsx);
bytes = ms.ToArray();
}
return new ExportedDocument(bytes, @"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "inline", "SampleGreenCells.xlsx");
}
default: return base.ExportDocumentStarting(documentId,
asyncExportOperationId, format, options, printingSystem, doExportSynchronously);
}
}
}
You can implement a custom export action that is performed when the user selects Image: JPEG item in the Export drop-down menu.
The following code is the CustomizeMenuActions event handler that adds a new command item to the Document Viewer menu:
function onCustomizeMenu(s, e) {
var actionExportTo = e.GetById(DevExpress.Reporting.Viewer.ActionId.ExportTo);
actionExportTo.items()[0].items.push({
format: "JPEG",
text: "Image: JPEG",
});
}
'use client';
import React from 'react';
import ReportViewer, { RequestOptions, Callbacks } from 'devexpress-reporting-react/dx-report-viewer';
import { ActionId } from "devexpress-reporting/viewer/constants";
const App = () => {
const onCustomizeMenuActions = (event: any): void => {
const actionExportTo = event.args.GetById(ActionId.ExportTo);
const newFormat = { format: 'JPEG', text: 'Image: JPEG' };
if (actionExportTo) {
actionExportTo.events.on('propertyChanged', (args: any) => {
const formats = actionExportTo.items[0].items;
if (args.propertyName === 'items' && formats.indexOf(newFormat) === -1) {
formats.push(newFormat);
}
});
}
};
return (
<ReportViewer reportUrl="TestExportReport">
<RequestOptions host="http://localhost:5000/" invokeAction="DXXRDV" />
<Callbacks CustomizeMenuActions={onCustomizeMenuActions} />
</ReportViewer>
);
};
export default App;
The following code creates a TestReport document and exports it to JPEG format:
using DevExpress.XtraPrinting;
using DevExpress.XtraReports.UI;
using DevExpress.XtraReports.Web.ClientControls;
using DevExpress.XtraReports.Web.WebDocumentViewer;
using System;
using System.Drawing.Imaging;
using System.IO;
public class MyOperationLogger : WebDocumentViewerOperationLogger
{
public override ExportedDocument ExportDocumentStarting(string documentId,
string asyncExportOperationId, string format, ExportOptions options,
PrintingSystemBase printingSystem, Func<ExportedDocument> doExportSynchronously)
{
switch (format)
{
case "JPEG":
{
var report = new TestReport();
byte[] bytes;
using (MemoryStream ms = new MemoryStream())
{
report.ExportToImage(ms,
new ImageExportOptions()
{
Format = ImageFormat.Jpeg,
ExportMode = ImageExportMode.SingleFilePageByPage,
PageRange = "1"
});
bytes = ms.ToArray();
}
return new ExportedDocument(bytes, @"image/jpeg", "inline", "SampleImage.jpeg");
}
default: return base.ExportDocumentStarting(documentId,
asyncExportOperationId, format, options, printingSystem, doExportSynchronously);
}
}
}
The following code adds comments to the cells of the exported XLSX spreadsheet.
using DevExpress.Spreadsheet;
using DevExpress.XtraPrinting;
using DevExpress.XtraReports.Web.ClientControls;
using DevExpress.XtraReports.Web.WebDocumentViewer;
using System;
using System.IO;
public class MyOperationLogger : WebDocumentViewerOperationLogger
{
public override ExportedDocument ExportDocumentStarting(string documentId,
string asyncExportOperationId, string format,
ExportOptions options, PrintingSystemBase printingSystem,
Func<ExportedDocument> doExportSynchronously)
{
// ...
if (format == "xls" || format == "xlsx")
{
// Calls the default Export procedure.
ExportedDocument document = doExportSynchronously();
// Transforms the exported document to a Workbook class instance.
IWorkbook workbook = new Workbook();
workbook.LoadDocument(document.Bytes);
Worksheet worksheet = workbook.Worksheets[0];
// Gets the username.
string author = workbook.CurrentAuthor;
// Adds a comment to the A1 cell.
Cell cell = worksheet.Cells["A1"];
Comment comment = worksheet.Comments.Add(cell, author,
"This is important information for users.");
// Adds a user name to beginning of the comment.
CommentRunCollection runs = comment.Runs;
runs.Insert(0, author + ": \r\n");
runs[0].Font.Bold = true;
// Formats the comment text.
runs[1].Font.Color = System.Drawing.Color.Red;
runs[1].Font.Name = "Times New Roman";
runs[1].Font.Size = 14;
runs[1].Font.Italic = true;
// Adds a new comment to the document collection of 'runs'.
runs.Add("\n Never delete this comment!");
runs[2].Font.Color = System.Drawing.Color.MidnightBlue;
// Saves the modified document.
MemoryStream ms = new MemoryStream();
workbook.SaveDocument(ms, (format == "xls") ? DocumentFormat.Xls : DocumentFormat.Xlsx);
document.Bytes = ms.ToArray();
return document;
}
return base.ExportDocumentStarting(documentId,
asyncExportOperationId, format, options,
printingSystem, doExportSynchronously);
}
}
Note
The Workbook class is defined in the DevExpress.Docs.v25.2.dll assembly. Add this assembly or install the DevExpress.Document.Processor NuGet package to your project to use the Workbook API. You need a license for the DevExpress Office File API Subscription or DevExpress Universal Subscription to use this assembly in production code.
The following code snippet (auto-collected from DevExpress Examples) contains a reference to the ExportDocumentStarting(String, String, String, ExportOptions, PrintingSystemBase, Func<ExportedDocument>) method.
Note
The algorithm used to collect these code examples remains a work in progress. Accordingly, the links and snippets below may produce inaccurate results. If you encounter an issue with code examples below, please use the feedback form on this page to report the issue.
SaveUsedEntityId(Constants.ExportedDocumentDictionaryName, asyncExportOperationId);
return base.ExportDocumentStarting(documentId, asyncExportOperationId, format, options,
printingSystem, doExportSynchronously);
SaveUsedEntityId(Constants.ExportedDocumentDictionaryName, asyncExportOperationId)
Return MyBase.ExportDocumentStarting(documentId, asyncExportOperationId, format,
options, printingSystem, doExportSynchronously)
See Also
WebDocumentViewerOperationLogger Class