forked from sheetjs/docs.sheetjs.com
		
	V8 C# demo
This commit is contained in:
		
							parent
							
								
									ffbe7af307
								
							
						
					
					
						commit
						06f9a2d0e7
					
				| @ -327,6 +327,16 @@ | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|    </Row> | ||||
|    <Row> | ||||
|     <Cell ss:StyleID="s20" ss:HRef="/docs/demos/engines/v8#c"><Data ss:Type="String">V8</Data></Cell> | ||||
|     <Cell><Data ss:Type="String">C#</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|    </Row> | ||||
|    <Row> | ||||
|     <Cell ss:StyleID="s20" ss:HRef="/docs/demos/engines/jsc#swift"><Data ss:Type="String">JSC</Data></Cell> | ||||
|     <Cell><Data ss:Type="String">Swift</Data></Cell> | ||||
|  | ||||
| @ -1123,6 +1123,165 @@ java -cp ".;javet-3.1.3.jar" SheetJSJavet pres.xlsx | ||||
| 
 | ||||
| If the program succeeded, the CSV contents will be printed to console. | ||||
| 
 | ||||
| ### C# | ||||
| 
 | ||||
| ClearScript provides a .NET interface to the V8 engine. | ||||
| 
 | ||||
| C# byte arrays (`byte[]`) must be explicitly converted to arrays of bytes: | ||||
| 
 | ||||
| ```csharp | ||||
| /* read data into a byte array */ | ||||
| byte[] filedata = File.ReadAllBytes("pres.numbers"); | ||||
| 
 | ||||
| // highlight-start | ||||
| /* generate a JS Array (variable name `buf`) from the data */ | ||||
| engine.Script.buf = engine.Script.Array.from(filedata); | ||||
| // highlight-end | ||||
| 
 | ||||
| /* parse data */ | ||||
| engine.Evaluate("var wb = XLSX.read(buf, {type: 'array'});"); | ||||
| ``` | ||||
| 
 | ||||
| :::note Tested Deployments | ||||
| 
 | ||||
| This demo was last tested in the following deployments: | ||||
| 
 | ||||
| | Architecture | V8 Version    | Date       | | ||||
| |:-------------|:--------------|:-----------| | ||||
| | `darwin-x64` | `12.3.219.12` | 2024-07-16 | | ||||
| | `darwin-arm` | `12.3.219.12` | 2024-07-16 | | ||||
| | `win10-x64`  | `12.3.219.12` | 2024-07-16 | | ||||
| | `win11-arm`  | `12.3.219.12` | 2024-07-16 | | ||||
| | `linux-x64`  | `12.3.219.12` | 2024-07-16 | | ||||
| | `linux-arm`  | `12.3.219.12` | 2024-07-16 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| 0) 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 title="(add to .profile , .bashrc , and .zshrc)" | ||||
| 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> | ||||
| 
 | ||||
| 1) Install .NET | ||||
| 
 | ||||
| <details> | ||||
|   <summary><b>Installation Notes</b> (click to show)</summary> | ||||
| 
 | ||||
| For macOS x64 and ARM64, install the `dotnet-sdk` Cask with Homebrew: | ||||
| 
 | ||||
| ```bash | ||||
| brew install --cask dotnet-sdk | ||||
| ``` | ||||
| 
 | ||||
| For Steam Deck Holo and other Arch Linux x64 distributions, the `dotnet-sdk` and | ||||
| `dotnet-runtime` packages should be installed using `pacman`: | ||||
| 
 | ||||
| ```bash | ||||
| sudo pacman -Syu dotnet-sdk dotnet-runtime | ||||
| ``` | ||||
| 
 | ||||
| https://dotnet.microsoft.com/en-us/download/dotnet/6.0 is the official source | ||||
| for Windows and ARM64 Linux versions. | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| 2) Open a new Terminal window in macOS or PowerShell window in Windows. | ||||
| 
 | ||||
| 3) Create a new project: | ||||
| 
 | ||||
| ```bash | ||||
| mkdir SheetJSClearScript | ||||
| cd SheetJSClearScript | ||||
| dotnet new console | ||||
| dotnet run | ||||
| ``` | ||||
| 
 | ||||
| 4) Add ClearScript to the project: | ||||
| 
 | ||||
| ```bash | ||||
| dotnet add package Microsoft.ClearScript.Complete --version 7.4.5 | ||||
| ``` | ||||
| 
 | ||||
| 5) Download the SheetJS standalone script and test file. Move all three files to | ||||
| the project directory: | ||||
| 
 | ||||
| <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://docs.sheetjs.com/pres.xlsx">pres.xlsx</a></li> | ||||
| </ul> | ||||
| 
 | ||||
| <CodeBlock language="bash">{`\ | ||||
| curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js | ||||
| curl -LO https://docs.sheetjs.com/pres.xlsx`} | ||||
| </CodeBlock> | ||||
| 
 | ||||
| 6) Replace `Program.cs` with the following: | ||||
| 
 | ||||
| ```csharp title="Program.cs" | ||||
| using Microsoft.ClearScript.JavaScript; | ||||
| using Microsoft.ClearScript.V8; | ||||
| 
 | ||||
| /* initialize ClearScript */ | ||||
| var engine = new V8ScriptEngine(); | ||||
| 
 | ||||
| /* Load SheetJS Scripts */ | ||||
| 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]); | ||||
| engine.Script.buf = engine.Script.Array.from(filedata); | ||||
| engine.Evaluate("var wb = XLSX.read(buf, {type: 'array'});"); | ||||
| 
 | ||||
| /* Print CSV of first worksheet */ | ||||
| engine.Evaluate("var ws = wb.Sheets[wb.SheetNames[0]];"); | ||||
| var csv = engine.Evaluate("XLSX.utils.sheet_to_csv(ws)"); | ||||
| Console.Write(csv); | ||||
| 
 | ||||
| /* Generate XLSB file and save to SheetJSJint.xlsb */ | ||||
| var xlsb = (ITypedArray<byte>)engine.Evaluate("XLSX.write(wb, {bookType: 'xlsb', type: 'buffer'})"); | ||||
| File.WriteAllBytes("SheetJSClearScript.xlsb", xlsb.ToArray()); | ||||
| ``` | ||||
| 
 | ||||
| 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 `SheetJSClearScript.xlsb`, a workbook that can be | ||||
| opened in a spreadsheet editor. | ||||
| 
 | ||||
| ## Snapshots | ||||
| 
 | ||||
| At a high level, V8 snapshots are raw dumps of the V8 engine state. It is much | ||||
|  | ||||
| @ -1,5 +1,8 @@ | ||||
| { | ||||
| 	"private": true, | ||||
| 	"scripts": { | ||||
| 		"dev": "cd docz && npm run start -- --host=0.0.0.0 --no-open" | ||||
| 	}, | ||||
| 	"alex": { | ||||
| 		"allow": [ | ||||
| 			"host-hostess", | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user