From 01a586e5c16c714a3d46398df781188c42e2aeec Mon Sep 17 00:00:00 2001 From: DinakarSF4212 <147583019+DinakarSF4212@users.noreply.github.com> Date: Fri, 27 Feb 2026 17:46:08 +0530 Subject: [PATCH] =?UTF-8?q?1011162:=20Revamp=20the=20=E2=80=9COpen=20and?= =?UTF-8?q?=20Save=E2=80=9D=20Section=20in=20the=20React=20Spreadsheet=20U?= =?UTF-8?q?G=20Documentation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Document-Processing-toc.html | 23 +- .../Open-Excel-File/from-aws-s3-bucket.md | 176 ++++ .../from-azure-blob-storage.md | 154 +++ .../from-google-cloud-storage.md | 145 +++ .../React/Save-Excel-File/to-aws-s3-bucket.md | 159 ++++ .../Save-Excel-File/to-azure-blob-storage.md | 126 +++ .../to-google-cloud-storage.md | 114 +++ ...adsheet-docker-to-azure-using-azure-cli.md | 91 ++ ...eet-server-to-azure-using-visual-studio.md | 57 ++ ...readsheet-server-docker-image-overview.md} | 2 +- .../Spreadsheet/React/data-validation.md | 106 +++ .../Spreadsheet/React/images/azure-cli.png | Bin 0 -> 40547 bytes .../React/images/azure_app_service.png | Bin 0 -> 41357 bytes .../React/images/azure_credentials.png | Bin 0 -> 28683 bytes .../React/images/azure_publish.png | Bin 0 -> 94825 bytes .../React/images/azure_published_window.png | Bin 0 -> 57076 bytes .../Spreadsheet/React/images/azure_target.png | Bin 0 -> 33714 bytes .../Spreadsheet/React/open-excel-files.md | 555 +++++++++++ .../Excel/Spreadsheet/React/open-save.md | 894 ------------------ .../Spreadsheet/React/save-excel-files.md | 458 +++++++++ .../Spreadsheet/React/server-deployment.md | 17 + 21 files changed, 2180 insertions(+), 897 deletions(-) create mode 100644 Document-Processing/Excel/Spreadsheet/React/Open-Excel-File/from-aws-s3-bucket.md create mode 100644 Document-Processing/Excel/Spreadsheet/React/Open-Excel-File/from-azure-blob-storage.md create mode 100644 Document-Processing/Excel/Spreadsheet/React/Open-Excel-File/from-google-cloud-storage.md create mode 100644 Document-Processing/Excel/Spreadsheet/React/Save-Excel-File/to-aws-s3-bucket.md create mode 100644 Document-Processing/Excel/Spreadsheet/React/Save-Excel-File/to-azure-blob-storage.md create mode 100644 Document-Processing/Excel/Spreadsheet/React/Save-Excel-File/to-google-cloud-storage.md create mode 100644 Document-Processing/Excel/Spreadsheet/React/Server-Deployment/deploy-spreadsheet-docker-to-azure-using-azure-cli.md create mode 100644 Document-Processing/Excel/Spreadsheet/React/Server-Deployment/publish-spreadsheet-server-to-azure-using-visual-studio.md rename Document-Processing/Excel/Spreadsheet/React/{docker-deployment.md => Server-Deployment/spreadsheet-server-docker-image-overview.md} (99%) create mode 100644 Document-Processing/Excel/Spreadsheet/React/data-validation.md create mode 100644 Document-Processing/Excel/Spreadsheet/React/images/azure-cli.png create mode 100644 Document-Processing/Excel/Spreadsheet/React/images/azure_app_service.png create mode 100644 Document-Processing/Excel/Spreadsheet/React/images/azure_credentials.png create mode 100644 Document-Processing/Excel/Spreadsheet/React/images/azure_publish.png create mode 100644 Document-Processing/Excel/Spreadsheet/React/images/azure_published_window.png create mode 100644 Document-Processing/Excel/Spreadsheet/React/images/azure_target.png create mode 100644 Document-Processing/Excel/Spreadsheet/React/open-excel-files.md delete mode 100644 Document-Processing/Excel/Spreadsheet/React/open-save.md create mode 100644 Document-Processing/Excel/Spreadsheet/React/save-excel-files.md create mode 100644 Document-Processing/Excel/Spreadsheet/React/server-deployment.md diff --git a/Document-Processing-toc.html b/Document-Processing-toc.html index 20910f23de..f002eee8ac 100644 --- a/Document-Processing-toc.html +++ b/Document-Processing-toc.html @@ -5274,8 +5274,27 @@
  • Getting Started
  • Getting Started with NextJS
  • Data Binding
  • -
  • Open and Save
  • -
  • Docker Deployment
  • +
  • Open Excel Files + +
  • +
  • Save Excel Files + +
  • +
  • Server Deployment + +
  • Worksheet
  • Cell Range
  • Editing
  • diff --git a/Document-Processing/Excel/Spreadsheet/React/Open-Excel-File/from-aws-s3-bucket.md b/Document-Processing/Excel/Spreadsheet/React/Open-Excel-File/from-aws-s3-bucket.md new file mode 100644 index 0000000000..724e02e9b3 --- /dev/null +++ b/Document-Processing/Excel/Spreadsheet/React/Open-Excel-File/from-aws-s3-bucket.md @@ -0,0 +1,176 @@ +--- +layout: post +title: Opening excel from AWS S3 in React Spreadsheet control | Syncfusion +description: Learn about how to Open an Excel file from AWS S3 in React Spreadsheet control of Syncfusion Essential JS 2 and more details. +platform: document-processing +control: Open file from AWS S3 +documentation: ug +--- + +# Open file from AWS S3 + +To load a file from AWS S3 in a Spreadsheet Component, you can follow the steps below + +**Step 1:** Create a Simple Spreadsheet Sample in React + +Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/excel/spreadsheet/react/getting-started) to create a simple Spreadsheet sample in React. This will give you a basic setup of the Spreadsheet component. + +**Step 2:** Modify the `SpreadsheetController.cs` File in the Web Service Project + +1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/blogs/post/host-spreadsheet-open-and-save-services) for instructions on how to create a web service project. + +2. Open the `SpreadsheetController.cs` file in your web service project. + +3. Import the required namespaces at the top of the file: + +```csharp + +using Amazon; +using Amazon.Runtime; +using Amazon.S3; +using Amazon.S3.Model; +using Amazon.S3.Transfer; + +``` + +4. Add the following private fields and constructor parameters to the `SpreadsheetController` class, In the constructor, assign the values from the configuration to the corresponding fields. + +```csharp + +private IConfiguration _configuration; +public readonly string _accessKey; +public readonly string _secretKey; +public readonly string _bucketName; + +public SpreadsheetController(IWebHostEnvironment hostingEnvironment, IMemoryCache cache, IConfiguration configuration) +{ + _hostingEnvironment = hostingEnvironment; + _cache = cache; + _configuration = configuration; + _accessKey = _configuration.GetValue("AccessKey"); + _secretKey = _configuration.GetValue("SecretKey"); + _bucketName = _configuration.GetValue("BucketName"); +} + +``` + +5. Create the `OpenFromS3()` method to open the document from the AWS S3 bucket. + +```csharp + +[Route("api/[controller]")] +[ApiController] +public class SpreadsheetController : ControllerBase +{ + [HttpPost] + [Route("OpenFromS3")] + public async Task OpenFromS3([FromBody] FileOptions options) + { + try + { + //Set AWS region and credentials + var region = RegionEndpoint.USEast1; + var config = new AmazonS3Config { RegionEndpoint = region }; + var credentials = new BasicAWSCredentials("your-access-key", "your-secretkey"); + //Create an S3 client to interact with AWS + using (var client = new AmazonS3Client(credentials, config)) + { + using (MemoryStream stream = new MemoryStream()) + { + //Get the full file name using input from the client + string bucketName = "your-bucket-name"; + string fileName = options.FileName + options.Extension; + //Download the file from S3 into memory + var response = await client.GetObjectAsync(new GetObjectRequest + { + BucketName = bucketName, + Key = fileName + }); + await response.ResponseStream.CopyToAsync(stream); + stream.Position = 0; // Reset stream position for reading + //Wrap the stream as a FormFile for processing + OpenRequest open = new OpenRequest + { + File = new FormFile(stream, 0, stream.Length, options.FileName, fileName) + }; + //Convert Excel file to JSON using Workbook.Open method. + var result = Workbook.Open(open); + //Return the JSON result to the client + return Content(result, "application/json"); + } + } + } + catch (Exception ex) + { + // Handle any errors and return a message + Console.WriteLine($"Error: {ex.Message}"); + return Content("Error occurred while processing the file."); + } + } + + // To receive file details from the client. + public class FileOptions + { + public string FileName { get; set; } = string.Empty; + public string Extension { get; set; } = string.Empty; + } +} + +``` + +6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration. + +```json + +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "AccessKey": "Your Access Key from AWS S3", + "SecretKey": "Your Secret Key from AWS S3", + "BucketName": "Your Bucket name from AWS S3" +} + +``` + +N> Replace **Your Access Key from AWS S3**, **Your Secret Key from AWS S3**, and **Your Bucket name from AWS S3** with your actual AWS access key, secret key and bucket name. + +**Step 3:** Modify the index File in the Spreadsheet sample to make a fetch call to the server to retrieve and load the Excel file from the AWS S3 bucket into the client-side spreadsheet. + +```ts + + + +// Function to open a spreadsheet file from AWS S3 via an API call +const openFromS3 = () => { + spreadsheet.showSpinner(); + // Make a POST request to the backend API to fetch the file from S3. Replace the URL with your local or hosted endpoint URL. + fetch('https://localhost:portNumber/api/spreadsheet/OpenFromS3', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + FileName: fileInfo.name, // Name of the file to open + Extension: fileInfo.extension, // File extension + }), + }) + .then((response) => response.json()) // Parse the response as JSON + .then((data) => { + spreadsheet.hideSpinner(); + // Load the spreadsheet data into the UI. + spreadsheet.openFromJson({ file: data, triggerEvent: true }); + }) + .catch((error) => { + // Log any errors that occur during the fetch operation + window.alert('Error importing file:', error); + }); +}; + +``` + +N> The **AWSSDK.S3** NuGet package must be installed in your application to use the previous code example. \ No newline at end of file diff --git a/Document-Processing/Excel/Spreadsheet/React/Open-Excel-File/from-azure-blob-storage.md b/Document-Processing/Excel/Spreadsheet/React/Open-Excel-File/from-azure-blob-storage.md new file mode 100644 index 0000000000..cb3ce3789f --- /dev/null +++ b/Document-Processing/Excel/Spreadsheet/React/Open-Excel-File/from-azure-blob-storage.md @@ -0,0 +1,154 @@ +--- +layout: post +title: Open excel from Azure Blob in React Spreadsheet control | Syncfusion +description: Learn about how to Open an Excel file from Azure Blob Storage in React Spreadsheet control of Syncfusion Essential JS 2. +platform: document-processing +control: Open file from Azure Blob Storage +documentation: ug +--- + +# Open file from Azure Blob Storage + +To load a file from Azure Blob Storage in a Spreadsheet Component, you can follow the steps below + +**Step 1:** Create a Simple Spreadsheet Sample in React + +Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/excel/spreadsheet/react/getting-started) to create a simple Spreadsheet sample in React. This will give you a basic setup of the Spreadsheet component. + +**Step 2:** Modify the `SpreadsheetController.cs` File in the Web Service Project + +1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/blogs/post/host-spreadsheet-open-and-save-services) for instructions on how to create a web service project. + +2. Open the `SpreadsheetController.cs` file in your web service project. + +3. Import the required namespaces at the top of the file: + +```csharp + +using System; +using System.IO; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Configuration; +using Syncfusion.EJ2.Spreadsheet; +using Azure.Storage.Blobs; +using Azure.Storage.Blobs.Specialized; + +``` + +4. Add the following private fields and constructor parameters to the `SpreadsheetController` class, In the constructor, assign the values from the configuration to the corresponding fields. + +```csharp + +private readonly string _storageConnectionString; +private readonly string _storageContainerName; + +public SpreadsheetController(IConfiguration configuration) +{ + // Fetch values from appsettings.json + _storageConnectionString = configuration.GetValue("connectionString"); + _storageContainerName = configuration.GetValue("containerName"); +} + +``` + +5. Create the `OpenFromAzure()` method to open the document from the Azure Blob Storage. + +```csharp + +[HttpPost] +[Route("OpenFromAzure")] +public async Task OpenFromAzure([FromBody] FileOptions options) +{ + if (options == null || string.IsNullOrWhiteSpace(options.FileName) || string.IsNullOrWhiteSpace(options.Extension)) + return BadRequest("Invalid file options."); + + try + { + using (MemoryStream stream = new MemoryStream()) + { + string fileName = options.FileName + options.Extension; + + // Connect to Azure Blob Storage + BlobServiceClient blobServiceClient = new BlobServiceClient(_storageConnectionString); + BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(_storageContainerName); + BlockBlobClient blockBlobClient = containerClient.GetBlockBlobClient(fileName); + + // Download file into memory + await blockBlobClient.DownloadToAsync(stream); + stream.Position = 0; + + // Wrap stream as FormFile and convert to Spreadsheet-compatible JSON + OpenRequest open = new OpenRequest + { + File = new FormFile(stream, 0, stream.Length, options.FileName, fileName) + }; + + string result = Workbook.Open(open); + return Content(result, "application/json"); + } + } + catch (Exception ex) + { + Console.WriteLine($"Error: {ex.Message}"); + return Content("Error occurred while processing the file."); + } +} + +// DTO that receives file details from the client +public class FileOptions +{ + public string FileName { get; set; } = string.Empty; + public string Extension { get; set; } = string.Empty; +} + +``` + +6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration. + +```json + +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "connectionString": "DefaultEndpointsProtocol=https;AccountName=yourAccount;AccountKey=yourKey;EndpointSuffix=core.windows.net", + "containerName": "your-container-name" +} + +``` +N> Note: Install the Azure.Storage.Blobs NuGet package in the service project. + +**Step 3:** Modify the index File in the Spreadsheet sample to make a fetch call to the server to retrieve and load the Excel file from the Google Cloud Storage into the client-side spreadsheet. + +```ts + +; + +const openFromAzure = () => { + spreadsheet.showSpinner(); + + fetch("https://localhost:portNumber/api/spreadsheet/OpenFromAzure", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + FileName: fileInfo.name, // e.g., "Report" + Extension: fileInfo.extension // e.g., ".xlsx" + }) + }) + .then((res) => res.json()) + .then((data) => { + spreadsheet.hideSpinner(); + spreadsheet.openFromJson({ file: data, triggerEvent: true }); + }) + .catch((err) => window.alert("Error importing file: " + err)); +}; + +``` \ No newline at end of file diff --git a/Document-Processing/Excel/Spreadsheet/React/Open-Excel-File/from-google-cloud-storage.md b/Document-Processing/Excel/Spreadsheet/React/Open-Excel-File/from-google-cloud-storage.md new file mode 100644 index 0000000000..d691482fe4 --- /dev/null +++ b/Document-Processing/Excel/Spreadsheet/React/Open-Excel-File/from-google-cloud-storage.md @@ -0,0 +1,145 @@ +--- +layout: post +title: Open excel from Google Cloud in React Spreadsheet control | Syncfusion +description: Learn about how to Open an Excel file from Google Cloud Storage in React Spreadsheet control of Syncfusion Essential JS 2. +platform: document-processing +control: Open file from Google Cloud Storage +documentation: ug +--- + +# Open file from Google Cloud Storage + +To load a file from Google Cloud Storage in a Spreadsheet Component, you can follow the steps below + +**Step 1:** Create a Simple Spreadsheet Sample in React + +Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/excel/spreadsheet/react/getting-started) to create a simple Spreadsheet sample in React. This will give you a basic setup of the Spreadsheet component. + +**Step 2:** Modify the `SpreadsheetController.cs` File in the Web Service Project + +1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/blogs/post/host-spreadsheet-open-and-save-services) for instructions on how to create a web service project. + +2. Open the `SpreadsheetController.cs` file in your web service project. + +3. Import the required namespaces at the top of the file: + +```csharp + +using Google.Apis.Auth.OAuth2; +using Google.Cloud.Storage.V1; +using Syncfusion.EJ2.Spreadsheet; + +``` + +4. Add the following private fields and constructor parameters to the `SpreadsheetController` class, In the constructor, assign the values from the configuration to the corresponding fields. + +```Csharp + +private readonly string _bucketName; +private readonly StorageClient _storageClient; + +public SpreadsheetController(IConfiguration configuration) +{ + // Path of the JSON key downloaded from Google Cloud + string keyFilePath = configuration.GetValue("GoogleKeyFilePath"); + + // Create StorageClient with service-account credentials + var credentials = GoogleCredential.FromFile(keyFilePath); + _storageClient = StorageClient.Create(credentials); + + // Bucket that stores the Excel files + _bucketName = configuration.GetValue("BucketName"); +} + +``` + +5. Create the `OpenFromGoogleCloud()` method to open the document from the Google Cloud Storage. + +```Csharp + +[HttpPost] +[Route("OpenFromGoogleCloud")] +public IActionResult OpenFromGoogleCloud([FromBody] FileOptions options) +{ + try + { + using MemoryStream stream = new MemoryStream(); + + // / + string fileName = options.FileName + options.Extension; + + // Download the object into memory + _storageClient.DownloadObject(_bucketName, fileName, stream); + stream.Position = 0; + + // Feed the stream to Syncfusion to convert it into JSON + OpenRequest open = new OpenRequest + { + File = new FormFile(stream, 0, stream.Length, options.FileName, fileName) + }; + + string result = Workbook.Open(open); + return Content(result, "application/json"); + } + catch (Exception ex) + { + Console.WriteLine($"Error: {ex.Message}"); + return Content("Error occurred while processing the file."); + } +} + +// DTO that receives file details from the client +public class FileOptions +{ + public string FileName { get; set; } = string.Empty; + public string Extension { get; set; } = string.Empty; +} + +``` + +6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration. + +```Json + +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "GoogleKeyFilePath": "path/to/service-account-key.json", + "BucketName": "your-gcs-bucket-name" +} + +``` + +N> Note: Install the Google.Cloud.Storage.V1 NuGet package in the service project. + +**Step 3:** Modify the index File in the Spreadsheet sample to make a fetch call to the server to retrieve and load the Excel file from the Google Cloud Storage into the client-side spreadsheet. + +```typescript +; + +const openFromGoogleCloud = () => { + spreadsheet.showSpinner(); + + fetch("https://localhost:portNumber/api/spreadsheet/OpenFromGoogleCloud", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + FileName: fileInfo.name, // e.g., "Report" + Extension: fileInfo.extension, // e.g., ".xlsx" + }), + }) + .then((res) => res.json()) + .then((data) => { + spreadsheet.hideSpinner(); + spreadsheet.openFromJson({ file: data, triggerEvent: true }); + }) + .catch((err) => window.alert("Error importing file: " + err)); +}; +``` \ No newline at end of file diff --git a/Document-Processing/Excel/Spreadsheet/React/Save-Excel-File/to-aws-s3-bucket.md b/Document-Processing/Excel/Spreadsheet/React/Save-Excel-File/to-aws-s3-bucket.md new file mode 100644 index 0000000000..1cae9284b5 --- /dev/null +++ b/Document-Processing/Excel/Spreadsheet/React/Save-Excel-File/to-aws-s3-bucket.md @@ -0,0 +1,159 @@ +--- +layout: post +title: Saving excel to AWS S3 in React Spreadsheet control | Syncfusion +description: Learn how to save a Excel file from AWS S3 in React Spreadsheet control of Syncfusion Essential JS 2 and more details. +platform: document-processing +control: Save file to AWS S3 +documentation: ug +--- + +# Save spreadsheet to AWS S3 + +To save a file to the AWS S3, you can follow the steps below. + +**Step 1:** Create a Simple Spreadsheet Sample in React + +Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/excel/spreadsheet/react/getting-started) to create a simple Spreadsheet sample in React. This will give you a basic setup of the Spreadsheet component. + +**Step 2:** Modify the `SpreadsheetController.cs` File in the Web Service Project + +1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/blogs/post/host-spreadsheet-open-and-save-services) for instructions on how to create a web service project. + +2. Open the `SpreadsheetController.cs` file in your web service project. + +3. Import the required namespaces at the top of the file: + +```csharp + +using Amazon; +using Amazon.Runtime; +using Amazon.S3; +using Amazon.S3.Model; +using Amazon.S3.Transfer; + +``` + +4. Add the following private fields and constructor parameters to the `SpreadsheetController` class, In the constructor, assign the values from the configuration to the corresponding fields + +```csharp + +private IConfiguration _configuration; +public readonly string _accessKey; +public readonly string _secretKey; +public readonly string _bucketName; + +public SpreadsheetController(IWebHostEnvironment hostingEnvironment, IMemoryCache cache, IConfiguration configuration) +{ + _hostingEnvironment = hostingEnvironment; + _cache = cache; + _configuration = configuration; + _accessKey = _configuration.GetValue("AccessKey"); + _secretKey = _configuration.GetValue("SecretKey"); + _bucketName = _configuration.GetValue("BucketName"); +} + +``` + +5. Create the `SaveToS3()` method to open the document from the AWS S3 bucket + +```csharp + +[HttpPost] +[Route("SaveToS3")] +public async Task SaveToS3([FromForm] SaveSettings saveSettings) +{ + try + { + // Convert spreadsheet JSON to Excel file stream + Stream fileStream = Workbook.Save(saveSettings); + fileStream.Position = 0; // Reset stream for upload + + // Set AWS region and credentials + var region = RegionEndpoint.USEast1; + var config = new AmazonS3Config { RegionEndpoint = region }; + var credentials = new BasicAWSCredentials("your-access-key", "your-secretkey"); + + // Define S3 bucket and file name + string bucketName = "your-bucket-name"; + string fileName = saveSettings.FileName + "." + saveSettings.SaveType.ToString().ToLower(); + + // Initialize S3 client + using (var client = new AmazonS3Client(credentials, config)) + { + // Use TransferUtility to upload the file stream + var fileTransferUtility = new TransferUtility(client); + await fileTransferUtility.UploadAsync(fileStream, bucketName, fileName); + } + + // Return success message + return Ok("Excel file successfully saved to AWS S3."); + } + catch (Exception ex) + { + } +} + +``` + +6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration + +```json + +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "AccessKey": "Your Access Key from AWS S3", + "SecretKey": "Your Secret Key from AWS S3", + "BucketName": "Your Bucket name from AWS S3" +} + +``` + +N> Replace **Your Access Key from AWS S3**, **Your Secret Key from AWS S3**, and **Your Bucket name from AWS S3** with your actual AWS access key, secret key and bucket name + +**Step 3:** Modify the index File in the Spreadsheet sample to using [`saveAsJson`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#saveasjson) method to serialize the spreadsheet and send it to the back-end + +```js +// Function to save the current spreadsheet to AWS S3 via an API call +const saveToS3 = () => { + // Convert the current spreadsheet to JSON format + spreadsheet.saveAsJson().then((json) => { + const formData = new FormData(); + + // Append necessary data to the form for the API request + formData.append('FileName', loadedFileInfo.fileName); // Name of the file to save + formData.append('saveType', loadedFileInfo.saveType); // Save type + formData.append('JSONData', JSON.stringify(json.jsonObject.Workbook)); // Spreadsheet data + formData.append( + 'PdfLayoutSettings', + JSON.stringify({ FitSheetOnOnePage: false }) // PDF layout settings + ); + + // Make a POST request to the backend API to save the file to S3. Replace the URL with your local or hosted endpoint URL. + fetch('https://localhost:portNumber/api/spreadsheet/SaveToS3', { + method: 'POST', + body: formData, + }) + .then((response) => { + // Check if the response is successful + if (!response.ok) { + throw new Error( + `Save request failed with status ${response.status}` + ); + } + window.alert('Workbook saved successfully.'); + }) + .catch((error) => { + // Log any errors that occur during the save operation + window.alert('Error saving to server:', error); + }); + }); +}; +``` + +N> The **AWSSDK.S3** NuGet package must be installed in your application to use the previous code example. diff --git a/Document-Processing/Excel/Spreadsheet/React/Save-Excel-File/to-azure-blob-storage.md b/Document-Processing/Excel/Spreadsheet/React/Save-Excel-File/to-azure-blob-storage.md new file mode 100644 index 0000000000..f27c3bfc72 --- /dev/null +++ b/Document-Processing/Excel/Spreadsheet/React/Save-Excel-File/to-azure-blob-storage.md @@ -0,0 +1,126 @@ +--- +layout: post +title: Save excel to Azure Blob in React Spreadsheet control | Syncfusion +description: Learn about how to Save an Excel file from Azure Blob Storage in React Spreadsheet control of Syncfusion Essential JS 2. +platform: document-processing +control: Save file to Azure Blob Storage +documentation: ug +--- + +# Save file to Azure Cloud Storage + +To save a file to Azure Blob Storage in a Spreadsheet Component, you can follow the steps below + +**Step 1:** Create a Simple Spreadsheet Sample in React + +Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/excel/spreadsheet/react/getting-started) to create a simple Spreadsheet sample in React. This will give you a basic setup of the Spreadsheet component. + +**Step 2:** Modify the `SpreadsheetController.cs` File in the Web Service Project + +1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/blogs/post/host-spreadsheet-open-and-save-services) for instructions on how to create a web service project. + +2. Open the `SpreadsheetController.cs` file in your web service project. + +3. Import the required namespaces at the top of the file: + +```csharp + +using System; +using System.IO; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Configuration; +using Syncfusion.EJ2.Spreadsheet; +using Azure.Storage.Blobs; + +``` + +4. Add the following private fields and constructor parameters to the `SpreadsheetController` class, In the constructor, assign the values from the configuration to the corresponding fields. + +```csharp + +private readonly string _storageConnectionString; +private readonly string _storageContainerName; + +public SpreadsheetController(IConfiguration configuration) +{ + _storageConnectionString = configuration.GetValue("connectionString"); + _storageContainerName = configuration.GetValue("containerName"); +} + +``` + +5. Create the `SaveToAzure()` method to save the document to the Azure Blob storage. + +```csharp + +[HttpPost] +[Route("SaveToAzure")] +public async Task SaveToAzure([FromForm] SaveSettings saveSettings) +{ + if (saveSettings == null || string.IsNullOrWhiteSpace(saveSettings.FileName)) + return BadRequest("Invalid save settings."); + + try + { + // Convert spreadsheet JSON to Excel/PDF/CSV stream + Stream fileStream = Workbook.Save(saveSettings); + fileStream.Position = 0; + + // Define Azure Blob Storage client + BlobServiceClient blobServiceClient = new BlobServiceClient(_storageConnectionString); + BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(_storageContainerName); + + // Define blob name using file name and save type + string blobName = $"{saveSettings.FileName}.{saveSettings.SaveType.ToString().ToLower()}"; + BlobClient blobClient = containerClient.GetBlobClient(blobName); + + // Upload the Excel file stream to Azure Blob Storage (overwrite if exists) + await blobClient.UploadAsync(fileStream, overwrite: true); + + return Ok("Excel file successfully saved to Azure Blob Storage."); + } + catch (Exception ex) + { + return BadRequest("Error saving file to Azure Blob Storage: " + ex.Message); + } +} + +``` + +N> Note: Install the Azure.Storage.Blobs NuGet package in the service project. Ensure the configured connection string has permissions to read and write blobs in the specified container. + +**Step 3:** Modify the index File in the Spreadsheet sample to using [`saveAsJson`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#saveasjson) method to serialize the spreadsheet and send it to the back-end + +```js + +; + +const saveToAzure = () => { + spreadsheet.saveAsJson().then((json) => { + const formData = new FormData(); + formData.append("FileName", loadedFileInfo.fileName); // e.g., "Report" + formData.append("saveType", loadedFileInfo.saveType); // e.g., "Xlsx" + formData.append("JSONData", JSON.stringify(json.jsonObject.Workbook)); + formData.append( + "PdfLayoutSettings", + JSON.stringify({ FitSheetOnOnePage: false }) + ); + + fetch("https://localhost:portNumber/api/spreadsheet/SaveToAzure", { + method: "POST", + body: formData + }) + .then((res) => { + if (!res.ok) { + throw new Error(`Save failed with status ${res.status}`); + } + window.alert("Workbook saved successfully to Azure Blob Storage."); + }) + .catch((err) => window.alert("Error saving to server: " + err)); + }); +}; + +``` diff --git a/Document-Processing/Excel/Spreadsheet/React/Save-Excel-File/to-google-cloud-storage.md b/Document-Processing/Excel/Spreadsheet/React/Save-Excel-File/to-google-cloud-storage.md new file mode 100644 index 0000000000..d92d4dbf3a --- /dev/null +++ b/Document-Processing/Excel/Spreadsheet/React/Save-Excel-File/to-google-cloud-storage.md @@ -0,0 +1,114 @@ +--- +layout: post +title: Save excel to Google Cloud in React Spreadsheet control | Syncfusion +description: Learn about how to Save an Excel file from Google Cloud Storage in React Spreadsheet control of Syncfusion Essential JS 2. +platform: document-processing +control: Save file to Google Cloud Storage +documentation: ug +--- + +# Save file to Google Cloud Storage + +To save a file to Google Cloud Storage in a Spreadsheet Component, you can follow the steps below + +**Step 1:** Create a Simple Spreadsheet Sample in React + +Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/excel/spreadsheet/react/getting-started) to create a simple Spreadsheet sample in React. This will give you a basic setup of the Spreadsheet component. + +**Step 2:** Modify the `SpreadsheetController.cs` File in the Web Service Project + +1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/blogs/post/host-spreadsheet-open-and-save-services) for instructions on how to create a web service project. + +2. Open the `SpreadsheetController.cs` file in your web service project. + +3. Import the required namespaces at the top of the file: + +```csharp + +using Google.Apis.Auth.OAuth2; +using Google.Cloud.Storage.V1; +using Syncfusion.EJ2.Spreadsheet; + +``` + +4. Add the following private fields and constructor parameters to the `SpreadsheetController` class, In the constructor, assign the values from the configuration to the corresponding fields. + +```csharp +private readonly string _bucketName; +private readonly StorageClient _storageClient; + +public SpreadsheetController(IConfiguration configuration) +{ + // Path of the JSON key downloaded from Google Cloud + string keyFilePath = configuration.GetValue("GoogleKeyFilePath"); + + // Create StorageClient with service-account credentials + var credentials = GoogleCredential.FromFile(keyFilePath); + _storageClient = StorageClient.Create(credentials); + + // Bucket that stores the Excel files + _bucketName = configuration.GetValue("BucketName"); +} +``` + +5. Create the `SaveToGoogleCloud()` method to save the document to the Google Cloud storage. + +```csharp +[HttpPost] +[Route("SaveToGoogleCloud")] +public async Task SaveToGoogleCloud([FromForm] SaveSettings saveSettings) +{ + try + { + // Convert spreadsheet JSON to Excel stream + Stream fileStream = Workbook.Save(saveSettings); + fileStream.Position = 0; + + // File name inside the bucket + string fileName = $"{saveSettings.FileName}.{saveSettings.SaveType.ToString().ToLower()}"; + + // Upload the stream to Google Cloud Storage + await _storageClient.UploadObjectAsync(_bucketName, fileName, null, fileStream); + + return Ok("Excel file successfully saved to Google Cloud Storage."); + } + catch (Exception ex) + { + return BadRequest("Error saving file to Google Cloud Storage: " + ex.Message); + } +} +``` + +**Step 3:** Modify the index File in the Spreadsheet sample to using [`saveAsJson`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#saveasjson) method to serialize the spreadsheet and send it to the back-end + +```js + +const saveToGoogleCloud = () => { + spreadsheet.saveAsJson().then(json => { + const formData = new FormData(); + formData.append('FileName', loadedFileInfo.fileName); // e.g., "Report" + formData.append('saveType', loadedFileInfo.saveType); // e.g., "Xlsx" + formData.append('JSONData', JSON.stringify(json.jsonObject.Workbook)); + formData.append( + 'PdfLayoutSettings', + JSON.stringify({ FitSheetOnOnePage: false }) + ); + + fetch('https://localhost:portNumber/api/spreadsheet/SaveToGoogleCloud', { + method: 'POST', + body: formData + }) + .then(res => { + if (!res.ok) { + throw new Error(`Save failed with status ${res.status}`); + } + window.alert('Workbook saved successfully to Google Cloud Storage.'); + }) + .catch(err => window.alert('Error saving to server: ' + err)); + }); +}; +``` + +N> Note: The back-end requires the Google.Cloud.Storage.V1 NuGet package and a service-account key that has Storage Object Admin (or equivalent) permissions on the target bucket. \ No newline at end of file diff --git a/Document-Processing/Excel/Spreadsheet/React/Server-Deployment/deploy-spreadsheet-docker-to-azure-using-azure-cli.md b/Document-Processing/Excel/Spreadsheet/React/Server-Deployment/deploy-spreadsheet-docker-to-azure-using-azure-cli.md new file mode 100644 index 0000000000..1ca888caed --- /dev/null +++ b/Document-Processing/Excel/Spreadsheet/React/Server-Deployment/deploy-spreadsheet-docker-to-azure-using-azure-cli.md @@ -0,0 +1,91 @@ +--- +layout: post +title: Deploy Spreadsheet Server to Azure App Service using CLI | Syncfusion +description: Learn how to deploy the Syncfusion Spreadsheet Server Docker image to Azure App Service using Azure CLI. +control: How to deploy Spreadsheet Server Docker Image to Azure App Service using Azure CLI +platform: document-processing +documentation: ug +--- + +# Deploy Spreadsheet Docker to Azure App Service using Azure CLI + +## Prerequisites + +* `Docker` installed on your machine (Windows, macOS, or Linux). +* `Azure CLI` installed based on your operating system. [Download Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) +* An active [`Azure subscription`](https://azure.microsoft.com/en-gb) with App Services access. +* The [`Spreadsheet Server Docker image`](https://hub.docker.com/r/syncfusion/spreadsheet-server) available. + +## Deploy to Azure App Service using Azure CLI + +**Step 1:** Log in to Azure + +Open your terminal and sign in to Azure using the command below. This authenticates your CLI with Azure. + +```bash +az login +``` + +**Step 2:** Create a resource group + +Create a resource group with the following command in your preferred location. + +```bash +az group create --name < your-app-name> --location +``` + +**Step 3:** Create an app service plan + +Create a resource group with the following command in your preferred location. + +```bash +az appservice plan create --name --resource-group < your-resource-group> --sku S1 --is-linux +``` + +This creates an App Service plan in the standard pricing tier (S1) and ensures it runs on Linux containers with the --is-linux flag. + +**Step 4:** Create the docker-compose.yml file + +Define your container configuration in a docker-compose.yml file. This file specifies the container name, image, and environment variables for the Spreadsheet Server: + +```bash +version: '3.4' + +services: + spreadsheet-server: + image: syncfusion/spreadsheet-server + environment: + + # Provide your license key for activation + SYNCFUSION_LICENSE_KEY: YOUR_LICENSE_KEY + ports: + - "6002:8080" + +``` + +Note: Replace YOUR_LICENSE_KEY with your valid Syncfusion license key. + +**Step 5:** Create a Docker compose app + +Deploy the containerized app to Azure App Service using the following command. + +```bash +az webapp create --resource-group --plan < your-app-service-plan> --name --multicontainer-config-type compose --multicontainer-config-file docker-compose.yml +``` + +This command creates a web app that runs your Spreadsheet Server Docker container using the configuration defined in the docker-compose.yml file. + +**Step 6:** Browse your app + +Once deployed, your app will be live at https://XXXXXXXXXX.azurewebsites.net. + +![azure cli](../images/azure-cli.png) + +**Step 7:** With your server running, verify that it supports import and export operations by testing the following endpoints: +``` +openUrl="https://XXXXXXXXXX.azurewebsites.net/api/spreadsheet/open" +saveUrl="https://XXXXXXXXXX.azurewebsites.net/api/spreadsheet/save +``` +Append the App Service running URL to the service URL in the client‑side Spreadsheet Editor component. For more information about how to get started with the Spreadsheet Editor component, refer to this [`getting started page`](../getting-started.md) + +For more information about the app container service, please look deeper into the [`Microsoft Azure App Service`](https://docs.microsoft.com/en-us/visualstudio/deployment/) for a production-ready setup. \ No newline at end of file diff --git a/Document-Processing/Excel/Spreadsheet/React/Server-Deployment/publish-spreadsheet-server-to-azure-using-visual-studio.md b/Document-Processing/Excel/Spreadsheet/React/Server-Deployment/publish-spreadsheet-server-to-azure-using-visual-studio.md new file mode 100644 index 0000000000..1c50b61223 --- /dev/null +++ b/Document-Processing/Excel/Spreadsheet/React/Server-Deployment/publish-spreadsheet-server-to-azure-using-visual-studio.md @@ -0,0 +1,57 @@ +--- +layout: post +title: Deploy Spreadsheet Server to Azure App Service via VS | Syncfusion +description: Learn how to publish the Syncfusion Spreadsheet Server Web API to Azure App Service using Visual Studio. +control: How to publish Spreadsheet Server in Azure App Service using Visual Studio +platform: document-processing +documentation: ug +--- + +# Publish Spreadsheet Server to Azure App Service using Visual Studio + + +## Prerequisites + +* `Visual Studio 2022` or later is installed. +* [`.NET 8.0 SDK`](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) or later installed. +* An active [`Azure subscription`](https://azure.microsoft.com/en-gb) with App Services access. +* The [`Spreadsheet Web API project`](https://github.com/SyncfusionExamples/EJ2-Spreadsheet-WebServices/tree/main/WebAPI) repository cloned locally. + +Make sure you build the project using the Build > Build Solution menu command before following the deployment steps. + +## Publish to Azure App Service + +**Step 1:** In Solution Explorer, right-click the project and click Publish (or use the Build > Publish menu item). + +![azure publish ](../images/azure_publish.png) + +**Step 2:** In the Pick a publish target dialog box, select Azure as deployment target. + +![azure target ](../images/azure_target.png) + +**Step 3:** After selecting Azure, choose Azure App Service under the target options. + +![azure app service](../images/azure_app_service.png) + +**Step 4:** Select Publish. The Create App Service dialog box appears. Sign in with your Azure account, if necessary, and then the default app service settings populate the fields. + +![azure credentials](../images/azure_credentials.png) + +**Step 5:** Select Create. Visual Studio deploys the app to your Azure App Service, and the web app loads in your browser with the app name at, +``` +http://.azurewebsites.net +``` + +![azure_published_window](../images/azure_published_window.png) + +**Step 6:** Once the deployment process is complete, The deployed API will be live at the following URL: +https://XXXXXXXXXX.azurewebsites.net + +**Step 7:** With your server running, verify that it supports import and export operations by testing the following endpoints: +``` +openUrl="https://XXXXXXXXXX.azurewebsites.net/api/spreadsheet/open" +saveUrl="https://XXXXXXXXXX.azurewebsites.net/api/spreadsheet/save +``` +Append the App Service running URL to the service URL in the client‑side Spreadsheet Editor component. For more information about how to get started with the Spreadsheet Editor component, refer to this [`getting started page`](../getting-started.md) + +For more information about the app container service, please look deeper into the [`Microsoft Azure App Service`](https://docs.microsoft.com/en-us/visualstudio/deployment/) for a production-ready setup. \ No newline at end of file diff --git a/Document-Processing/Excel/Spreadsheet/React/docker-deployment.md b/Document-Processing/Excel/Spreadsheet/React/Server-Deployment/spreadsheet-server-docker-image-overview.md similarity index 99% rename from Document-Processing/Excel/Spreadsheet/React/docker-deployment.md rename to Document-Processing/Excel/Spreadsheet/React/Server-Deployment/spreadsheet-server-docker-image-overview.md index c01484870d..c96b8dc0a3 100644 --- a/Document-Processing/Excel/Spreadsheet/React/docker-deployment.md +++ b/Document-Processing/Excel/Spreadsheet/React/Server-Deployment/spreadsheet-server-docker-image-overview.md @@ -7,7 +7,7 @@ control: Docker deployment documentation: ug --- -# Docker Image Overview in React Spreadsheet component +# Docker Image Overview in React Spreadsheet The [**Syncfusion® Spreadsheet (also known as Excel Viewer)**](https://www.syncfusion.com/spreadsheet-editor-sdk/react-spreadsheet-editor) is a feature-rich control for organizing and analyzing data in a tabular format. It provides all the common Excel features, including data binding, selection, editing, formatting, resizing, sorting, filtering, importing, and exporting Excel documents. diff --git a/Document-Processing/Excel/Spreadsheet/React/data-validation.md b/Document-Processing/Excel/Spreadsheet/React/data-validation.md new file mode 100644 index 0000000000..ef58cc13cd --- /dev/null +++ b/Document-Processing/Excel/Spreadsheet/React/data-validation.md @@ -0,0 +1,106 @@ +--- +layout: post +title: Data validation in EJ2 React Spreadsheet control | Syncfusion +description: Learn here all about Data validation in Syncfusion EJ2 React Spreadsheet control of Syncfusion Essential JS 2 and more. +platform: document-processing +control: Data validation +documentation: ug +--- + +# Data validation in EJ2 React Spreadsheet control + + +Data Validation is used to restrict the user from entering the invalid data. You can use the [`allowDataValidation`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#allowdatavalidation) property to enable or disable data validation. + +> * The default value for `allowDataValidation` property is `true`. + +## Apply Validation + +You can apply data validation to restrict the type of data or the values that users enter into a cell. + +You can apply data validation by using one of the following ways, + +* Select the Data tab in the Ribbon toolbar, and then choose the Data Validation item. +* Use the [`addDataValidation()`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#adddatavalidation) method programmatically. + +## Clear Validation + +Clear validation feature is used to remove data validations from the specified ranges or the whole worksheet. + +You can clear data validation rule by one of the following ways, + +* Select the Data tab in the Ribbon toolbar, and then choose the Clear Validation item. +* Use the [`removeDataValidation()`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#removedatavalidation) method programmatically. + +## Highlight Invalid Data + +Highlight invalid data feature is used to highlight the previously entered invalid values. + +You can highlight an invalid data by using one of the following ways, + +* Select the Data tab in the Ribbon toolbar, and then choose the Highlight Invalid Data item. +* Use the [`addInvalidHighlight()`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#addinvalidhighlight) method programmatically. + +## Clear Highlighted Invalid Data + +Clear highlight feature is used to remove the highlight from invalid cells. + +You can clear the highlighted invalid data by using the following ways, + +* Select the Data tab in the Ribbon toolbar, and then choose the Clear Highlight item. +* Use the [`removeInvalidHighlight()`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#removeinvalidhighlight) method programmatically. + +{% tabs %} +{% highlight js tabtitle="app.jsx" %} +{% include code-snippet/spreadsheet/react/data-validation-cs1/app/app.jsx %} +{% endhighlight %} +{% highlight ts tabtitle="app.tsx" %} +{% include code-snippet/spreadsheet/react/data-validation-cs1/app/app.tsx %} +{% endhighlight %} +{% endtabs %} + + {% previewsample "/document-processing/code-snippet/spreadsheet/react/data-validation-cs1" %} + +## Custom Data validation + +The Spreadsheet supports custom data validation, allowing users to define their own validation rules for specific cells or ranges. This feature enables you to set conditions that the entered data must meet, making it particularly useful when predefined validation options, such as numbers, dates, or lists, are insufficient. + +With custom validation, you can enforce rules using logical expressions or formulas, ensuring that only valid data is entered into the Spreadsheet. + +For example, consider a scenario where you want to ensure that a cell contains a number between 10 and 100. To achieve this, define a validation rule using a formula that checks if the entered value is greater than 10 and less than 100. The formula for this validation is =AND(A1>10, A1<100), where A1 refers to the cell being validated. + +When this rule is applied, the Spreadsheet evaluates the entered value against the formula. If a user enters a value outside the specified range, an alert notifies them of the invalid input. This helps users correct errors efficiently and ensures that only desired values are accepted. + +You can apply custom data validation using two methods. + +* The first is through the Data Validation dialog in the Ribbon toolbar. Navigate to the Data tab, select the Data Validation option, and choose the Custom type from the Allow dropdown menu. +* The second method is programmatically, using the [`addDataValidation()`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#adddatavalidation) method, which allows developers to set custom rules dynamically via code. + +The following code example demonstrates how to add custom data validation with a formula in a Spreadsheet. + +{% tabs %} +{% highlight js tabtitle="app.jsx" %} +{% include code-snippet/spreadsheet/react/data-validation-cs2/app/app.jsx %} +{% endhighlight %} +{% highlight ts tabtitle="app.tsx" %} +{% include code-snippet/spreadsheet/react/data-validation-cs2/app/app.tsx %} +{% endhighlight %} +{% endtabs %} + + {% previewsample "/document-processing/code-snippet/spreadsheet/react/data-validation-cs2" %} + +## Limitations of Data validation + +The following features have some limitations in Data Validation: + +* Entire row data validation. +* Insert row between the data validation. +* Copy/paste with data validation. +* Delete cells between data validation applied range. + +## See Also + +* [Formatting](./formatting) +* [Rows and columns](./rows-and-columns) +* [Hyperlink](./link) +* [Sorting](./sort) \ No newline at end of file diff --git a/Document-Processing/Excel/Spreadsheet/React/images/azure-cli.png b/Document-Processing/Excel/Spreadsheet/React/images/azure-cli.png new file mode 100644 index 0000000000000000000000000000000000000000..3ab35434c6b27764b145ce402344d6aa741e7a92 GIT binary patch literal 40547 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 z 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 e6M0MP$atq0krP~8Wi!x0Hf^w9Pg}d|(Ek7)vr%0D literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Spreadsheet/React/images/azure_publish.png b/Document-Processing/Excel/Spreadsheet/React/images/azure_publish.png new file mode 100644 index 0000000000000000000000000000000000000000..fd6cf78c9c8fe1959c1a5b91fe5830527ef8c06d GIT binary patch literal 94825 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 literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Spreadsheet/React/images/azure_published_window.png b/Document-Processing/Excel/Spreadsheet/React/images/azure_published_window.png new file mode 100644 index 0000000000000000000000000000000000000000..966c3cfc2647ce7012b7fd18295facd2df489573 GIT binary patch literal 57076 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 M24=@{j$XR)Z}(`mRsaA1 literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Spreadsheet/React/open-excel-files.md b/Document-Processing/Excel/Spreadsheet/React/open-excel-files.md new file mode 100644 index 0000000000..80c32cff3e --- /dev/null +++ b/Document-Processing/Excel/Spreadsheet/React/open-excel-files.md @@ -0,0 +1,555 @@ +--- +layout: post +title: Open Excel in React Spreadsheet component | Syncfusion +description: Learn here all about Open Excel in Syncfusion React Spreadsheet component of Syncfusion Essential JS 2 and more. +platform: document-processing +control: Open +documentation: ug +--- + +# Open Excel Files in Syncfusion React Spreadsheet + +The React Spreadsheet component uses a server‑assisted workflow to import Excel files accurately and efficiently. When a user uploads an Excel file, the component sends the file to the server for parsing, ensuring smooth performance because the heavy processing workload is handled on the server side. + +On the server, the [`Syncfusion.EJ2.Spreadsheet library`](https://www.nuget.org/packages/Syncfusion.EJ2.Spreadsheet.AspNet.Core) built on top of [`Syncfusion XlsIO`](https://help.syncfusion.com/document-processing/excel/excel-library/net/overview), reads the Excel file and extracts all relevant details, including data, styles, formulas, formatting, and sheet structure. The server then converts this information into a Spreadsheet‑compatible JSON workbook. + +Once processing is complete, the JSON workbook is returned to the client, where the React Spreadsheet component renders it in the browser. This workflow preserves the original Excel layout and ensures the imported content appears with full fidelity. + +To enable opening Excel files, set the [`allowOpen`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#allowopen) property to **true** and specify the service url using the [`openUrl`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#openurl) property. The control will send the uploaded file to this endpoint, where it is processed and returned as JSON for the Spreadsheet to render. + +For a quick walkthrough on how the open functionality works, refer to the following video: +{% youtube "https://www.youtube.com/watch?v=MpwiXmL1Z_o" %} + +## UI options to open Excel files + +In user interface you can open an Excel document by clicking `File > Open` menu item in ribbon. + +The following sample shows the `Open` option by using the [`openUrl`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#openurl) property in the Spreadsheet control. You can also use the [`beforeOpen`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#beforeopen) event to customize or cancel the import action, which gets triggered before opening an Excel file. + +{% tabs %} +{% highlight js tabtitle="app.jsx" %} +{% include code-snippet/spreadsheet/react/open-save-cs1/app/app.jsx %} +{% endhighlight %} +{% highlight ts tabtitle="app.tsx" %} +{% include code-snippet/spreadsheet/react/open-save-cs1/app/app.tsx %} +{% endhighlight %} +{% endtabs %} + +{% previewsample "/document-processing/code-snippet/spreadsheet/react/open-save-cs1" %} + +Please find the below table for the [beforeOpen](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#beforeopen) event arguments. + +## BeforeOpenEventArgs – Properties + +| **Property** | **Type** | **Description** | +|-------------------|-------------------------------|-------------| +| **cancel** | `boolean` | Specifies whether the open action should be canceled. | +| **file** | `FileList` \| `string` \| `File` | Specifies the file to be opened. | +| **parseOptions** | [`WorkbookParseOptions`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/workbookparseoptions) | Specifies the parsing options that control how the Excel file is interpreted during loading. | +| **password** | `string` | Specifies the password required to open the Excel file, if it is protected. | +| **requestData** | object | Specifies any additional data sent along with the open request. | +| **requestType** | `string` | Specifies the type of open request that triggered the **beforeOpen** event. Possible values:

    • **initial** – The default request made when loading a workbook.
    • **chunk** – A follow‑up request to load a portion of the workbook when chunking is enabled and the server provides a chunk plan.
    • **thresholdLimitConfirmed** – A request made after the user confirms a threshold warning (such as *maximumDataLimit* or *maximumFileSizeLimit*) and chooses to proceed. | + +> * Use `Ctrl + O` keyboard shortcut to open Excel documents. +> * The default value of the [allowOpen](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#allowopen) property is `true`. For demonstration purpose, we have showcased the [allowOpen](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#allowopen) property in previous code snippet. + +## Open Excel files programmatically + +To open Excel files programmatically in the Spreadsheet, you can use the [`open`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#open) method of the Spreadsheet component. Before invoking this method, ensure that the [`openUrl`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#openurl) property is properly configured, as it is required for processing the file on the server. + +Please find the table below for the [`open`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#open) method arguments. + +| **Parameter** | **Type** | **Description** | +|----------|--------------|-----------------------------------| +| options | [OpenOptions](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/openOptions) | Options for opening the excel file. | + + +The following code example demonstrates how to open an Excel file programmatically in the Spreadsheet. + +```js +import React, { useRef } from 'react'; +import { createRoot } from 'react-dom/client'; +import { SpreadsheetComponent } from '@syncfusion/ej2-react-spreadsheet'; + +const App = () => { + const spreadsheetRef = useRef(null); + + const onCreated = () => { + fetch('https://js.syncfusion.com/demos/ejservices/data/Spreadsheet/LargeData.xlsx') + .then((response) => response.blob()) + .then((fileBlob) => { + const file = new File([fileBlob], 'Sample.xlsx'); + spreadsheetRef.current?.open({ file }); + }); + }; + + return ( + + ); +}; + +export default App; + +const root = createRoot(document.getElementById('spreadsheet')); +root.render(); +``` + +## Supported Excel file formats for Open + +The following Excel file formats are supported for opening in the Spreadsheet component: + +* Microsoft Excel Workbook (.xlsx) +* Microsoft Excel 97–2003 Workbook (.xls) +* Comma-Separated Values (.csv) +* Excel Macro‑Enabled Workbook (.xlsm) +* Excel Binary Workbook (.xlsb) + +## Import options + +### Open Excel files from local system + +If you explore your machine to select and upload an Excel document using the file upload component, you will receive the uploaded document as a raw file in the [success](https://ej2.syncfusion.com/react/documentation/api/uploader/index-default#success) event of the file upload component. In this `success` event, you should pass the received raw file as an argument to the Spreadsheet's [open](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#open) method to see the appropriate output. + +The following code example shows how to import an Excel document using file upload component in spreadsheet. + +{% tabs %} +{% highlight js tabtitle="app.jsx" %} +{% include code-snippet/spreadsheet/react/open-save-cs9/app/app.jsx %} +{% endhighlight %} +{% highlight ts tabtitle="app.tsx" %} +{% include code-snippet/spreadsheet/react/open-save-cs9/app/app.tsx %} +{% endhighlight %} +{% endtabs %} + +{% previewsample "/document-processing/code-snippet/spreadsheet/react/open-save-cs9" %} + +### Open Excel files from URL + +You can achieve to access the remote Excel file by using the [`created`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#created) event. In this event you can fetch the Excel file and convert it to a blob. Convert this blob to a file and [`open`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#open) this file by using Spreadsheet component open method. + +{% tabs %} +{% highlight js tabtitle="app.jsx" %} +{% include code-snippet/spreadsheet/react/open-save-cs2/app/app.jsx %} +{% endhighlight %} +{% highlight ts tabtitle="app.tsx" %} +{% include code-snippet/spreadsheet/react/open-save-cs2/app/app.tsx %} +{% endhighlight %} +{% endtabs %} + + {% previewsample "/document-processing/code-snippet/spreadsheet/react/open-save-cs2" %} + +### Open Excel files from Blob data + +By default, the Spreadsheet component provides an option to browse files from the local file system and open them within the component. If you want to open an Excel file from blob data, you need to fetch the blob data from the server or another source and convert this blob data into a `File` object. Then, you can use the [open](https://ej2.syncfusion.com/react/documentation/api/spreadsheet#open) method in the Spreadsheet component to load that `File` object. + +Please find the code to fetch the blob data and load it into the Spreadsheet component below. + +{% tabs %} +{% highlight js tabtitle="app.jsx" %} +{% include code-snippet/spreadsheet/react/open-from-blobdata-cs1/app/app.jsx %} +{% endhighlight %} +{% highlight ts tabtitle="app.tsx" %} +{% include code-snippet/spreadsheet/react/open-from-blobdata-cs1/app/app.tsx %} +{% endhighlight %} +{% endtabs %} + +{% previewsample "/document-processing/code-snippet/spreadsheet/react/open-from-blobdata-cs1" %} + +### Load server-side Excel files into Spreadsheet + +By default, the Spreadsheet component provides an option to browse files from the local file system and open them within the component. If you want to load an Excel file located on a server, you need to configure the server endpoint to fetch the Excel file from the server location, process it using `Syncfusion.EJ2.Spreadsheet.AspNet.Core`, and send it back to the client side as `JSON data`. On the client side, you should use the [openFromJson](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#openfromjson) method to load that `JSON data` into the Spreadsheet component. + +**Server Endpoint**: + +```csharp + public IActionResult Open([FromBody] FileOptions options) + { + OpenRequest open = new OpenRequest(); + string filePath = _env.ContentRootPath.ToString() + "\\Files\\" + options.FileName + ".xlsx"; + // Getting the file stream from the file path. + FileStream fileStream = new FileStream(filePath, FileMode.Open); + // Converting "MemoryStream" to "IFormFile". + IFormFile formFile = new FormFile(fileStream, 0, fileStream.Length, "", options.FileName + ".xlsx"); + open.File = formFile; + // Processing the Excel file and return the workbook JSON. + var result = Workbook.Open(open); + fileStream.Close(); + return Content(result); + } + + public class FileOptions + { + public string FileName { get; set; } = string.Empty; + } +``` + +**Client Side**: + +```js + + // Fetch call to server to load the Excel file. + fetch('https://localhost:{{Your_port_number}}/Home/Open', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ FileName: 'Sample' }), + }) + .then((response) => response.json()) + .then((data) => { + // Load the JSON data into spreadsheet. + spreadsheet.openFromJson({ file: data }); + }) + +``` + +You can find the server endpoint code to fetch and process the Excel file in this [attachment](https://www.syncfusion.com/downloads/support/directtrac/general/ze/WebApplication1_(1)-880363187). After launching the server endpoint, you need to update the URL on the client side sample as shown below. + +```js +// To open an Excel file from the server. +fetch('https://localhost:{{port_number}}/Home/Open') +``` + +### Open Excel files with AWS Lambda + +Before proceeding with the opening process, you should deploy the spreadsheet open/save web API service in AWS Lambda. To host the open/save web service in the AWS Lambda environment, please refer to the following KB documentation. + +[How to deploy a spreadsheet open and save web API service to AWS Lambda](https://support.syncfusion.com/kb/article/17184/how-to-deploy-a-spreadsheet-open-and-save-web-api-service-to-aws-lambda) + +After deployment, you will get the AWS service URL for the open and save actions. Before opening the Excel file with this hosted open URL, you need to prevent the default file opening process to avoid getting a corrupted file on the open service end. The spreadsheet component appends the file to the `formData` and sends it to the open service, which causes the file to get corrupted. To prevent this, set the `args.cancel` value to `true` in the [`beforeOpen`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#beforeopen) event. After that, you will get the selected file in the `beforeOpen` event argument. Then, convert this file into a base64 string and send it to the open service URL using a fetch request. + +On the open service end, convert the base64 string back to a file and pass it as an argument to the workbook `Open` method. The open service will process the file and return the spreadsheet data in JSON format. You will then receive this JSON data in the fetch success callback. Finally, use the [openFromJson](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#openfromjson) method to load this JSON data into the spreadsheet component. + +The following code example shows how to open an Excel file using a hosted web service in AWS Lambda, as mentioned above. + +```js +function Default() { + let spreadsheet; + const beforeOpenHandler = (eventArgs) => { + eventArgs.cancel = true; // To prevent the default open action. + if (eventArgs.file) { + const reader = new FileReader(); + reader.readAsDataURL(eventArgs.file); + reader.onload = () => { + // Removing the xlsx file content-type. + const base64Data = reader.result.replace('data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,', ''); + openExcel({ + file: base64Data, + extension: eventArgs.file.name.slice(eventArgs.file.name.lastIndexOf('.') + 1), + password: eventArgs.password || '' + }); + }; + } + }; + const openExcel = (requestData) => { + // Fetch call to AWS server for open processing. + fetch('https://xxxxxxxxxxxxxxxxxx.amazonaws.com/Prod/api/spreadsheet/open', { + method: 'POST', + headers: { + 'Accept': 'application/json, text/plain', + 'Content-Type': 'application/json;charset=UTF-8' + }, + body: JSON.stringify(requestData) + }).then((response) => { + if (response.ok) { + return response.json(); + } + }).then((data) => { + // Loading the JSON data into our spreadsheet. + if (data.Workbook && data.Workbook.sheets) { + spreadsheet.openFromJson({ file: data }); + } + }).catch((error) => { + console.log(error); + }); + }; + return (

    ); +} +export default Default; +``` + +```csharp +public IActionResult Open(OpenOptions openOptions) +{ + // Convert the base64 string to bytes array. + byte[] bytes = Convert.FromBase64String(openOptions.File); + // Loading the bytes array to stream. + MemoryStream stream = new MemoryStream(bytes); + OpenRequest open = new OpenRequest(); + // Converting the stream into FormFile. + open.File = new FormFile(stream, 0, bytes.Length, "Sample", "Sample." + openOptions.Extension); + if (string.IsNullOrEmpty(openOptions.Password)) + open.Password = openOptions.Password; + var result = Workbook.Open(open); + return Content(result); +} + +public class OpenOptions +{ + public string File { get; set; } = string.Empty; + public string Password { get; set; } = string.Empty; + public string Extension { get; set; } = string.Empty; +} +``` + +### Open Base64-encoded Excel data + +In the Syncfusion® Spreadsheet component, there is no direct option to open data as a `Base64` string. To achieve this, the `import()` function fetches the `Base64` string, converts it to a Blob, creates a File object from the Blob, and then opens it using the [open](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#open) method in the spreadsheet. + +The following code example shows how to open the spreadsheet data as base64 string. + +{% tabs %} +{% highlight js tabtitle="app.jsx" %} +{% include code-snippet/spreadsheet/react/base-64-string/app/app.jsx %} +{% endhighlight %} +{% highlight ts tabtitle="app.tsx" %} +{% include code-snippet/spreadsheet/react/base-64-string/app/app.tsx %} +{% endhighlight %} +{% endtabs %} + +{% previewsample "/document-processing/code-snippet/spreadsheet/react/base-64-string" %} + + +### Open Excel files in read-only mode + +You can open Excel file into a read-only mode by using the [`openComplete`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#opencomplete) event. In this event, you must protect all the sheets and lock its used range cells by using [`protectSheet`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#protectsheet) and [`lockCells`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#lockcells) methods. + +{% tabs %} +{% highlight js tabtitle="app.jsx" %} +{% include code-snippet/spreadsheet/react/open-save-cs4/app/app.jsx %} +{% endhighlight %} +{% highlight ts tabtitle="app.tsx" %} +{% include code-snippet/spreadsheet/react/open-save-cs4/app/app.tsx %} +{% endhighlight %} +{% endtabs %} + +{% previewsample "/document-processing/code-snippet/spreadsheet/react/open-save-cs4" %} + + +## Advanced Open options + +### Configure JSON deserialization + +Previously, when opening a workbook JSON object into the Spreadsheet using the [openFromJson](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#openfromjson) method, the entire workbook, including all features specified in the JSON object, was processed and loaded into the Spreadsheet. + +Now, you have the option to selectively ignore some features during the opening of the JSON object by configuring deserialization options and passing them as arguments to the `openFromJson` method. This argument is optional, and if not configured, the entire workbook JSON object will be loaded without ignoring any features. + +```ts +spreadsheet.openFromJson({ file: file }, { ignoreStyle: true }); +``` + +| Options | Description | +| ----- | ----- | +| onlyValues | If **true**, only the cell values will be loaded. | +| ignoreStyle | If **true**, styles will be excluded when loading the JSON data. | +| ignoreFormula | If **true**, formulas will be excluded when loading the JSON data. | +| ignoreFormat | If **true**, number formats will be excluded when loading the JSON data. | +| ignoreConditionalFormat | If **true**, conditional formatting will be excluded when loading the JSON data. | +| ignoreValidation | If **true**, data validation rules will be excluded when loading the JSON data. | +| ignoreFreezePane | If **true**, freeze panes will be excluded when loading the JSON data. | +| ignoreWrap | If **true**, text wrapping settings will be excluded when loading the JSON data. | +| ignoreChart | If **true**, charts will be excluded when loading the JSON data. | +| ignoreImage | If **true**, images will be excluded when loading the JSON data. | +| ignoreNote | If **true**, notes will be excluded when loading the JSON data. | + +The following code snippet demonstrates how to configure the deserialization options and pass them as arguments to the openFromJson method: + +{% tabs %} +{% highlight js tabtitle="app.jsx" %} +{% include code-snippet/spreadsheet/react/open-from-json/app/app.jsx %} +{% endhighlight %} +{% highlight ts tabtitle="app.tsx" %} +{% include code-snippet/spreadsheet/react/open-from-json/app/app.tsx %} +{% endhighlight %} +{% endtabs %} + +{% previewsample "/document-processing/code-snippet/spreadsheet/react/open-from-json" %} + +### Optimize Open performance with parsing options + +Opening large Excel files into the React Spreadsheet can sometimes lead to slower performance and increased memory usage. This is often caused by the processing of additional elements such as styles and number formats—even when the actual data content is minimal. For example, an Excel file with only a small amount of data but a large number of styled or formatted empty cells can significantly impact load time and memory consumption. + +To address this, we've introduced parsing options that allow users to selectively skip non-essential features during the open process. By enabling options like `IgnoreStyle` and `IgnoreFormat`, you can reduce the amount of data processed, resulting in: +* Faster load times +* Lower memory usage +* Smaller JSON responses + +These enhancements are especially beneficial for users working with large or complex Excel files, offering a more efficient and responsive experience. + +> **Note:** These options are ideal when styles and number formats are not critical to your use case and the focus is on loading the actual data efficiently. + +The code example below demonstrates how to configure the `IgnoreStyle` and `IgnoreFormat` parsing options on the `server-side`. + +**Code Snippet:** + +**Server-Side Configuration:** +```csharp +public IActionResult Open(IFormCollection openRequest) +{ + OpenRequest open = new OpenRequest(); + ... + open.ParseOptions = new WorkbookParseOptions() { + IgnoreStyle = true, + IgnoreFormat = true + }; + ... + return Content(Workbook.Open(open)); +} +``` + +### Open large Excel files with chunk response processing + +When opening large Excel files with many features and data, the server response can become very large. This might cause memory issues or connection problems during data transmission. The `Chunk Response Processing` feature solves this by dividing the server response into smaller parts, called chunks, and sending them to the client in parallel. The client receives these chunks and combines them to load the Excel data smoothly into the spreadsheet. + +You can enable this feature by setting the [`chunkSize`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/opensettings#chunksize) property in the [`openSettings`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#opensettings) object. Set the [`chunkSize`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/opensettings#chunksize) to a value greater than 0 (in bytes). The [`chunkSize`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/opensettings#chunksize) defines how large each chunk will be. Make sure your server supports chunked responses to use this feature effectively. + +> This feature reduces memory usage on both the server and client, ensuring that resources are managed efficiently during data transmission. By sending smaller parts of data, it prevents connection issues that could occur with large payloads, making the transmission process more reliable. Additionally, it allows large Excel files to be loaded smoothly into the spreadsheet, providing a seamless user experience even with extensive data. + +The following code example demonstrates the client-side and server-side configuration required for handling chunk-based responses when opening an Excel file. + +**Client Side**: + +```js +import { SpreadsheetComponent } from '@syncfusion/ej2-react-spreadsheet'; + +const App = () => { + + const spreadsheetRef = React.useRef(null); + const openSettings = { + // Specifies the size (in bytes) of each chunk for the server response when opening a document. + chunkSize: 1000000, + // Specifies the number of retry attempts for a failed server request when returning the opened file responses in chunks. + // This ensures reliable handling of temporary network or server disruptions during the chunked response process. + retryCount: 3, + // Specifies the delay (in milliseconds) before retrying a failed server request when returning the opened file responses in chunks. + // This ensures controlled retries in case of temporary network or server disruptions during the chunked response process. + retryAfterDelay: 500 + } + + const openUrl = 'https://localhost:{{port_number}}/Home/Open'; + + return ( +
    + + +
    + ); +} + +export default App; +``` + +**Server Endpoint**: + +```csharp +public IActionResult Open(IFormCollection openRequest) +{ + OpenRequest open = new OpenRequest(); + if (openRequest.Files.Count > 0) + { + open.File = openRequest.Files[0]; + } + Microsoft.Extensions.Primitives.StringValues chunkPayload; + if (openRequest.TryGetValue("chunkPayload", out chunkPayload)) + { + // The chunk payload JSON data includes information essential for processing chunked responses. + open.ChunkPayload = chunkPayload; + } + var result = Workbook.Open(open, 150); + return Content(result); +} +``` + +The [attachment](https://www.syncfusion.com/downloads/support/directtrac/general/ze/WebApplication1_7-101537213) includes the server endpoint code for handling chunk-based open processing. After launching the server endpoint, update the `openUrl` property of the spreadsheet in the client-side sample with the server URL, as shown below. + +```js + // Specifies the service URL for processing the Excel file, converting it into a format suitable for loading in the spreadsheet. + + +``` + +## Customization + +### Add custom headers to Open requests + +You can add your own custom header to the open action in the Spreadsheet. For processing the data, it has to be sent from server to client side and adding customer header can provide privacy to the data with the help of Authorization Token. Through the [`beforeOpen`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#beforeopen) event, the custom header can be added to the request during open action. + +{% tabs %} +{% highlight js tabtitle="app.jsx" %} +{% include code-snippet/spreadsheet/react/open-save-cs3/app/app.jsx %} +{% endhighlight %} +{% highlight ts tabtitle="app.tsx" %} +{% include code-snippet/spreadsheet/react/open-save-cs3/app/app.tsx %} +{% endhighlight %} +{% endtabs %} + +{% previewsample "/document-processing/code-snippet/spreadsheet/react/open-save-cs3" %} + +### Handle external workbook reference confirmation + +When you open an Excel file that contains external workbook references, you will see a confirmation dialog. This dialog allows you to either continue with the file opening or cancel the operation. This confirmation dialog will appear only if you set the `AllowExternalWorkbook` property value to **false** during the open request, as shown below. This prevents the spreadsheet from displaying inconsistent data. + +```csharp +public IActionResult Open(IFormCollection openRequest) + { + OpenRequest open = new OpenRequest(); + open.AllowExternalWorkbook = false; + open.File = openRequest.Files[0]; + open.Guid = openRequest["Guid"]; + return Content(Workbook.Open(open)); + } +``` + +> This feature is only applicable when importing an Excel file and not when loading JSON data or binding cell data. + +![External workbook confirmation dialog](./images/external-reference-dialog-alert.png) + +## Server configuration + +In the Spreadsheet component, Excel import processing is handled on the `server‑side`. Therefore, to enable Excel importing in your application, you need to configure a server using any of the following web service technologies: + +* WebAPI +* WCF Service +* ASP.NET MVC Controller Action + +The following code example demonstrates how to configure the server using a `WebAPI` service. + +```csharp + + [Route("api/[controller]")] + public class SpreadsheetController : Controller + { + //To open Excel file + [AcceptVerbs("Post")] + [HttpPost] + [EnableCors("AllowAllOrigins")] + [Route("Open")] + public IActionResult Open(IFormCollection openRequest) + { + OpenRequest open = new OpenRequest(); + open.File = openRequest.Files[0]; + return Content(Workbook.Open(open)); + } + } +``` + +## Server dependencies + +Open helper functions are shipped in the Syncfusion.EJ2.Spreadsheet package, which is available in Essential Studio® and [`nuget.org`](https://www.nuget.org/). Following list of dependencies required for Spreadsheet open and save operations. + +* Syncfusion.EJ2 +* Syncfusion.EJ2.Spreadsheet +* Syncfusion.Compression.Base +* Syncfusion.XlsIO.Base + +And also refer [this](https://help.syncfusion.com/document-processing/excel/spreadsheet/asp-net-core/open-save#server-dependencies) for more information. diff --git a/Document-Processing/Excel/Spreadsheet/React/open-save.md b/Document-Processing/Excel/Spreadsheet/React/open-save.md deleted file mode 100644 index aa50c0db23..0000000000 --- a/Document-Processing/Excel/Spreadsheet/React/open-save.md +++ /dev/null @@ -1,894 +0,0 @@ ---- -layout: post -title: Open save in React Spreadsheet component | Syncfusion -description: Learn here all about Open save in Syncfusion React Spreadsheet component of Syncfusion Essential JS 2 and more. -control: Open save -platform: document-processing -documentation: ug ---- - -# Open save in React Spreadsheet component - -In import an Excel file, it needs to be read and converted to client side Spreadsheet model. The converted client side Spreadsheet model is sent as JSON which is used to render Spreadsheet. Similarly, when you save the Spreadsheet, the client Spreadsheet model is sent to the server as JSON for processing and saved. Server configuration is used for this process. - -To get start quickly with Open and Save, you can check on this video: - -{% youtube "https://www.youtube.com/watch?v=MpwiXmL1Z_o" %} - -## Open - -The Spreadsheet control opens an Excel document with its data, style, format, and more. To enable this feature, set [`allowOpen`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#allowopen) as `true` and assign service url to the [`openUrl`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#openurl) property. - -**User Interface**: - -In user interface you can open an Excel document by clicking `File > Open` menu item in ribbon. - -The following sample shows the `Open` option by using the [`openUrl`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#openurl) property in the Spreadsheet control. You can also use the [`beforeOpen`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#beforeopen) event to trigger before opening an Excel file. - -{% tabs %} -{% highlight js tabtitle="app.jsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs1/app/app.jsx %} -{% endhighlight %} -{% highlight ts tabtitle="app.tsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs1/app/app.tsx %} -{% endhighlight %} -{% endtabs %} - - {% previewsample "/document-processing/code-snippet/spreadsheet/react/open-save-cs1" %} - -Please find the below table for the beforeOpen event arguments. - - | **Parameter** | **Type** | **Description** | -| ----- | ----- | ----- | -| file | FileList or string or File | To get the file stream. `FileList` - contains length and item index.
    `File` - specifies the file lastModified and file name. | -| cancel | boolean | To prevent the open operation. | -| requestData | object | To provide the Form data. | - -> * Use `Ctrl + O` keyboard shortcut to open Excel documents. -> * The default value of the [allowOpen](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#allowopen) property is `true`. For demonstration purpose, we have showcased the [allowOpen](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#allowopen) property in previous code snippet. - -### Open an excel file using a file uploader - -If you explore your machine to select and upload an Excel document using the file uploader, you will receive the uploaded document as a raw file in the [success](https://ej2.syncfusion.com/react/documentation/api/uploader/index-default#success) event of the file uploader. In this `success` event, you should pass the received raw file as an argument to the Spreadsheet's [open](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#open) method to see the appropriate output. - -The following code example shows how to import an Excel document using file uploader in spreadsheet. - -{% tabs %} -{% highlight js tabtitle="app.jsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs9/app/app.jsx %} -{% endhighlight %} -{% highlight ts tabtitle="app.tsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs9/app/app.tsx %} -{% endhighlight %} -{% endtabs %} - -{% previewsample "/document-processing/code-snippet/spreadsheet/react/open-save-cs9" %} - -### Open an external URL excel file while initial load - -You can achieve to access the remote Excel file by using the [`created`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#created) event. In this event you can fetch the Excel file and convert it to a blob. Convert this blob to a file and [`open`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#open) this file by using Spreadsheet component open method. - -{% tabs %} -{% highlight js tabtitle="app.jsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs2/app/app.jsx %} -{% endhighlight %} -{% highlight ts tabtitle="app.tsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs2/app/app.tsx %} -{% endhighlight %} -{% endtabs %} - - {% previewsample "/document-processing/code-snippet/spreadsheet/react/open-save-cs2" %} - -### Open an excel file from blob data - -By default, the Spreadsheet component provides an option to browse files from the local file system and open them within the component. If you want to open an Excel file from blob data, you need to fetch the blob data from the server or another source and convert this blob data into a `File` object. Then, you can use the [open](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#open) method in the Spreadsheet component to load that `File` object. - -Please find the code to fetch the blob data and load it into the Spreadsheet component below. - -{% tabs %} -{% highlight js tabtitle="app.jsx" %} -{% include code-snippet/spreadsheet/react/open-from-blobdata-cs1/app/app.jsx %} -{% endhighlight %} -{% highlight ts tabtitle="app.tsx" %} -{% include code-snippet/spreadsheet/react/open-from-blobdata-cs1/app/app.tsx %} -{% endhighlight %} -{% endtabs %} - -{% previewsample "/document-processing/code-snippet/spreadsheet/react/open-from-blobdata-cs1" %} - -### Open an Excel file located on a server - -By default, the Spreadsheet component provides an option to browse files from the local file system and open them within the component. If you want to load an Excel file located on a server, you need to configure the server endpoint to fetch the Excel file from the server location, process it using `Syncfusion.EJ2.Spreadsheet.AspNet.Core`, and send it back to the client side as `JSON data`. On the client side, you should use the [openFromJson](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#openfromjson) method to load that `JSON data` into the Spreadsheet component. - -**Server Endpoint**: - -```csharp - public IActionResult Open([FromBody] FileOptions options) - { - OpenRequest open = new OpenRequest(); - string filePath = _env.ContentRootPath.ToString() + "\\Files\\" + options.FileName + ".xlsx"; - // Getting the file stream from the file path. - FileStream fileStream = new FileStream(filePath, FileMode.Open); - // Converting "MemoryStream" to "IFormFile". - IFormFile formFile = new FormFile(fileStream, 0, fileStream.Length, "", options.FileName + ".xlsx"); - open.File = formFile; - // Processing the Excel file and return the workbook JSON. - var result = Workbook.Open(open); - fileStream.Close(); - return Content(result); - } - - public class FileOptions - { - public string FileName { get; set; } = string.Empty; - } -``` - -**Client Side**: - -```js - - // Fetch call to server to load the Excel file. - fetch('https://localhost:{{Your_port_number}}/Home/Open', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ FileName: 'Sample' }), - }) - .then((response) => response.json()) - .then((data) => { - // Load the JSON data into spreadsheet. - spreadsheet.openFromJson({ file: data }); - }) - -``` - -You can find the server endpoint code to fetch and process the Excel file in this [attachment](https://www.syncfusion.com/downloads/support/directtrac/general/ze/WebApplication1_(1)-880363187). After launching the server endpoint, you need to update the URL on the client side sample as shown below. - -```js -// To open an Excel file from the server. -fetch('https://localhost:{{port_number}}/Home/Open') -``` - -### Open an excel file using a hosted web service in AWS Lambda - -Before proceeding with the opening process, you should deploy the spreadsheet open/save web API service in AWS Lambda. To host the open/save web service in the AWS Lambda environment, please refer to the following KB documentation. - -[How to deploy a spreadsheet open and save web API service to AWS Lambda](https://support.syncfusion.com/kb/article/17184/how-to-deploy-a-spreadsheet-open-and-save-web-api-service-to-aws-lambda) - -After deployment, you will get the AWS service URL for the open and save actions. Before opening the Excel file with this hosted open URL, you need to prevent the default file opening process to avoid getting a corrupted file on the open service end. The spreadsheet component appends the file to the `formData` and sends it to the open service, which causes the file to get corrupted. To prevent this, set the `args.cancel` value to `true` in the [`beforeOpen`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#beforeopen) event. After that, you will get the selected file in the `beforeOpen` event argument. Then, convert this file into a base64 string and send it to the open service URL using a fetch request. - -On the open service end, convert the base64 string back to a file and pass it as an argument to the workbook `Open` method. The open service will process the file and return the spreadsheet data in JSON format. You will then receive this JSON data in the fetch success callback. Finally, use the [openFromJson](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#openfromjson) method to load this JSON data into the spreadsheet component. - -The following code example shows how to open an Excel file using a hosted web service in AWS Lambda, as mentioned above. - -```js -function Default() { - let spreadsheet; - const beforeOpenHandler = (eventArgs) => { - eventArgs.cancel = true; // To prevent the default open action. - if (eventArgs.file) { - const reader = new FileReader(); - reader.readAsDataURL(eventArgs.file); - reader.onload = () => { - // Removing the xlsx file content-type. - const base64Data = reader.result.replace('data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,', ''); - openExcel({ - file: base64Data, - extension: eventArgs.file.name.slice(eventArgs.file.name.lastIndexOf('.') + 1), - password: eventArgs.password || '' - }); - }; - } - }; - const openExcel = (requestData) => { - // Fetch call to AWS server for open processing. - fetch('https://xxxxxxxxxxxxxxxxxx.amazonaws.com/Prod/api/spreadsheet/open', { - method: 'POST', - headers: { - 'Accept': 'application/json, text/plain', - 'Content-Type': 'application/json;charset=UTF-8' - }, - body: JSON.stringify(requestData) - }).then((response) => { - if (response.ok) { - return response.json(); - } - }).then((data) => { - // Loading the JSON data into our spreadsheet. - if (data.Workbook && data.Workbook.sheets) { - spreadsheet.openFromJson({ file: data }); - } - }).catch((error) => { - console.log(error); - }); - }; - return (
    -
    - { spreadsheet = ssObj; }} beforeOpen={beforeOpenHandler}> - -
    -
    ); -} -export default Default; -``` - -```csharp -public IActionResult Open(OpenOptions openOptions) -{ - // Convert the base64 string to bytes array. - byte[] bytes = Convert.FromBase64String(openOptions.File); - // Loading the bytes array to stream. - MemoryStream stream = new MemoryStream(bytes); - OpenRequest open = new OpenRequest(); - // Converting the stream into FormFile. - open.File = new FormFile(stream, 0, bytes.Length, "Sample", "Sample." + openOptions.Extension); - if (string.IsNullOrEmpty(openOptions.Password)) - open.Password = openOptions.Password; - var result = Workbook.Open(open); - return Content(result); -} - -public class OpenOptions -{ - public string File { get; set; } = string.Empty; - public string Password { get; set; } = string.Empty; - public string Extension { get; set; } = string.Empty; -} -``` - -### Open an excel file from Base64 string data - -In the Syncfusion® Spreadsheet component, there is no direct option to open data as a `Base64` string. To achieve this, the `import()` function fetches the `Base64` string, converts it to a Blob, creates a File object from the Blob, and then opens it using the [open](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#open) method in the spreadsheet. - -The following code example shows how to open the spreadsheet data as base64 string. - -{% tabs %} -{% highlight js tabtitle="app.jsx" %} -{% include code-snippet/spreadsheet/react/base-64-string/app/app.jsx %} -{% endhighlight %} -{% highlight ts tabtitle="app.tsx" %} -{% include code-snippet/spreadsheet/react/base-64-string/app/app.tsx %} -{% endhighlight %} -{% endtabs %} - -{% previewsample "/document-processing/code-snippet/spreadsheet/react/base-64-string" %} - -### Open excel file into a read-only mode - -You can open Excel file into a read-only mode by using the [`openComplete`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#opencomplete) event. In this event, you must protect all the sheets and lock its used range cells by using [`protectSheet`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#protectsheet) and [`lockCells`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#lockcells) methods. - -{% tabs %} -{% highlight js tabtitle="app.jsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs4/app/app.jsx %} -{% endhighlight %} -{% highlight ts tabtitle="app.tsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs4/app/app.tsx %} -{% endhighlight %} -{% endtabs %} - -{% previewsample "/document-processing/code-snippet/spreadsheet/react/open-save-cs4" %} - -### Configure JSON deserialization options - -Previously, when opening a workbook JSON object into the Spreadsheet using the [openFromJson](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#openfromjson) method, the entire workbook, including all features specified in the JSON object, was processed and loaded into the Spreadsheet. - -Now, you have the option to selectively ignore some features during the opening of the JSON object by configuring deserialization options and passing them as arguments to the `openFromJson` method. This argument is optional, and if not configured, the entire workbook JSON object will be loaded without ignoring any features. - -```ts -spreadsheet.openFromJson({ file: file }, { ignoreStyle: true }); -``` - -| Options | Description | -| ----- | ----- | -| onlyValues | If **true**, only the cell values will be loaded. | -| ignoreStyle | If **true**, styles will be excluded when loading the JSON data. | -| ignoreFormula | If **true**, formulas will be excluded when loading the JSON data. | -| ignoreFormat | If **true**, number formats will be excluded when loading the JSON data. | -| ignoreConditionalFormat | If **true**, conditional formatting will be excluded when loading the JSON data. | -| ignoreValidation | If **true**, data validation rules will be excluded when loading the JSON data. | -| ignoreFreezePane | If **true**, freeze panes will be excluded when loading the JSON data. | -| ignoreWrap | If **true**, text wrapping settings will be excluded when loading the JSON data. | -| ignoreChart | If **true**, charts will be excluded when loading the JSON data. | -| ignoreImage | If **true**, images will be excluded when loading the JSON data. | -| ignoreNote | If **true**, notes will be excluded when loading the JSON data. | - -The following code snippet demonstrates how to configure the deserialization options and pass them as arguments to the openFromJson method: - -{% tabs %} -{% highlight js tabtitle="app.jsx" %} -{% include code-snippet/spreadsheet/react/open-from-json/app/app.jsx %} -{% endhighlight %} -{% highlight ts tabtitle="app.tsx" %} -{% include code-snippet/spreadsheet/react/open-from-json/app/app.tsx %} -{% endhighlight %} -{% endtabs %} - -{% previewsample "/document-processing/code-snippet/spreadsheet/react/open-from-json" %} - -### Improving Excel file open performance with parsing options - -Opening large Excel files into the React Spreadsheet can sometimes lead to slower performance and increased memory usage. This is often caused by the processing of additional elements such as styles and number formats—even when the actual data content is minimal. For example, an Excel file with only a small amount of data but a large number of styled or formatted empty cells can significantly impact load time and memory consumption. - -To address this, we've introduced parsing options that allow users to selectively skip non-essential features during the open process. By enabling options like `IgnoreStyle` and `IgnoreFormat`, you can reduce the amount of data processed, resulting in: -* Faster load times -* Lower memory usage -* Smaller JSON responses - -These enhancements are especially beneficial for users working with large or complex Excel files, offering a more efficient and responsive experience. - -> **Note:** These options are ideal when styles and number formats are not critical to your use case and the focus is on loading the actual data efficiently. - -The code example below demonstrates how to configure the `IgnoreStyle` and `IgnoreFormat` parsing options on the `server-side`. - -**Code Snippet:** - -**Server-Side Configuration:** -```csharp -public IActionResult Open(IFormCollection openRequest) -{ - OpenRequest open = new OpenRequest(); - ... - open.ParseOptions = new WorkbookParseOptions() { - IgnoreStyle = true, - IgnoreFormat = true - }; - ... - return Content(Workbook.Open(open)); -} -``` - -### Chunk response processing - -When opening large Excel files with many features and data, the server response can become very large. This might cause memory issues or connection problems during data transmission. The `Chunk Response Processing` feature solves this by dividing the server response into smaller parts, called chunks, and sending them to the client in parallel. The client receives these chunks and combines them to load the Excel data smoothly into the spreadsheet. - -You can enable this feature by setting the [`chunkSize`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/opensettings#chunksize) property in the [`openSettings`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#opensettings) object. Set the [`chunkSize`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/opensettings#chunksize) to a value greater than 0 (in bytes). The [`chunkSize`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/opensettings#chunksize) defines how large each chunk will be. Make sure your server supports chunked responses to use this feature effectively. - -> This feature reduces memory usage on both the server and client, ensuring that resources are managed efficiently during data transmission. By sending smaller parts of data, it prevents connection issues that could occur with large payloads, making the transmission process more reliable. Additionally, it allows large Excel files to be loaded smoothly into the spreadsheet, providing a seamless user experience even with extensive data. - -The following code example demonstrates the client-side and server-side configuration required for handling chunk-based responses when opening an Excel file. - -**Client Side**: - -```js -import { SpreadsheetComponent } from '@syncfusion/ej2-react-spreadsheet'; - -const App = () => { - - const spreadsheetRef = React.useRef(null); - const openSettings = { - // Specifies the size (in bytes) of each chunk for the server response when opening a document. - chunkSize: 1000000, - // Specifies the number of retry attempts for a failed server request when returning the opened file responses in chunks. - // This ensures reliable handling of temporary network or server disruptions during the chunked response process. - retryCount: 3, - // Specifies the delay (in milliseconds) before retrying a failed server request when returning the opened file responses in chunks. - // This ensures controlled retries in case of temporary network or server disruptions during the chunked response process. - retryAfterDelay: 500 - } - - const openUrl = 'https://localhost:{{port_number}}/Home/Open'; - - return ( -
    - - -
    - ); -} - -export default App; -``` - -**Server Endpoint**: - -```csharp -public IActionResult Open(IFormCollection openRequest) -{ - OpenRequest open = new OpenRequest(); - if (openRequest.Files.Count > 0) - { - open.File = openRequest.Files[0]; - } - Microsoft.Extensions.Primitives.StringValues chunkPayload; - if (openRequest.TryGetValue("chunkPayload", out chunkPayload)) - { - // The chunk payload JSON data includes information essential for processing chunked responses. - open.ChunkPayload = chunkPayload; - } - var result = Workbook.Open(open, 150); - return Content(result); -} -``` - -The [attachment](https://www.syncfusion.com/downloads/support/directtrac/general/ze/WebApplication1_7-101537213) includes the server endpoint code for handling chunk-based open processing. After launching the server endpoint, update the `openUrl` property of the spreadsheet in the client-side sample with the server URL, as shown below. - -```js - // Specifies the service URL for processing the Excel file, converting it into a format suitable for loading in the spreadsheet. - - -``` - -### Add custom header during open - -You can add your own custom header to the open action in the Spreadsheet. For processing the data, it has to be sent from server to client side and adding customer header can provide privacy to the data with the help of Authorization Token. Through the [`beforeOpen`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#beforeopen) event, the custom header can be added to the request during open action. - -{% tabs %} -{% highlight js tabtitle="app.jsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs3/app/app.jsx %} -{% endhighlight %} -{% highlight ts tabtitle="app.tsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs3/app/app.tsx %} -{% endhighlight %} -{% endtabs %} - - {% previewsample "/document-processing/code-snippet/spreadsheet/react/open-save-cs3" %} - -### External workbook confirmation dialog - -When you open an Excel file that contains external workbook references, you will see a confirmation dialog. This dialog allows you to either continue with the file opening or cancel the operation. This confirmation dialog will appear only if you set the `AllowExternalWorkbook` property value to **false** during the open request, as shown below. This prevents the spreadsheet from displaying inconsistent data. - -```csharp -public IActionResult Open(IFormCollection openRequest) - { - OpenRequest open = new OpenRequest(); - open.AllowExternalWorkbook = false; - open.File = openRequest.Files[0]; - return Content(Workbook.Open(open)); - } -``` - -> This feature is only applicable when importing an Excel file and not when loading JSON data or binding cell data. - -![External workbook confirmation dialog](./images/external-reference-dialog-alert.png) - -### Supported file formats - -The following list of Excel file formats are supported in Spreadsheet: - -* Microsoft Excel (.xlsx) -* Microsoft Excel 97-2003 (.xls) -* Comma Separated Values (.csv) -* Excel Macro-Enabled Workbook (.xlsm) -* Excel Binary Workbook(.xlsb) - -## Save - -The Spreadsheet control saves its data, style, format, and more as Excel file document. To enable this feature, set [`allowSave`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#allowsave) as `true` and assign service url to the [`saveUrl`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#saveurl) property. - -**User Interface**: - -In user interface, you can save Spreadsheet data as Excel document by clicking `File > Save As` menu item in ribbon. - -The following sample shows the `Save` option by using the [`saveUrl`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#saveurl) property in the Spreadsheet control. You can also use the [`beforeSave`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#beforesave) event to trigger before saving the Spreadsheet as an Excel file. - -{% tabs %} -{% highlight js tabtitle="app.jsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs5/app/app.jsx %} -{% endhighlight %} -{% highlight ts tabtitle="app.tsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs5/app/app.tsx %} -{% endhighlight %} -{% highlight js tabtitle="datasource.jsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs5/app/datasource.jsx %} -{% endhighlight %} -{% highlight ts tabtitle="datasource.tsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs5/app/datasource.tsx %} -{% endhighlight %} -{% endtabs %} - - {% previewsample "/document-processing/code-snippet/spreadsheet/react/open-save-cs5" %} - -Please find the below table for the beforeSave event arguments. - -| **Parameter** | **Type** | **Description** | -| ----- | ----- | ----- | -| url | string | Specifies the save url. | -| fileName | string | Specifies the file name. | -| saveType | SaveType | Specifies the saveType like Xlsx, Xls, Csv and Pdf. | -| customParams | object | Passing the custom parameters from client to server while performing save operation. | -| isFullPost | boolean | It sends the form data from client to server, when set to true. It fetches the data from client to server and returns the data from server to client, when set to false. | -| needBlobData | boolean | You can get the blob data if set to true. | -| cancel | boolean | To prevent the save operations. | - -> * Use `Ctrl + S` keyboard shortcut to save the Spreadsheet data as Excel file. -> * The default value of [allowSave](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#allowsave) property is `true`. For demonstration purpose, we have showcased the [allowSave](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#allowsave) property in previous code snippet. -> * Demo purpose only, we have used the online web service url link. - -### Save an excel file as blob data - -By default, the Spreadsheet component saves the Excel file and downloads it to the local file system. If you want to save an Excel file as blob data, you need to set `needBlobData` property to **true** and `isFullPost` property to **false** in the [beforeSave](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#beforesave) event of the spreadsheet. Subsequently, you will receive the spreadsheet data as a blob in the [saveComplete](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#savecomplete) event. You can then post the blob data to the server endpoint for saving. - -Please find below the code to retrieve blob data from the Spreadsheet component below. - -{% tabs %} -{% highlight js tabtitle="app.jsx" %} -{% include code-snippet/spreadsheet/react/save-as-blobdata-cs1/app/app.jsx %} -{% endhighlight %} -{% highlight ts tabtitle="app.tsx" %} -{% include code-snippet/spreadsheet/react/save-as-blobdata-cs1/app/app.tsx %} -{% endhighlight %} -{% endtabs %} - -{% previewsample "/document-processing/code-snippet/spreadsheet/react/save-as-blobdata-cs1" %} - -### Save an Excel file to a server - -By default, the Spreadsheet component saves the Excel file and downloads it to the local file system. If you want to save an Excel file to a server location, you need to configure the server endpoint to convert the spreadsheet data into a file stream and save it to the server location. To do this, first, on the client side, you must convert the spreadsheet data into `JSON` format using the [saveAsJson](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#saveasjson) method and send it to the server endpoint. On the server endpoint, you should convert the received spreadsheet `JSON` data into a file stream using `Syncfusion.EJ2.Spreadsheet.AspNet.Core`, then convert the stream into an Excel file, and finally save it to the server location. - -**Client Side**: - -```js - - // Convert the spreadsheet workbook to JSON data. - spreadsheet.saveAsJson().then((json) => { - const formData = new FormData(); - formData.append('FileName', "Sample"); - formData.append('saveType', 'Xlsx'); - // Passing the JSON data to perform the save operation. - formData.append('JSONData', JSON.stringify(json.jsonObject.Workbook)); - formData.append('PdfLayoutSettings', JSON.stringify({ FitSheetOnOnePage: false })); - // Using fetch to invoke the save process. - fetch('https://localhost:{{Your_port_number}}/Home/Save', { - method: 'POST', - body: formData - }).then((response) => { - console.log(response); - }); - }); - -``` - -**Server Endpoint**: - -```csharp - - public string Save(SaveSettings saveSettings) - { - ExcelEngine excelEngine = new ExcelEngine(); - IApplication application = excelEngine.Excel; - try - { - - // Save the workbook as stream. - Stream fileStream = Workbook.Save(saveSettings); - // Using XLSIO, we are opening the file stream and saving the file in the server under "Files" folder. - // You can also save the stream file in your server location. - IWorkbook workbook = application.Workbooks.Open(fileStream); - string basePath = _env.ContentRootPath + "\\Files\\" + saveSettings.FileName + ".xlsx"; - var file = System.IO.File.Create(basePath); - fileStream.Seek(0, SeekOrigin.Begin); - // To convert the stream to file options. - fileStream.CopyTo(file); - file.Dispose(); - fileStream.Dispose(); - return string.Empty; - } - catch (Exception ex) - { - return ex.Message; - } - } - -``` - -You can find the server endpoint code to save the spreadsheet data as an Excel file in this [attachment](https://www.syncfusion.com/downloads/support/directtrac/general/ze/WebApplication1_(1)-880363187). After launching the server endpoint, you need to update the URL on the client side sample as shown below. - -```js - -//To save an Excel file to the server. -fetch('https://localhost:{{port_number}}/Home/Save') - -``` - -### Save an excel file using a hosted web service in AWS Lambda - -Before proceeding with the save process, you should deploy the spreadsheet open/save web API service in AWS Lambda. To host the open/save web service in the AWS Lambda environment, please refer to the following KB documentation. - -[How to deploy a spreadsheet open and save web API service to AWS Lambda](https://support.syncfusion.com/kb/article/17184/how-to-deploy-a-spreadsheet-open-and-save-web-api-service-to-aws-lambda) - -After deployment, you will get the AWS service URL for the open and save actions. Before saving the Excel file with this hosted save URL, you need to prevent the default save action to avoid getting a corrupted excel file on the client end. The save service returns the file stream as a result to the client, which can cause the file to become corrupted. To prevent this, set the `args.cancel` value to `true` in the [`beforeSave`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#beforesave) event. After that, convert the spreadsheet data into JSON format using the [saveAsJson](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#saveasjson) method in the `beforeSave` event and send it to the save service endpoint URL using a fetch request. - -On the server side, the save service will take the received JSON data, pass it to the workbook `Save` method, and return the result as a base64 string. The fetch success callback will receive the Excel file in base64 string format on the client side. Finally, you can then convert the base64 string back to a file on the client end to obtain a non-corrupted Excel file. - -The following code example shows how to save an Excel file using a hosted web service in AWS Lambda, as mentioned above. - -```js -function Default() { - let spreadsheet; - let saveInitiated; - const beforeSaveHandler = (eventArgs) => { - if (!saveInitiated) { - eventArgs.cancel = true; // Preventing default save action. - saveInitiated = true; // The "beforeSave" event will trigger for "saveAsJson" action also, so we are preventing for the "saveAsJson". - saveAsExcel(eventArgs); - } - }; - const saveAsExcel = (eventArgs) => { - // Convert the spreadsheet workbook to JSON data. - spreadsheet.saveAsJson().then(Json => { - saveInitiated = false; - const formData = new FormData(); - // Passing the JSON data to server to perform save operation. - formData.append('JSONData', JSON.stringify(Json.jsonObject.Workbook)); - formData.append('saveType', 'Xlsx'); - formData.append('fileName', 'Worksheet'); - formData.append('pdfLayoutSettings', '{"fitSheetOnOnePage":false,"orientation":"Portrait"}'); - // Using fetch API to invoke the server for save processing. - fetch('https://xxxxxxxxxxxxxxxxxxxxxxxxx.amazonaws.com/Prod/api/spreadsheet/save', { - method: 'POST', body: formData - }).then(response => { - if (response.ok) { - return response.blob(); - } - }).then(data => { - const reader = new FileReader(); - reader.onload = function () { - //Converts the result of the file reading operation into a base64 string. - const textBase64Str = reader.result.toString(); - //Converts the base64 string into a Excel base64 string. - const excelBase64Str = atob(textBase64Str.replace('data:text/plain;base64,', '')); - //Converts the Excel base64 string into byte characters. - const byteCharacters = atob(excelBase64Str.replace('data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,', '')); - const byteArrays = []; - for (let i = 0; i < byteCharacters.length; i++) { - byteArrays.push(byteCharacters.charCodeAt(i)); - } - const byteArray = new Uint8Array(byteArrays); - //creates a blob data from the byte array with xlsx content type. - const blobData = new Blob([byteArray], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); - const blobUrl = URL.createObjectURL(blobData); - const anchor = document.createElement('a'); - anchor.download = 'Sample.xlsx'; - anchor.href = blobUrl; - document.body.appendChild(anchor); - anchor.click(); - URL.revokeObjectURL(blobUrl); - document.body.removeChild(anchor); - } - reader.readAsDataURL(data); - }); - }); - }; - return (
    -
    - { spreadsheet = ssObj; }} beforeSave={beforeSaveHandler}> - -
    -
    ); -} -export default Default; -``` - -```csharp -public string Save([FromForm]SaveSettings saveSettings) -{ - // This will return the Excel in base64 string format. - return Workbook.Save(saveSettings); -} -``` - -### Save data as a Base64 string - -In the Spreadsheet component, there is currently no direct option to save data as a `Base64` string. You can achieve this by saving the Spreadsheet data as blob data and then converting that saved blob data to a `Base64` string using `FileReader`. - -> You can get the Spreadsheet data as blob in the [saveComplete](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#savecomplete) event when you set the `needBlobData` as **true** and `isFullPost` as **false** in the [beforeSave](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#beforesave) event. - -The following code example shows how to save the spreadsheet data as base64 string. - -{% tabs %} -{% highlight js tabtitle="app.jsx" %} -{% include code-snippet/spreadsheet/react/base-64-string/app/app.jsx %} -{% endhighlight %} -{% highlight ts tabtitle="app.tsx" %} -{% include code-snippet/spreadsheet/react/base-64-string/app/app.tsx %} -{% endhighlight %} -{% endtabs %} - -{% previewsample "/document-processing/code-snippet/spreadsheet/react/base-64-string" %} - -### Configure JSON serialization options - -Previously, when saving the Spreadsheet as a workbook JSON object using the [saveAsJson](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#saveasjson) method, the entire workbook with all loaded features were processed and saved as a JSON object. - -Now, you have the option to selectively ignore some features while saving the Spreadsheet as a JSON object by configuring serialization options and passing them as arguments to the `saveAsJson` method. This argument is optional, and if not configured, the entire workbook JSON object will be saved without ignoring any features. - -```ts -spreadsheet.saveAsJson({ onlyValues: true }); -``` - -| Options | Description | -| ----- | ----- | -| onlyValues | If **true**, includes only the cell values in the JSON output. | -| ignoreStyle | If **true**, excludes styles from the JSON output. | -| ignoreFormula | If **true**, excludes formulas from the JSON output. | -| ignoreFormat | If **true**, excludes number formats from the JSON output. | -| ignoreConditionalFormat | If **true**, excludes conditional formatting from the JSON output. | -| ignoreValidation | If **true**, excludes data validation rules from the JSON output. | -| ignoreFreezePane | If **true**, excludes freeze panes from the JSON output. | -| ignoreWrap | If **true**, excludes text wrapping settings from the JSON output. | -| ignoreChart | If **true**, excludes charts from the JSON output. | -| ignoreImage | If **true**, excludes images from the JSON output. | -| ignoreNote | If **true**, excludes notes from the JSON output. | - -The following code snippet demonstrates how to configure the serialization options and pass them as arguments to the saveAsJson method: - -{% tabs %} -{% highlight js tabtitle="app.jsx" %} -{% include code-snippet/spreadsheet/react/save-as-json/app/app.jsx %} -{% endhighlight %} -{% highlight ts tabtitle="app.tsx" %} -{% include code-snippet/spreadsheet/react/save-as-json/app/app.tsx %} -{% endhighlight %} -{% endtabs %} - -{% previewsample "/document-processing/code-snippet/spreadsheet/react/save-as-json" %} - -### Send and receive custom params from client to server - -Passing the custom parameters from client to server by using [`beforeSave`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#beforesave) event. - -{% tabs %} -{% highlight js tabtitle="app.jsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs6/app/app.jsx %} -{% endhighlight %} -{% highlight ts tabtitle="app.tsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs6/app/app.tsx %} -{% endhighlight %} -{% highlight js tabtitle="datasource.jsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs6/app/datasource.jsx %} -{% endhighlight %} -{% highlight ts tabtitle="datasource.tsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs6/app/datasource.tsx %} -{% endhighlight %} -{% endtabs %} - - {% previewsample "/document-processing/code-snippet/spreadsheet/react/open-save-cs6" %} -Server side code snippets: - -```csharp - - public IActionResult Save(SaveSettings saveSettings, string customParams) - { - Console.WriteLine(customParams); // you can get the custom params in controller side - return Workbook.Save(saveSettings); - } -``` -### Add custom header during save - -You can add your own custom header to the save action in the Spreadsheet. For processing the data, it has to be sent from client to server side and adding customer header can provide privacy to the data with the help of Authorization Token. Through the [`fileMenuItemSelect`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#filemenuitemselect) event, the custom header can be added to the request during save action. - -{% tabs %} -{% highlight js tabtitle="app.jsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs7/app/app.jsx %} -{% endhighlight %} -{% highlight ts tabtitle="app.tsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs7/app/app.tsx %} -{% endhighlight %} -{% highlight js tabtitle="datasource.jsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs7/app/datasource.jsx %} -{% endhighlight %} -{% highlight ts tabtitle="datasource.tsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs7/app/datasource.tsx %} -{% endhighlight %} -{% endtabs %} - - {% previewsample "/document-processing/code-snippet/spreadsheet/react/open-save-cs7" %} - -### Change the PDF orientation - -By default, the PDF document is created in **Portrait** orientation. You can change the orientation of the PDF document by using the `args.pdfLayoutSettings.orientation` argument settings in the [`beforeSave`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#beforesave) event. - -The possible values are: - -* **Portrait** - Used to display content in a vertical layout. -* **Landscape** - Used to display content in a horizontal layout. - -{% tabs %} -{% highlight js tabtitle="app.jsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs8/app/app.jsx %} -{% endhighlight %} -{% highlight ts tabtitle="app.tsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs8/app/app.tsx %} -{% endhighlight %} -{% highlight js tabtitle="datasource.jsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs8/app/datasource.jsx %} -{% endhighlight %} -{% highlight ts tabtitle="datasource.tsx" %} -{% include code-snippet/spreadsheet/react/open-save-cs8/app/datasource.tsx %} -{% endhighlight %} -{% endtabs %} - - {% previewsample "/document-processing/code-snippet/spreadsheet/react/open-save-cs8" %} - -### Supported file formats - -The following list of Excel file formats are supported in Spreadsheet: - -* Microsoft Excel (.xlsx) -* Microsoft Excel 97-2003 (.xls) -* Comma Separated Values (.csv) -* Portable Document Format (.pdf) - -### Methods - -To save the Spreadsheet document as an `xlsx, xls, csv, or pdf` file, by using [save](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#save) method should be called with the `url`, `fileName` and `saveType` as parameters. The following code example shows to save the spreadsheet file as an `xlsx, xls, csv, or pdf` in the button click event. - -{% tabs %} -{% highlight js tabtitle="app.jsx" %} -{% include code-snippet/spreadsheet/react/save-cs1/app/app.jsx %} -{% endhighlight %} -{% highlight ts tabtitle="app.tsx" %} -{% include code-snippet/spreadsheet/react/save-cs1/app/app.tsx %} -{% endhighlight %} -{% highlight js tabtitle="datasource.jsx" %} -{% include code-snippet/spreadsheet/react/save-cs1/app/datasource.jsx %} -{% endhighlight %} -{% highlight ts tabtitle="datasource.tsx" %} -{% include code-snippet/spreadsheet/react/save-cs1/app/datasource.tsx %} -{% endhighlight %} -{% endtabs %} - - {% previewsample "/document-processing/code-snippet/spreadsheet/react/save-cs1" %} - -## Server Configuration - -In Spreadsheet control, Excel import and export support processed in `server-side`, to use importing and exporting in your projects, it is required to create a server with any of the following web services. - -* WebAPI -* WCF Service -* ASP.NET MVC Controller Action - -The following code snippets shows server configuration using `WebAPI` service. - -```csharp - - [Route("api/[controller]")] - public class SpreadsheetController : Controller - { - //To open Excel file - [AcceptVerbs("Post")] - [HttpPost] - [EnableCors("AllowAllOrigins")] - [Route("Open")] - public IActionResult Open(IFormCollection openRequest) - { - OpenRequest open = new OpenRequest(); - open.File = openRequest.Files[0]; - return Content(Workbook.Open(open)); - } - - //To save as Excel file - [AcceptVerbs("Post")] - [HttpPost] - [EnableCors("AllowAllOrigins")] - [Route("Save")] - public IActionResult Save([FromForm]SaveSettings saveSettings) - { - return Workbook.Save(saveSettings); - } - } -``` - -## Server Dependencies - -Open and save helper functions are shipped in the Syncfusion.EJ2.Spreadsheet package, which is available in Essential Studio® and [`nuget.org`](https://www.nuget.org/). Following list of dependencies required for Spreadsheet open and save operations. - -* Syncfusion.EJ2 -* Syncfusion.EJ2.Spreadsheet -* Syncfusion.Compression.Base -* Syncfusion.XlsIO.Base - -And also refer [this](https://help.syncfusion.com/document-processing/excel/spreadsheet/asp-net-core/open-save#server-dependencies) for more information. - -## Note - -You can refer to our [React Spreadsheet](https://www.syncfusion.com/spreadsheet-editor-sdk/react-spreadsheet-editor) feature tour page for its groundbreaking feature representations. You can also explore our [React Spreadsheet example](https://www.syncfusion.com/spreadsheet-editor-sdk/react-spreadsheet-editor) to knows how to present and manipulate data. - -## See Also - -* [Filtering](./filter) -* [Sorting](./sort) -* [Hyperlink](./link) -* [Docker Image](./docker-deployment) diff --git a/Document-Processing/Excel/Spreadsheet/React/save-excel-files.md b/Document-Processing/Excel/Spreadsheet/React/save-excel-files.md new file mode 100644 index 0000000000..988f2cf95f --- /dev/null +++ b/Document-Processing/Excel/Spreadsheet/React/save-excel-files.md @@ -0,0 +1,458 @@ +--- +layout: post +title: Save Excel Files in React Spreadsheet component | Syncfusion +description: Learn here all about Saving Excel files in Syncfusion React Spreadsheet component of Syncfusion Essential JS 2 and more. +platform: document-processing +control: Open +documentation: ug +--- + +# Save Excel Files in Syncfusion React Spreadsheet + +When exporting an Excel file from the React Spreadsheet component, the process is handled through a streamlined server‑side workflow. The Spreadsheet content displayed in the browser is first serialized into a structured JSON workbook. This JSON includes all essential details—such as data, formulas, formatting, styles, and sheet configuration. + +Once generated, this JSON workbook is sent to the server, where the [`Syncfusion.EJ2.Spreadsheet library`](https://www.nuget.org/packages/Syncfusion.EJ2.Spreadsheet.AspNet.Core) uses [`Syncfusion XlsIO`](https://help.syncfusion.com/document-processing/excel/excel-library/net/overview) to convert the JSON data into a fully formatted Excel file. During this process, the JSON workbook is parsed and its contents are mapped to an XlsIO Workbook instance, ensuring that all data, styles, formulas, and other Spreadsheet features are accurately preserved. + +Since the server is responsible for generating the final Excel file, the total export time can vary depending on the workbook’s complexity. Factors such as the level of formatting, styles and the use of advanced features like formulas or conditional formatting can influence processing time. After the file is successfully generated, it is sent back to the client for download. + +To enable saving Excel files, set the [`allowSave`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#allowsave) property to **true** and specify the service URL using the [`saveUrl`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#saveurl) property. When a save action is triggered, the control sends the spreadsheet model to this endpoint, where it is processed and returned as a downloadable Excel file. + +For a quick walkthrough on how the save functionality works, refer to the following video: +{% youtube "https://www.youtube.com/watch?v=MpwiXmL1Z_o" %} + +## UI options to Save Excel files + +In user interface, you can save Spreadsheet data as Excel document by clicking `File > Save As` menu item in ribbon. + +The following sample shows the `Save` option by using the [`saveUrl`](https://ej2.syncfusion.com/documentation/api/spreadsheet/index-default#saveurl) property in the Spreadsheet control. You can also use the [`beforeSave`](https://ej2.syncfusion.com/documentation/api/spreadsheet/index-default#beforesave) event to customize or cancel the save action which gets triggered before saving the Spreadsheet as an Excel file. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} +{% include code-snippet/spreadsheet/javascript-es6/open-save-cs5/index.ts %} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} +{% include code-snippet/spreadsheet/javascript-es6/open-save-cs5/index.html %} +{% endhighlight %} +{% endtabs %} + +{% previewsample "/document-processing/code-snippet/spreadsheet/javascript-es6/open-save-cs5" %} + +Please find the below table for the [`beforeSave`](https://ej2.syncfusion.com/documentation/api/spreadsheet/index-default#beforesave) event arguments. + +| **Parameter** | **Type** | **Description** | +| ----- | ----- | ----- | +| url | string | Specifies the save url. | +| fileName | string | Specifies the file name. | +| saveType | SaveType | Specifies the saveType like Xlsx, Xls, Csv and Pdf. | +| customParams | object | Passing the custom parameters from client to server while performing save operation. | +| isFullPost | boolean | It sends the form data from client to server, when set to true. It fetches the data from client to server and returns the data from server to client, when set to false. | +| needBlobData | boolean | You can get the blob data if set to true. | +| cancel | boolean | To prevent the save operations. | + +> * Use `Ctrl + S` keyboard shortcut to save the Spreadsheet data as Excel file. + +> * The default value of [allowSave](https://ej2.syncfusion.com/documentation/api/spreadsheet/index-default#allowsave) property is `true`. For demonstration purpose, we have showcased the [allowSave](https://ej2.syncfusion.com/documentation/api/spreadsheet/index-default#allowsave) property in previous code snippet. +> * Demo purpose only, we have used the online web service url link. + +## Save Excel files programmatically + +To save Excel files programmatically in the Spreadsheet, you can use the [`save`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#save) method of the Spreadsheet component. Before invoking this method, ensure that the [`saveUrl`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#saveurl) property is properly configured, as it is required for processing and generating the file on the server. + +Please find the below table for the [`save`](https://ej2.syncfusion.com/documentation/api/spreadsheet/index-default#save) method arguments. + +| **Parameter** | **Type** | **Description** | +|-----------------------|------------------------|------------------------------------------------------------------| +| options | [`SaveOptions`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/saveoptions) | Options for opening the JSON object. | +| jsonConfig *(optional)* | [`SerializationOptions`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/serializationOptions) | Specify the serialization options to customize the loading of the JSON data. | + +The following code example demonstrates how to save an Excel file programmatically in the Spreadsheet. + +```js +import React, { useRef } from 'react'; +import { createRoot } from 'react-dom/client'; +import { salesData } from './data'; +import { SpreadsheetComponent, SheetsDirective, RangesDirective, RangeDirective,SheetDirective} from '@syncfusion/ej2-react-spreadsheet'; + +const App = () => { + const spreadsheetRef = useRef(null); + const onClick = () => { + spreadsheetRef.current?.save({ + url: 'https://document.syncfusion.com/web-services/spreadsheet-editor/api/spreadsheet/save', + fileName: 'Worksheet', + saveType: 'Xlsx', + }); + }; + + return ( +
    + + + + + + + + + + +
    + ); +}; + +export default App; + +const root = createRoot(document.getElementById('spreadsheet')); +root.render(); +``` + + +## Supported Excel file formats for Save + +The following file formats are supported when saving the Spreadsheet component: + +* Microsoft Excel Workbook (.xlsx) +* Microsoft Excel 97–2003 Workbook (.xls) +* Comma-Separated Values (.csv) +* Portable Document Format (.pdf) + +## Export options + +### Save Excel files as Blob + +By default, the Spreadsheet control saves the Excel file and downloads it to the local file system. If you want to save an Excel file as blob data, you need to set `needBlobData` property to **true** and `isFullPost` property to **false** in the [beforeSave](https://ej2.syncfusion.com/documentation/api/spreadsheet/index-default#beforesave) event of the spreadsheet. Subsequently, you will receive the spreadsheet data as a blob in the [saveComplete](https://ej2.syncfusion.com/documentation/api/spreadsheet/index-default#savecomplete) event. You can then post the blob data to the server endpoint for saving. + +Please find below the code to retrieve blob data from the Spreadsheet control below. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} +{% include code-snippet/spreadsheet/javascript-es6/save-as-blobdata-cs1/index.ts %} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} +{% include code-snippet/spreadsheet/javascript-es6/save-as-blobdata-cs1/index.html %} +{% endhighlight %} +{% endtabs %} + +{% previewsample "/document-processing/code-snippet/spreadsheet/javascript-es6/save-as-blobdata-cs1" %} + +### Save Excel files to a server + +By default, the Spreadsheet control saves the Excel file and downloads it to the local file system. If you want to save an Excel file to a server location, you need to configure the server endpoint to convert the spreadsheet data into a file stream and save it to the server location. To do this, first, on the client side, you must convert the spreadsheet data into `JSON` format using the [saveAsJson](https://ej2.syncfusion.com/documentation/api/spreadsheet/index-default#saveasjson) method and send it to the server endpoint. On the server endpoint, you should convert the received spreadsheet `JSON` data into a file stream using `Syncfusion.EJ2.Spreadsheet.AspNet.Core`, then convert the stream into an Excel file, and finally save it to the server location. + +**Client Side**: + +```js + + // Convert the spreadsheet workbook to JSON data. + spreadsheet.saveAsJson().then((json) => { + const formData = new FormData(); + formData.append('FileName', "Sample"); + formData.append('saveType', 'Xlsx'); + // Passing the JSON data to perform the save operation. + formData.append('JSONData', JSON.stringify(json.jsonObject.Workbook)); + formData.append('PdfLayoutSettings', JSON.stringify({ FitSheetOnOnePage: false })); + // Using fetch to invoke the save process. + fetch('https://localhost:{Your port number}/Home/Save', { + method: 'POST', + body: formData + }).then((response) => { + console.log(response); + }); + }); + +``` + +**Server Endpoint**: + +```csharp + public string Save(SaveSettings saveSettings) + { + try + { + // Save the workbook as stream. + Stream fileStream = Workbook.Save(saveSettings); + // You can also save the stream file in your server location. + string basePath = _env.ContentRootPath + "\\Files\\" + saveSettings.FileName + ".xlsx"; + var file = System.IO.File.Create(basePath); + fileStream.Seek(0, SeekOrigin.Begin); + // To convert the stream to file options. + fileStream.CopyTo(file); + file.Dispose(); + fileStream.Dispose(); + return string.Empty; + } + catch (Exception ex) + { + return ex.Message; + } + } +``` + +You can find the server endpoint code to save the spreadsheet data as an Excel file in this [attachment](https://www.syncfusion.com/downloads/support/directtrac/general/ze/WebApplication1_(1)-880363187). After launching the server endpoint, you need to update the URL on the client side sample as shown below. + +```js +//To save an Excel file to the server. +fetch('https://localhost:{port number}/Home/Save') +``` + +### Save Excel files with AWS Lambda + +Before proceeding with the save process, you should deploy the spreadsheet open/save web API service in AWS Lambda. To host the open/save web service in the AWS Lambda environment, please refer to the following KB documentation. + +[How to deploy a spreadsheet open and save web API service to AWS Lambda](https://support.syncfusion.com/kb/article/17184/how-to-deploy-a-spreadsheet-open-and-save-web-api-service-to-aws-lambda) + +After deployment, you will get the AWS service URL for the open and save actions. Before saving the Excel file with this hosted save URL, you need to prevent the default save action to avoid getting a corrupted excel file on the client end. The save service returns the file stream as a result to the client, which can cause the file to become corrupted. To prevent this, set the `args.cancel` value to `true` in the [`beforeSave`](https://ej2.syncfusion.com/documentation/api/spreadsheet/index-default#beforesave) event. After that, convert the spreadsheet data into JSON format using the [saveAsJson](https://ej2.syncfusion.com/documentation/api/spreadsheet/index-default#saveasjson) method in the `beforeSave` event and send it to the save service endpoint URL using a fetch request. + +On the server side, the save service will take the received JSON data, pass it to the workbook `Save` method, and return the result as a base64 string. The fetch success callback will receive the Excel file in base64 string format on the client side. Finally, you can then convert the base64 string back to a file on the client end to obtain a non-corrupted Excel file. + +The following code example shows how to save an Excel file using a hosted web service in AWS Lambda, as mentioned above. + +```ts +import { Spreadsheet } from '@syncfusion/ej2-spreadsheet'; + +let saveInitiated: boolean; +//Initialize Spreadsheet component +let spreadsheet: Spreadsheet = new Spreadsheet({ + sheets: [ + ], + saveUrl:'https://xxxxxxxxxxxxxxxxxxxxxxxxx.amazonaws.com/Prod/api/spreadsheet/save', + beforeSave: (eventArgs) => { + if (!saveInitiated) { + eventArgs.cancel = true; // Preventing default save action. + saveInitiated = true; // The "beforeSave" event will trigger for "saveAsJson" action also, so we are preventing for the "saveAsJson". + saveAsExcel(eventArgs); + } + } +}); +const saveAsExcel = (eventArgs) => { + // Convert the spreadsheet workbook to JSON data. + spreadsheet.saveAsJson().then(Json => { + saveInitiated = false; + const formData = new FormData(); + // Passing the JSON data to server to perform save operation. + formData.append('JSONData', JSON.stringify(Json.jsonObject.Workbook)); + formData.append('saveType', 'Xlsx'); + formData.append('fileName', 'Worksheet'); + formData.append('pdfLayoutSettings', '{"fitSheetOnOnePage":false,"orientation":"Portrait"}'); + // Using fetch API to invoke the server for save processing. + fetch('https://xxxxxxxxxxxxxxxxxxxxxxxxx.amazonaws.com/Prod/api/spreadsheet/save', { + method: 'POST', body: formData + }).then(response => { + if (response.ok) { + return response.blob(); + } + }).then(data => { + const reader = new FileReader(); + reader.onload = function () { + //Converts the result of the file reading operation into a base64 string. + const textBase64Str = reader.result.toString(); + //Converts the base64 string into a Excel base64 string. + const excelBase64Str = atob(textBase64Str.replace('data:text/plain;base64,', '')); + //Converts the Excel base64 string into byte characters. + const byteCharacters = atob(excelBase64Str.replace('data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,', '')); + const byteArrays = []; + for (let i = 0; i < byteCharacters.length; i++) { + byteArrays.push(byteCharacters.charCodeAt(i)); + } + const byteArray = new Uint8Array(byteArrays); + //creates a blob data from the byte array with xlsx content type. + const blobData = new Blob([byteArray], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); + const blobUrl = URL.createObjectURL(blobData); + const anchor = document.createElement('a'); + anchor.download = 'Sample.xlsx'; + anchor.href = blobUrl; + document.body.appendChild(anchor); + anchor.click(); + URL.revokeObjectURL(blobUrl); + document.body.removeChild(anchor); + } + reader.readAsDataURL(data); + }); + }); +}; + +//Render initialized Spreadsheet component +spreadsheet.appendTo('#spreadsheet'); +``` + +```csharp +public string Save([FromForm]SaveSettings saveSettings) +{ + // This will return the Excel in base64 string format. + return Workbook.Save(saveSettings); +} +``` + +### Save Spreadsheet data as Base64 string + +In the Spreadsheet component, there is currently no direct option to save data as a `Base64` string. You can achieve this by saving the Spreadsheet data as blob data and then converting that saved blob data to a `Base64` string using `FileReader`. + +> You can get the Spreadsheet data as blob in the [saveComplete](https://ej2.syncfusion.com/documentation/api/spreadsheet/index-default#savecomplete) event when you set the `needBlobData` as **true** and `isFullPost` as **false** in the [beforeSave](https://ej2.syncfusion.com/documentation/api/spreadsheet/index-default#beforesave) event. + +The following code example shows how to save the spreadsheet data as base64 string. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} +{% include code-snippet/spreadsheet/javascript-es6/base-64-string/index.ts %} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} +{% include code-snippet/spreadsheet/javascript-es6/base-64-string/index.html %} +{% endhighlight %} +{% endtabs %} + +{% previewsample "/document-processing/code-snippet/spreadsheet/javascript-es6/base-64-string" %} + +## Advanced Save options + +### Configure JSON serialization + +Previously, when saving the Spreadsheet as a workbook JSON object using the [saveAsJson](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#saveasjson) method, the entire workbook with all loaded features were processed and saved as a JSON object. + +Now, you have the option to selectively ignore some features while saving the Spreadsheet as a JSON object by configuring serialization options and passing them as arguments to the `saveAsJson` method. This argument is optional, and if not configured, the entire workbook JSON object will be saved without ignoring any features. + +```ts +spreadsheet.saveAsJson({ onlyValues: true }); +``` + +| Options | Description | +| ----- | ----- | +| onlyValues | If **true**, includes only the cell values in the JSON output. | +| ignoreStyle | If **true**, excludes styles from the JSON output. | +| ignoreFormula | If **true**, excludes formulas from the JSON output. | +| ignoreFormat | If **true**, excludes number formats from the JSON output. | +| ignoreConditionalFormat | If **true**, excludes conditional formatting from the JSON output. | +| ignoreValidation | If **true**, excludes data validation rules from the JSON output. | +| ignoreFreezePane | If **true**, excludes freeze panes from the JSON output. | +| ignoreWrap | If **true**, excludes text wrapping settings from the JSON output. | +| ignoreChart | If **true**, excludes charts from the JSON output. | +| ignoreImage | If **true**, excludes images from the JSON output. | +| ignoreNote | If **true**, excludes notes from the JSON output. | + +The following code snippet demonstrates how to configure the serialization options and pass them as arguments to the saveAsJson method: + +{% tabs %} +{% highlight js tabtitle="app.jsx" %} +{% include code-snippet/spreadsheet/react/save-as-json/app/app.jsx %} +{% endhighlight %} +{% highlight ts tabtitle="app.tsx" %} +{% include code-snippet/spreadsheet/react/save-as-json/app/app.tsx %} +{% endhighlight %} +{% endtabs %} + +{% previewsample "/document-processing/code-snippet/spreadsheet/react/save-as-json" %} + +## Customization + +### Pass custom parameters during Save + +Passing the custom parameters from client to server by using [`beforeSave`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#beforesave) event. + +{% tabs %} +{% highlight js tabtitle="app.jsx" %} +{% include code-snippet/spreadsheet/react/open-save-cs6/app/app.jsx %} +{% endhighlight %} +{% highlight ts tabtitle="app.tsx" %} +{% include code-snippet/spreadsheet/react/open-save-cs6/app/app.tsx %} +{% endhighlight %} +{% highlight js tabtitle="datasource.jsx" %} +{% include code-snippet/spreadsheet/react/open-save-cs6/app/datasource.jsx %} +{% endhighlight %} +{% highlight ts tabtitle="datasource.tsx" %} +{% include code-snippet/spreadsheet/react/open-save-cs6/app/datasource.tsx %} +{% endhighlight %} +{% endtabs %} + + {% previewsample "/document-processing/code-snippet/spreadsheet/react/open-save-cs6" %} +Server side code snippets: + +```csharp + + public IActionResult Save(SaveSettings saveSettings, string customParams) + { + Console.WriteLine(customParams); // you can get the custom params in controller side + return Workbook.Save(saveSettings); + } +``` + +### Add custom headers to Save requests + +You can add your own custom header to the save action in the Spreadsheet. For processing the data, it has to be sent from client to server side and adding customer header can provide privacy to the data with the help of Authorization Token. Through the [`fileMenuItemSelect`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#filemenuitemselect) event, the custom header can be added to the request during save action. + +{% tabs %} +{% highlight js tabtitle="app.jsx" %} +{% include code-snippet/spreadsheet/react/open-save-cs7/app/app.jsx %} +{% endhighlight %} +{% highlight ts tabtitle="app.tsx" %} +{% include code-snippet/spreadsheet/react/open-save-cs7/app/app.tsx %} +{% endhighlight %} +{% highlight js tabtitle="datasource.jsx" %} +{% include code-snippet/spreadsheet/react/open-save-cs7/app/datasource.jsx %} +{% endhighlight %} +{% highlight ts tabtitle="datasource.tsx" %} +{% include code-snippet/spreadsheet/react/open-save-cs7/app/datasource.tsx %} +{% endhighlight %} +{% endtabs %} + +{% previewsample "/document-processing/code-snippet/spreadsheet/react/open-save-cs7" %} + +### Customize PDF export orientation + +By default, the PDF document is created in **Portrait** orientation. You can change the orientation of the PDF document by using the `args.pdfLayoutSettings.orientation` argument settings in the [`beforeSave`](https://ej2.syncfusion.com/react/documentation/api/spreadsheet/index-default#beforesave) event. + +The possible values are: + +* **Portrait** - Used to display content in a vertical layout. +* **Landscape** - Used to display content in a horizontal layout. + +{% tabs %} +{% highlight js tabtitle="app.jsx" %} +{% include code-snippet/spreadsheet/react/open-save-cs8/app/app.jsx %} +{% endhighlight %} +{% highlight ts tabtitle="app.tsx" %} +{% include code-snippet/spreadsheet/react/open-save-cs8/app/app.tsx %} +{% endhighlight %} +{% highlight js tabtitle="datasource.jsx" %} +{% include code-snippet/spreadsheet/react/open-save-cs8/app/datasource.jsx %} +{% endhighlight %} +{% highlight ts tabtitle="datasource.tsx" %} +{% include code-snippet/spreadsheet/react/open-save-cs8/app/datasource.tsx %} +{% endhighlight %} +{% endtabs %} + +{% previewsample "/document-processing/code-snippet/spreadsheet/react/open-save-cs8" %} + + +## Server configuration + +In the Spreadsheet component, Excel export processing is handled on the `server‑side`. Therefore, to enable exporting in your application, you need to configure a server using any of the following web service technologies: + +* WebAPI +* WCF Service +* ASP.NET MVC Controller Action + +The following code snippet shows how to configure the server using a `WebAPI` service: + +```csharp +[Route("api/[controller]")] +public class SpreadsheetController : Controller +{ + // To save as Excel file + [AcceptVerbs("Post")] + [HttpPost] + [EnableCors("AllowAllOrigins")] + [Route("Save")] + public IActionResult Save([FromForm] SaveSettings saveSettings) + { + return Workbook.Save(saveSettings); + } +} +``` + +## Server dependencies + +Save helper functions are included in the `Syncfusion.EJ2.Spreadsheet` package, which is available in Essential Studio® and on [`nuget.org`](https://www.nuget.org). +The following dependencies are required for Spreadsheet save operations: + +* Syncfusion.EJ2 +* Syncfusion.EJ2.Spreadsheet +* Syncfusion.Compression.Base +* Syncfusion.XlsIO.Base diff --git a/Document-Processing/Excel/Spreadsheet/React/server-deployment.md b/Document-Processing/Excel/Spreadsheet/React/server-deployment.md new file mode 100644 index 0000000000..b74d41c69e --- /dev/null +++ b/Document-Processing/Excel/Spreadsheet/React/server-deployment.md @@ -0,0 +1,17 @@ +--- +layout: post +title: Server Deployment Guide for Syncfusion Spreadsheet | Syncfusion +description: Learn here how to deploy the Syncfusion Spreadsheet Server in selected deployment environment of Syncfusion Essential JS 2 and more. +control: Server Deployment +platform: document-processing +documentation: ug +--- + +# Deploying Spreadsheet Server in Selected Deployment Environment + +The Syncfusion React Spreadsheet relies on a server-side application to process Excel files. The server converts Excel files to the Spreadsheet JSON model for rendering in the client and converts the JSON model back to Excel files when saving. This section explains how to deploy the spreadsheet server to user preferred environment and expose stable service URLs for the Spreadsheet to use. + +## See Also + +* [Open](../react/open/open) +* [Save](../react/save/save) \ No newline at end of file