Back to Devexpress

WebDocumentViewerOperationLogger.ExportDocumentStarting(String, String, String, ExportOptions, PrintingSystemBase, Func<ExportedDocument>) Method

xtrareports-devexpress-dot-xtrareports-dot-web-dot-webdocumentviewer-dot-webdocumentvieweroperationlogger-dot-n-f-y-8-p.md

latest14.6 KB
Original Source

WebDocumentViewerOperationLogger.ExportDocumentStarting(String, String, String, ExportOptions, PrintingSystemBase, Func<ExportedDocument>) Method

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

Declaration

csharp
public virtual ExportedDocument ExportDocumentStarting(
    string documentId,
    string asyncExportOperationId,
    string format,
    ExportOptions options,
    PrintingSystemBase printingSystem,
    Func<ExportedDocument> doExportSynchronously
)
vb
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

Parameters

NameTypeDescription
documentIdString

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.

|

Returns

TypeDescription
ExportedDocument

An exported document.

|

Remarks

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.

Example: Override the Export to PDF/XLS/XLSX Action

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.

csharp
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);
        }
    }
}

Example: Implement a Custom Export Action

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:

js
function onCustomizeMenu(s, e) {
        var actionExportTo = e.GetById(DevExpress.Reporting.Viewer.ActionId.ExportTo);
        actionExportTo.items()[0].items.push({
            format: "JPEG",
            text: "Image: JPEG",
        });
}
typescript
'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:

csharp
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);
        }
    }
}

Example: Add a Comment to the Document Exported to XLSX Format

The following code adds comments to the cells of the exported XLSX spreadsheet.

csharp
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.

reporting-mvc-implement-a-custom-authorization-service/CS/AuthorizationService/Services/OperationLogger.cs#L35

csharp
SaveUsedEntityId(Constants.ExportedDocumentDictionaryName, asyncExportOperationId);
return base.ExportDocumentStarting(documentId, asyncExportOperationId, format, options,
    printingSystem, doExportSynchronously);

reporting-mvc-implement-a-custom-authorization-service/VB/AuthorizationService/Services/OperationLogger.vb#L37

vb
SaveUsedEntityId(Constants.ExportedDocumentDictionaryName, asyncExportOperationId)
Return MyBase.ExportDocumentStarting(documentId, asyncExportOperationId, format,
                                     options, printingSystem, doExportSynchronously)

See Also

WebDocumentViewerOperationLogger Class

WebDocumentViewerOperationLogger Members

DevExpress.XtraReports.Web.WebDocumentViewer Namespace