forked from sheetjs/docs.sheetjs.com
		
	jint
This commit is contained in:
		
							parent
							
								
									90300cd6b7
								
							
						
					
					
						commit
						4438bd86cd
					
				@ -64,7 +64,8 @@ but the registry is out of date.  The latest version on that registry is 0.18.5
 | 
			
		||||
 | 
			
		||||
This is a known registry bug
 | 
			
		||||
 | 
			
		||||
<https://cdn.sheetjs.com/> is the authoritative source for SheetJS scripts.
 | 
			
		||||
**The SheetJS CDN** <https://cdn.sheetjs.com/> **is the authoritative source**
 | 
			
		||||
**for SheetJS modules.**
 | 
			
		||||
 | 
			
		||||
For existing projects, the easiest approach is to uninstall and reinstall:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -56,7 +56,8 @@ but the registry is out of date.  The latest version on that registry is 0.18.5
 | 
			
		||||
 | 
			
		||||
This is a known registry bug
 | 
			
		||||
 | 
			
		||||
<https://cdn.sheetjs.com/> is the authoritative source for SheetJS scripts.
 | 
			
		||||
**The SheetJS CDN** <https://cdn.sheetjs.com/> **is the authoritative source**
 | 
			
		||||
**for SheetJS modules.**
 | 
			
		||||
 | 
			
		||||
For existing projects, the easiest approach is to uninstall and reinstall:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -72,7 +72,8 @@ and the types URLs should be updated at the same time:
 | 
			
		||||
 | 
			
		||||
The official Deno registry is out of date.  This is a registry bug.
 | 
			
		||||
 | 
			
		||||
<https://cdn.sheetjs.com/> is the authoritative source for SheetJS scripts.
 | 
			
		||||
**The SheetJS CDN** <https://cdn.sheetjs.com/> **is the authoritative source**
 | 
			
		||||
**for SheetJS modules.**
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -3,24 +3,17 @@ pagination_prev: getting-started/index
 | 
			
		||||
pagination_next: getting-started/examples/index
 | 
			
		||||
sidebar_position: 7
 | 
			
		||||
sidebar_custom_props:
 | 
			
		||||
  summary: Download and Import ECMAScript Modules
 | 
			
		||||
  summary: Load NodeJS-style modules using CommonJS or ESM
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
import current from '/version.js';
 | 
			
		||||
import CodeBlock from '@theme/CodeBlock';
 | 
			
		||||
 | 
			
		||||
# Bun
 | 
			
		||||
 | 
			
		||||
Module scripts are available at <https://cdn.sheetjs.com/>.
 | 
			
		||||
Tarballs are available on <https://cdn.sheetjs.com>.
 | 
			
		||||
 | 
			
		||||
<p><a href={`https://cdn.sheetjs.com/xlsx-${current}/package/xlsx.mjs`}>https://cdn.sheetjs.com/xlsx-{current}/package/xlsx.mjs</a> is the URL for {current}</p>
 | 
			
		||||
 | 
			
		||||
After downloading the script, it can be directly imported:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
import * as XLSX from './xlsx.mjs';
 | 
			
		||||
import * as fs from 'fs';
 | 
			
		||||
XLSX.set_fs(fs);
 | 
			
		||||
```
 | 
			
		||||
<p><a href={`https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz`}>https://cdn.sheetjs.com/xlsx-{current}/xlsx-{current}.tgz</a> is the URL for version {current}</p>
 | 
			
		||||
 | 
			
		||||
:::caution Bun support is considered experimental.
 | 
			
		||||
 | 
			
		||||
@ -29,6 +22,14 @@ be reported to the Bun project for further diagnosis.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
## Installation
 | 
			
		||||
 | 
			
		||||
Tarballs can be directly installed with `bun install`[^1]:
 | 
			
		||||
 | 
			
		||||
<CodeBlock language="bash">{`\
 | 
			
		||||
bun install https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz`}
 | 
			
		||||
</CodeBlock>
 | 
			
		||||
 | 
			
		||||
:::tip pass
 | 
			
		||||
 | 
			
		||||
[Watch the repo](https://git.sheetjs.com/SheetJS/sheetjs) or subscribe to the
 | 
			
		||||
@ -37,15 +38,52 @@ new versions are released!
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
## Encoding support
 | 
			
		||||
:::warning pass
 | 
			
		||||
 | 
			
		||||
If Encoding support is required, `cpexcel.full.mjs` must be manually imported.
 | 
			
		||||
At the time of writing `bun install` does not support vendored tarballs[^2].
 | 
			
		||||
 | 
			
		||||
<p><a href={`https://cdn.sheetjs.com/xlsx-${current}/package/dist/cpexcel.full.mjs`}>https://cdn.sheetjs.com/xlsx-{current}/package/dist/cpexcel.full.mjs</a> is the URL for {current}</p>
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
## Usage
 | 
			
		||||
 | 
			
		||||
```ts
 | 
			
		||||
/* load the codepage support library for extended support with older formats  */
 | 
			
		||||
import * as cptable from './cpexcel.full.mjs';
 | 
			
		||||
XLSX.set_cptable(cptable);
 | 
			
		||||
Bun supports both "CommonJS" and "ESM" modules.
 | 
			
		||||
 | 
			
		||||
:::info pass
 | 
			
		||||
 | 
			
		||||
It is strongly recommended to use CommonJS in Bun.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
#### CommonJS `require`
 | 
			
		||||
 | 
			
		||||
By default, the module supports `require` and it will automatically add support
 | 
			
		||||
for streams and file system access:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
const { readFile } = require("xlsx");
 | 
			
		||||
const wb = readFile("pres.numbers"); // works!
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### ESM `import`
 | 
			
		||||
 | 
			
		||||
When importing the library using ESM `import` statements, the native NodeJS
 | 
			
		||||
modules are not loaded. They must be added manually:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
import * as XLSX from 'xlsx';
 | 
			
		||||
 | 
			
		||||
/* load 'fs' for readFile and writeFile support */
 | 
			
		||||
import * as fs from 'fs';
 | 
			
		||||
XLSX.set_fs(fs);
 | 
			
		||||
 | 
			
		||||
/* load 'stream' for stream support */
 | 
			
		||||
import { Readable } from 'stream';
 | 
			
		||||
XLSX.stream.set_readable(Readable);
 | 
			
		||||
 | 
			
		||||
/* load the codepage support library for extended support with older formats  */
 | 
			
		||||
import * as cpexcel from 'xlsx/dist/cpexcel.full.mjs';
 | 
			
		||||
XLSX.set_cptable(cpexcel);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
[^1]: Bun releases before the official 1.0.0 release did not support tarball dependencies. If a pre-1.0.0 release must be used, the module can be installed with a package manager like Yarn or the ESM script can be vendored.
 | 
			
		||||
[^2]: See [the relevant issue in the Bun issue tracker](https://github.com/oven-sh/bun/issues/101)
 | 
			
		||||
@ -394,7 +394,7 @@ Open the generated file and verify the contents match the grid.
 | 
			
		||||
should update with the data in the file.
 | 
			
		||||
 | 
			
		||||
[^1]: See ["Array of Objects" in the ReactJS demo](/docs/demos/frontend/react#array-of-objects)
 | 
			
		||||
[^2]: The "Story" section of the ["Getting Started" page in the Glide Data Grid Storybook](https://quicktype.github.io/glide-data-grid/?path=/story/glide-data-grid-docs--getting-started) stores an Array of Objects outside of the component.
 | 
			
		||||
[^2]: The "Story" section of the ["Getting Started" page in the Glide Data Grid Storybook](https://glideapps.github.io/glide-data-grid/?path=/story/glide-data-grid-docs--getting-started) stores an Array of Objects outside of the component.
 | 
			
		||||
[^3]: See [the "Data" section in `DataEditorProps`](https://grid.glideapps.com/docs/interfaces/DataEditorProps.html#columns:~:text=default-,Data,-Readonly) in the Glide Data Grid API documentation.
 | 
			
		||||
[^4]: See [`read` in "Reading Files"](/docs/api/parse-options)
 | 
			
		||||
[^5]: See ["SheetJS Data Model"](/docs/csf)
 | 
			
		||||
 | 
			
		||||
@ -29,7 +29,7 @@ remote file, parses the contents, and writes data to the sheet:
 | 
			
		||||
 | 
			
		||||
:::note
 | 
			
		||||
 | 
			
		||||
This demo was last tested on 2023 April 17.
 | 
			
		||||
This demo was last tested on 2023 September 16.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
@ -152,12 +152,28 @@ npx @google/clasp push
 | 
			
		||||
 | 
			
		||||
:::caution
 | 
			
		||||
 | 
			
		||||
If the push command fails with an error message like
 | 
			
		||||
If the Google Apps Script API is not enabled, the command will display an object
 | 
			
		||||
with `code: 403` and an error message about the Apps Script API:
 | 
			
		||||
 | 
			
		||||
> User has not enabled the Apps Script API
 | 
			
		||||
```js
 | 
			
		||||
{ // ...
 | 
			
		||||
  code: 403,
 | 
			
		||||
  errors: [
 | 
			
		||||
    {
 | 
			
		||||
      message: 'User has not enabled the Apps Script API. Enable it by ...',
 | 
			
		||||
      domain: 'global',
 | 
			
		||||
      reason: 'forbidden'
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The message includes a URL (`https://script.google.com/home/usersettings` when
 | 
			
		||||
the demo was last tested). Visit that URL and enable the Google Apps Script API.
 | 
			
		||||
the demo was last tested). Visit that URL.
 | 
			
		||||
 | 
			
		||||
If the Google Apps Script API is "Off", click on "Google Apps Script API" and
 | 
			
		||||
click on the slider to enable the API.
 | 
			
		||||
 | 
			
		||||
After enabling the API, run `npx @google/clasp push` again.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
@ -190,7 +206,7 @@ function SHEETJS(url) {
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Click the "Save Project" icon to save the project.
 | 
			
		||||
Click the "Save Project" icon (💾) to save the project.
 | 
			
		||||
 | 
			
		||||
11) In the Google Sheets window, select cell A1 and enter the formula
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										414
									
								
								docz/docs/03-demos/42-engines/05-jint.md
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										414
									
								
								docz/docs/03-demos/42-engines/05-jint.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,414 @@
 | 
			
		||||
---
 | 
			
		||||
title: Sheets in .NET with Jint
 | 
			
		||||
sidebar_label: C# + Jint
 | 
			
		||||
description: Process structured data in C#. Seamlessly integrate spreadsheets into your program by pairing Jint and SheetJS. Handle the most complex Excel files without breaking a sweat.
 | 
			
		||||
pagination_prev: demos/bigdata/index
 | 
			
		||||
pagination_next: solutions/input
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
import current from '/version.js';
 | 
			
		||||
import Tabs from '@theme/Tabs';
 | 
			
		||||
import TabItem from '@theme/TabItem';
 | 
			
		||||
import CodeBlock from '@theme/CodeBlock';
 | 
			
		||||
 | 
			
		||||
Jint[^1] is a JavaScript interpreter for .NET Standard and .NET Core. It has
 | 
			
		||||
built-in support for binary data with .NET `byte[]` and ES6 `Uint8Array`.
 | 
			
		||||
 | 
			
		||||
[SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing
 | 
			
		||||
data from spreadsheets.
 | 
			
		||||
 | 
			
		||||
This demo uses Jint and SheetJS to read and write spreadsheets. We'll explore
 | 
			
		||||
how to load SheetJS in the Jint engine, exchange binary data with a C# program,
 | 
			
		||||
and process spreadsheets and structured data.
 | 
			
		||||
 | 
			
		||||
The ["Integration Example"](#integration-example) section includes a complete
 | 
			
		||||
command-line tool for reading arbitrary workbooks and writing data to XLSB
 | 
			
		||||
(Excel 2007+ Binary Format) workbooks.
 | 
			
		||||
 | 
			
		||||
## Integration Details
 | 
			
		||||
 | 
			
		||||
:::note pass
 | 
			
		||||
 | 
			
		||||
Most of the integration functions are not documented. This explanation is based
 | 
			
		||||
on version `3.0.0-beta-2051`.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
The [SheetJS Standalone scripts](/docs/getting-started/installation/standalone)
 | 
			
		||||
can be parsed and evaluated in a Jint engine instance.
 | 
			
		||||
 | 
			
		||||
### Initialize Jint
 | 
			
		||||
 | 
			
		||||
A `Jint.Engine` object can be created in one line:
 | 
			
		||||
 | 
			
		||||
```csharp
 | 
			
		||||
var engine = new Jint.Engine();
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Jint does not expose the NodeJS `global` but does provide `globalThis`. Using
 | 
			
		||||
`Jint.Engine#Evaluate`, a `global` global variable can be created:
 | 
			
		||||
 | 
			
		||||
>The JS code is
 | 
			
		||||
```js
 | 
			
		||||
global = globalThis;
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```csharp
 | 
			
		||||
engine.Evaluate("global = globalThis");
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Load SheetJS Scripts
 | 
			
		||||
 | 
			
		||||
The main library can be loaded by reading the scripts from the file system with
 | 
			
		||||
`System.IO.File.ReadAllText` and evaluating in the Jint engine instance:
 | 
			
		||||
 | 
			
		||||
```csharp
 | 
			
		||||
/* read and evaluate the shim script */
 | 
			
		||||
string src = System.IO.File.ReadAllText("shim.min.js");
 | 
			
		||||
engine.Evaluate(src);
 | 
			
		||||
/* read and evaluate the main library */
 | 
			
		||||
engine.Evaluate(System.IO.File.ReadAllText("xlsx.full.min.js"));
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
To confirm the library is loaded, `XLSX.version` can be inspected:
 | 
			
		||||
 | 
			
		||||
```csharp
 | 
			
		||||
Console.WriteLine("SheetJS version {0}", engine.Evaluate("XLSX.version"));
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
:::info pass
 | 
			
		||||
 | 
			
		||||
The Jint `Evaluate` method returns a generic `Jint.Native.JsValue` object.
 | 
			
		||||
 | 
			
		||||
When the JS expression returns a string, the `JsValue` object is an instance of
 | 
			
		||||
`Jint.Native.JsString`. C# `ToString` will return the underlying `string` value.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
### Reading Files
 | 
			
		||||
 | 
			
		||||
In C#, `System.IO.File.ReadAllBytes` reads file data into a `byte[]` byte array:
 | 
			
		||||
 | 
			
		||||
```csharp
 | 
			
		||||
string filename = "pres.xlsx";
 | 
			
		||||
byte[] buf = File.ReadAllBytes(filename);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Jint natively supports `Uint8Array` construction from the byte array:
 | 
			
		||||
 | 
			
		||||
```csharp
 | 
			
		||||
Jint.Native.JsValue u8 = engine.Realm.Intrinsics.Uint8Array.Construct(buf);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
`Jint.Engine#SetValue` will assign the `Uint8Array` to a scope variable in JS:
 | 
			
		||||
 | 
			
		||||
```csharp
 | 
			
		||||
engine.SetValue("buf", u8);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The `buf` variable can be parsed from JS with the SheetJS `read` method[^2]:
 | 
			
		||||
 | 
			
		||||
>The JS code is
 | 
			
		||||
```js
 | 
			
		||||
var wb = XLSX.read(buf);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```csharp
 | 
			
		||||
engine.Evaluate("var wb = XLSX.read(buf);");
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
`wb` is a SheetJS workbook object. The ["SheetJS Data Model"](/docs/csf) section
 | 
			
		||||
describes the object structure and the ["API Reference"](/docs/api) section
 | 
			
		||||
describes various helper functions.
 | 
			
		||||
 | 
			
		||||
### Writing Files
 | 
			
		||||
 | 
			
		||||
The SheetJS `write` method[^3] can write workbooks. The option `type: "buffer"`
 | 
			
		||||
instructs the library to generate `Uint8Array` objects.
 | 
			
		||||
 | 
			
		||||
> The JS code for exporting to the XLSB format is:
 | 
			
		||||
```js
 | 
			
		||||
var u8 = XLSX.write(wb, {bookType: 'xlsb', type: 'buffer'});
 | 
			
		||||
```
 | 
			
		||||
The file format can be changed with the `bookType` option[^4]
 | 
			
		||||
 | 
			
		||||
```csharp
 | 
			
		||||
Jint.Native.JsValue xlsb = engine.Evaluate("XLSX.write(wb, {bookType: 'xlsb', type: 'buffer'})");
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
`xlsb` represents a `Uint8Array`. `xlsb.AsUint8Array()` returns the bytes as a
 | 
			
		||||
`byte[]` array which can be exported with `System.IO.File.WriteAllBytes`:
 | 
			
		||||
 | 
			
		||||
```csharp
 | 
			
		||||
byte[] outfile = xlsb.AsUint8Array();
 | 
			
		||||
System.IO.File.WriteAllBytes("SheetJSJint.xlsb", outfile);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Integration Example
 | 
			
		||||
 | 
			
		||||
:::note
 | 
			
		||||
 | 
			
		||||
This demo was tested in the following deployments:
 | 
			
		||||
 | 
			
		||||
| Architecture | Jint Version      | Date       |
 | 
			
		||||
|:-------------|:------------------|:-----------|
 | 
			
		||||
| `darwin-x64` | `3.0.0-beta-2051` | 2023-09-16 |
 | 
			
		||||
| `win10-x64`  | `3.0.0-beta-2051` | 2023-09-16 |
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
0) Install .NET[^5]
 | 
			
		||||
 | 
			
		||||
### Platform Configuration
 | 
			
		||||
 | 
			
		||||
1) Set the `DOTNET_CLI_TELEMETRY_OPTOUT` environment variable to `1`.
 | 
			
		||||
 | 
			
		||||
<details open><summary><b>How to disable telemetry</b> (click to hide)</summary>
 | 
			
		||||
 | 
			
		||||
<Tabs groupId="os">
 | 
			
		||||
  <TabItem value="unix" label="Linux/MacOS">
 | 
			
		||||
 | 
			
		||||
Add the following line to `.profile`, `.bashrc` and `.zshrc`:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
export DOTNET_CLI_TELEMETRY_OPTOUT=1
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Close and restart the Terminal to load the changes.
 | 
			
		||||
 | 
			
		||||
  </TabItem>
 | 
			
		||||
  <TabItem value="win" label="Windows">
 | 
			
		||||
 | 
			
		||||
Type `env` in the search bar and select "Edit the system environment variables".
 | 
			
		||||
 | 
			
		||||
In the new window, click the "Environment Variables..." button.
 | 
			
		||||
 | 
			
		||||
In the new window, look for the "System variables" section and click "New..."
 | 
			
		||||
 | 
			
		||||
Set the "Variable name" to `DOTNET_CLI_TELEMETRY_OPTOUT` and the value to `1`.
 | 
			
		||||
 | 
			
		||||
Click "OK" in each window (3 windows) and restart your computer.
 | 
			
		||||
 | 
			
		||||
  </TabItem>
 | 
			
		||||
</Tabs>
 | 
			
		||||
 | 
			
		||||
</details>
 | 
			
		||||
 | 
			
		||||
2) Open a new Terminal window in macOS or PowerShell window in Windows.
 | 
			
		||||
 | 
			
		||||
### Base Project
 | 
			
		||||
 | 
			
		||||
3) Create a new folder `SheetJSJint` and a new project using the `dotnet` tool:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
rm -rf SheetJSJint
 | 
			
		||||
mkdir SheetJSJint
 | 
			
		||||
cd SheetJSJint
 | 
			
		||||
dotnet new console --framework net6.0
 | 
			
		||||
dotnet run
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
4) Add Jint using the NuGet tool:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
dotnet nuget add source https://www.myget.org/F/jint/api/v3/index.json
 | 
			
		||||
dotnet add package Jint --version 3.0.0-beta-2051
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
To verify Jint is installed, replace `Program.cs` with the following:
 | 
			
		||||
 | 
			
		||||
```csharp title="Program.cs"
 | 
			
		||||
var engine = new Jint.Engine();
 | 
			
		||||
Console.WriteLine("Hello {0}", engine.Evaluate("'Sheet' + 'JS'"));
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
After saving, run the program:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
dotnet run
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The terminal should display `Hello SheetJS`
 | 
			
		||||
 | 
			
		||||
### Add SheetJS
 | 
			
		||||
 | 
			
		||||
5) Download the standalone script, shim and test file:
 | 
			
		||||
 | 
			
		||||
<ul>
 | 
			
		||||
<li><a href={`https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js`}>xlsx.full.min.js</a></li>
 | 
			
		||||
<li><a href={`https://cdn.sheetjs.com/xlsx-${current}/package/dist/shim.min.js`}>shim.min.js</a></li>
 | 
			
		||||
<li><a href="https://sheetjs.com/pres.xlsx">pres.xlsx</a></li>
 | 
			
		||||
</ul>
 | 
			
		||||
 | 
			
		||||
<CodeBlock language="bash">{`\
 | 
			
		||||
curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/shim.min.js
 | 
			
		||||
curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js
 | 
			
		||||
curl -LO https://sheetjs.com/pres.xlsx`}
 | 
			
		||||
</CodeBlock>
 | 
			
		||||
 | 
			
		||||
6) Replace `Program.cs` with the following:
 | 
			
		||||
 | 
			
		||||
```csharp title="Program.cs"
 | 
			
		||||
var engine = new Jint.Engine();
 | 
			
		||||
engine.Evaluate("global = globalThis;");
 | 
			
		||||
engine.Evaluate(File.ReadAllText("shim.min.js"));
 | 
			
		||||
engine.Evaluate(File.ReadAllText("xlsx.full.min.js"));
 | 
			
		||||
Console.WriteLine("SheetJS version {0}", engine.Evaluate("XLSX.version"));
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
After saving, run the program:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
dotnet run
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
<p>The terminal should display <code>SheetJS version {current}</code></p>
 | 
			
		||||
 | 
			
		||||
### Read and Write Files
 | 
			
		||||
 | 
			
		||||
7) Replace `Program.cs` with the following:
 | 
			
		||||
 | 
			
		||||
```csharp title="Program.cs"
 | 
			
		||||
using Jint;
 | 
			
		||||
 | 
			
		||||
/* Initialize Jint */
 | 
			
		||||
var engine = new Jint.Engine();
 | 
			
		||||
engine.Evaluate("global = globalThis;");
 | 
			
		||||
 | 
			
		||||
/* Load SheetJS Scripts */
 | 
			
		||||
engine.Evaluate(File.ReadAllText("shim.min.js"));
 | 
			
		||||
engine.Evaluate(File.ReadAllText("xlsx.full.min.js"));
 | 
			
		||||
Console.WriteLine("SheetJS version {0}", engine.Evaluate("XLSX.version"));
 | 
			
		||||
 | 
			
		||||
/* Read and Parse File */
 | 
			
		||||
byte[] filedata = File.ReadAllBytes(args[0]);
 | 
			
		||||
Jint.Native.JsValue u8 = engine.Realm.Intrinsics.Uint8Array.Construct(filedata);
 | 
			
		||||
engine.SetValue("buf", u8);
 | 
			
		||||
engine.Evaluate("var wb = XLSX.read(buf);");
 | 
			
		||||
 | 
			
		||||
/* Print CSV of first worksheet*/
 | 
			
		||||
engine.Evaluate("var ws = wb.Sheets[wb.SheetNames[0]];");
 | 
			
		||||
Jint.Native.JsValue csv = engine.Evaluate("XLSX.utils.sheet_to_csv(ws)");
 | 
			
		||||
Console.Write(csv);
 | 
			
		||||
 | 
			
		||||
/* Generate XLSB file and save to SheetJSJint.xlsb */
 | 
			
		||||
Jint.Native.JsValue xlsb = engine.Evaluate("XLSX.write(wb, {bookType: 'xlsb', type: 'buffer'})");
 | 
			
		||||
File.WriteAllBytes("SheetJSJint.xlsb", xlsb.AsUint8Array());
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
After saving, run the program and pass the test file name as an argument:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
dotnet run pres.xlsx
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
If successful, the program will print the contents of the first sheet as CSV
 | 
			
		||||
rows. It will also create `SheetJSJint.xlsb` which can be opened in Excel or
 | 
			
		||||
another spreadsheet editor.
 | 
			
		||||
 | 
			
		||||
:::caution pass
 | 
			
		||||
 | 
			
		||||
If the `using Jint;` directive is omitted, the build will fail:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
'JsValue' does not contain a definition for 'AsUint8Array' and no accessible extension method 'AsUint8Array' accepting a first argument of type 'JsValue' could be found
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
### Standalone Application
 | 
			
		||||
 | 
			
		||||
8) Find the runtime identifier (RID) for your platform[^6]. The RID values for
 | 
			
		||||
tested platforms are listed below:
 | 
			
		||||
 | 
			
		||||
| Platform         | RID         |
 | 
			
		||||
|:-----------------|:------------|
 | 
			
		||||
| Intel Mac        | `osx-x64`   |
 | 
			
		||||
| Windows 10 (x64) | `win10-x64` |
 | 
			
		||||
 | 
			
		||||
9) Build the standalone application. Replace `$RID` with the real value in:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
dotnet publish -c Release -r $RID --self-contained true -p:PublishSingleFile=true -p:PublishTrimmed=true
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
<details open><summary><b>Tested platforms</b> (click to hide)</summary>
 | 
			
		||||
 | 
			
		||||
<Tabs groupId="triple">
 | 
			
		||||
  <TabItem value="darwin-x64" label="Intel Mac">
 | 
			
		||||
 | 
			
		||||
For Intel Mac, the RID is `osx-x64` and the command is
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
dotnet publish -c Release -r osx-x64 --self-contained true -p:PublishSingleFile=true -p:PublishTrimmed=true
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
  </TabItem>
 | 
			
		||||
  <TabItem value="win10-x64" label="Windows x64">
 | 
			
		||||
 | 
			
		||||
For Windows 10 x64, the RID is `win10-x64` and the command is:
 | 
			
		||||
 | 
			
		||||
```powershell
 | 
			
		||||
dotnet publish -c Release -r win10-x64 --self-contained true -p:PublishSingleFile=true -p:PublishTrimmed=true
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
  </TabItem>
 | 
			
		||||
</Tabs>
 | 
			
		||||
 | 
			
		||||
</details>
 | 
			
		||||
 | 
			
		||||
10) Copy the generated executable to the project directory.
 | 
			
		||||
 | 
			
		||||
The build from step 9 is placed in `bin\Release\net6.0\$RID\publish` and the
 | 
			
		||||
binary name will be `SheetJSJint` or `SheetJSJint.exe` depending on OS.
 | 
			
		||||
 | 
			
		||||
<details open><summary><b>Tested platforms</b> (click to hide)</summary>
 | 
			
		||||
 | 
			
		||||
<Tabs groupId="triple">
 | 
			
		||||
  <TabItem value="darwin-x64" label="Intel Mac">
 | 
			
		||||
 | 
			
		||||
For Intel Mac, the RID is `osx-x64` and the command is:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
cp bin/Release/net6.0/osx-x64/publish/SheetJSJint .
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
  </TabItem>
 | 
			
		||||
  <TabItem value="win10-x64" label="Windows x64">
 | 
			
		||||
 | 
			
		||||
For Windows 10 x64, the RID is `win10-x64` and the command is:
 | 
			
		||||
 | 
			
		||||
```powershell
 | 
			
		||||
copy .\bin\Release\net6.0\win10-x64\publish\SheetJSJint.exe .
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
  </TabItem>
 | 
			
		||||
</Tabs>
 | 
			
		||||
 | 
			
		||||
</details>
 | 
			
		||||
 | 
			
		||||
11) Run the generated command.
 | 
			
		||||
 | 
			
		||||
<Tabs groupId="os">
 | 
			
		||||
  <TabItem value="unix" label="Linux/MacOS">
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
./SheetJSJint pres.xlsx
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
  </TabItem>
 | 
			
		||||
  <TabItem value="win" label="Windows">
 | 
			
		||||
 | 
			
		||||
```powershell
 | 
			
		||||
.\SheetJSJint pres.xlsx
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
  </TabItem>
 | 
			
		||||
</Tabs>
 | 
			
		||||
 | 
			
		||||
[^1]: The Jint project recommends the ["MyGet" service](https://www.myget.org/feed/jint/package/nuget/Jint). According to the developers, the ["NuGet" package](https://www.nuget.org/packages/jint) is "occasionally published".
 | 
			
		||||
[^2]: See [`read` in "Reading Files"](/docs/api/parse-options)
 | 
			
		||||
[^3]: See [`write` in "Writing Files"](/docs/api/write-options)
 | 
			
		||||
[^4]: See ["Supported Output Formats" in "Writing Files"](/docs/api/write-options#supported-output-formats) for details on `bookType`
 | 
			
		||||
[^5]: At the time of writing, <https://dotnet.microsoft.com/en-us/download> is the official endpoint.
 | 
			
		||||
[^6]: See [".NET RID Catalog"](https://learn.microsoft.com/en-us/dotnet/core/rid-catalog) in the .NET documentation
 | 
			
		||||
@ -204,6 +204,12 @@ build/bin/jerry xlsx.jerry.js; echo $?
 | 
			
		||||
 | 
			
		||||
</details>
 | 
			
		||||
 | 
			
		||||
### Jint
 | 
			
		||||
 | 
			
		||||
Jint is an embeddable JS engine for .NET written in C#.
 | 
			
		||||
 | 
			
		||||
This demo has been moved [to a dedicated page](/docs/demos/engines/jint).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### Nashorn
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user