v8-windows

This commit is contained in:
SheetJS 2023-08-26 19:05:59 -04:00
parent 584af134db
commit a6aba251e5
10 changed files with 515 additions and 52 deletions

@ -30,7 +30,7 @@ sequenceDiagram
actor U as User
participant P as Page
participant A as Site
U->>P: click button
U->>P: load site
P->>A: fetch file
A->>P: raw file
Note over P: parse file

@ -1,5 +1,5 @@
---
title: Wails
title: Spreadsheet-Powered Wails Apps
sidebar_label: Wails
description: Build data-intensive desktop apps using Wails. Seamlessly integrate spreadsheets into your app using SheetJS. Modernize Excel-powered business processes with confidence.
pagination_prev: demos/mobile/index
@ -9,8 +9,6 @@ sidebar_custom_props:
summary: Webview + Go Backend
---
# Spreadsheet-Powered Wails Apps
import current from '/version.js';
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
@ -47,10 +45,11 @@ app to read and write workbooks. The app will look like the screenshots below:
</td></tr></tbody></table>
:::info
:::tip pass
This demo assumes some familiarity with JavaScript and with Go. If you would
prefer a pure JavaScript solution, the [Electron](/docs/demos/desktop/electron)
This demo assumes familiarity with the Go programming language.
For a pure JavaScript solution, the [Electron](/docs/demos/desktop/electron)
platform provides many native features out of the box.
:::
@ -60,11 +59,11 @@ platform provides many native features out of the box.
The [SheetJS NodeJS Module](/docs/getting-started/installation/nodejs) can be
installed in the `frontend` folder and imported in frontend scripts.
:::caution
:::caution pass
Wails currently does not provide the equivalent of NodeJS `fs` module.
Reading and writing raw file data must be implemented in native Go code.
**Reading and writing raw file data must be implemented in native Go code.**
:::
@ -144,6 +143,8 @@ func (a *App) ReadFile() string {
Wails will automatically create bindings for use in JS. The `App` binding module
will export the function `ReadFile`.
The following example uses the [SvelteJS](/docs/demos/frontend/svelte) framework:
```js title="frontend/src/App.svelte"
import { read, utils } from 'xlsx';
import { ReadFile } from '../wailsjs/go/main/App';
@ -163,7 +164,7 @@ async function importFile(evt) {
### Writing Files
:::info
:::info pass
The SheetJS `write` method[^7] can write spreadsheets in a number of formats[^8]
including XLSX, XLSB, XLS, and NUMBERS. It expects a `bookType` option. This
@ -262,7 +263,9 @@ func (a *App) WriteFile(b64 string, path string) {
#### JS
Wails will automatically create bindings for use in JS. The `App` binding module
will export the functions `SaveFile` and `WriteFile`:
will export the functions `SaveFile` and `WriteFile`.
The following example uses the [SvelteJS](/docs/demos/frontend/svelte) framework:
```js title="frontend/src/App.svelte"
import { utils, write } from 'xlsx';
@ -290,8 +293,14 @@ async function exportFile(table_element) {
:::note
This demo was tested against Wails `v2.4.1` on 2023 April 30 using
the Svelte TypeScript starter.
This demo was tested in the following environments:
| OS and Version | Arch | Wails | Date |
|:---------------|:-----|:---------|:-----------|
| macOS 12.6.3 | x64 | `v2.5.1` | 2023-08-24 |
| macOS 13.5.1 | ARM | `v2.5.1` | 2023-08-24 |
| Windows 10 | x64 | `v2.5.1` | 2023-08-25 |
| Linux (HoloOS) | x64 | `v2.5.1` | 2023-08-25 |
:::
@ -326,12 +335,22 @@ Your system is ready for Wails development!
If a required dependency is missing, it will be displayed.
:::note
:::note pass
None of the optional packages are required for building and running this demo.
:::
:::info pass
On the Steam Deck (HoloOS), some dependencies must be reinstalled:
```bash
sudo pacman -Syu base-devel gtk glib2 pango harfbuzz cairo gdk-pixbuf2 atk libsoup
```
:::
</details>
1) Create a new Wails app:
@ -374,6 +393,15 @@ wails build
At the end, it will print the path to the generated program. Run the program!
**Testing**
When run, the program will download [`pres.xlsx`](https://sheetjs.com/pres.xlsx)
and display the contents of the first worksheet in a table.
To test export features, click "Export XLSX". The app will ask for a file name
and location. After clicking Save, the app will export to XLSX. This file can be
opened in a spreadsheet editor such as Excel.
[^1]: See ["How does it Work?"](https://wails.io/docs/howdoesitwork) in the Wails documentation.
[^2]: See [`read` in "Reading Files"](/docs/api/parse-options)
[^3]: See [`sheet_to_html` in "Utilities"](/docs/api/utilities/html#html-table-output)

@ -1,5 +1,7 @@
---
title: C++ + V8
title: Blazing Fast Data Processing with V8
sidebar_label: C++ + V8
description: Process structured data in C++ or Rust programs. Seamlessly integrate spreadsheets by paring V8 and SheetJS. Modernize workflows while preserving Excel compatibility.
pagination_prev: demos/bigdata/index
pagination_next: solutions/input
---
@ -9,14 +11,25 @@ import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import CodeBlock from '@theme/CodeBlock';
V8 is an embeddable JS engine written in C++. It powers Chromium and Chrome,
NodeJS and Deno, Adobe UXP and other platforms.
[V8](https://v8.dev/) is an embeddable JavaScript engine written in C++. It
powers Chromium and Chrome, NodeJS and Deno, Adobe UXP and other platforms.
The [Standalone scripts](/docs/getting-started/installation/standalone) can be
parsed and evaluated in a V8 context.
[SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing
data from spreadsheets.
This demo uses V8 and SheetJS to read and write spreadsheets. We'll explore how
to load SheetJS in a V8 context and process spreadsheets and structured data from
C++ and Rust programs.
The ["Complete Example"](#complete-example) creates a C++ command-line tool for
reading spreadsheet files and generating new workbooks. ["Bindings"](#bindings)
covers V8 engine bindings for other programming languages.
## Integration Details
The [SheetJS Standalone scripts](/docs/getting-started/installation/standalone)
can be parsed and evaluated in a V8 context.
_Initialize V8_
The official V8 `hello-world` example covers initialization and cleanup. For the
@ -30,10 +43,10 @@ v8::Local<v8::Context> context = v8::Context::New(isolate);
The following helper function evaluates C strings as JS code:
```cpp
v8::Local<v8::Value> eval_code(v8::Isolate *i, v8::Local<v8::Context> c, char* code) {
v8::Local<v8::String> source = v8::String::NewFromUtf8(i, code).ToLocalChecked();
v8::Local<v8::Script> script = v8::Script::Compile(i, source).ToLocalChecked();
return script->Run(c).ToLocalChecked();
v8::Local<v8::Value> eval_code(v8::Isolate *isolate, v8::Local<v8::Context> context, char* code, size_t sz = -1) {
v8::Local<v8::String> source = v8::String::NewFromUtf8(isolate, code, v8::NewStringType::kNormal, sz).ToLocalChecked();
v8::Local<v8::Script> script = v8::Script::Compile(context, source).ToLocalChecked();
return script->Run(context).ToLocalChecked();
}
```
@ -56,7 +69,7 @@ static char *read_file(const char *filename, size_t *sz) {
// ...
size_t sz; char *file = read_file("xlsx.full.min.js", &sz);
v8::Local<v8::Value> result = eval_code(isolate, context, file);
v8::Local<v8::Value> result = eval_code(isolate, context, file, sz);
```
To confirm the library is loaded, `XLSX.version` can be inspected:
@ -109,25 +122,26 @@ The resulting `buf` can be written to file with `fwrite`.
This demo was tested in the following deployments:
| V8 Version | Platform | OS Version | Compiler | Date |
|:--------------|:-------------|:-------------|:---------------|:-----------|
| `11.3.244.11` | `darwin-x64` | macOS 13.2 | `clang 14.0.3` | 2023-05-20 |
| `11.3.244.11` | `darwin-arm` | macOS 13.0 | `clang 14.0.3` | 2023-06-05 |
| `11.3.244.11` | `linux-x64` | HoloOS 3.4.6 | `gcc 12.2.0` | 2023-05-20 |
| V8 Version | Platform | OS Version | Compiler | Date |
|:--------------|:-------------|:-------------|:-----------------|:-----------|
| `11.8.82` | `darwin-x64` | macOS 13.5.1 | `clang 14.0.3` | 2023-08-26 |
| `11.8.82` | `darwin-arm` | macOS 13.5.1 | `clang 14.0.3` | 2023-08-26 |
| `11.8.82` | `win10-x64` | Windows 10 | `CL 19.37.32822` | 2023-08-26 |
| `11.3.244.11` | `linux-x64` | HoloOS 3.4.6 | `gcc 12.2.0` | 2023-05-20 |
:::
This program parses a file and prints CSV data from the first worksheet. It also
generates an XLSB file and writes to the filesystem.
:::caution
:::caution pass
When the demo was last tested, there were errors in the official V8 embed guide.
The correct instructions are included below.
:::
:::caution
:::caution pass
The build process is long and will test your patience.
@ -135,6 +149,9 @@ The build process is long and will test your patience.
### Preparation
<Tabs groupId="os">
<TabItem value="unix" label="Linux/MacOS">
0) Prepare `/usr/local/lib`:
```bash
@ -142,7 +159,7 @@ mkdir -p /usr/local/lib
cd /usr/local/lib
```
:::caution
:::caution pass
If this step throws a permission error, run:
@ -153,15 +170,77 @@ sudo chmod 777 /usr/local/lib
:::
</TabItem>
<TabItem value="win" label="Windows">
0) Follow the official ["Visual Studio"](https://chromium.googlesource.com/chromium/src/+/master/docs/windows_build_instructions.md#visual-studio)
installation steps.
:::info pass
Using the installer tool, the "Desktop development with C++" workload must be
installed. In the sidebar, verify the following components are checked:
- "C++ ATL for latest ... build tools" (`v143` when last tested)
- "C++ MFC for latest ... build tools" (`v143` when last tested)
In the "Individual components" tab, search for "Windows 11 SDK" and verify that
"Windows 11 SDK (10.0.22621.0)" is checked.
Click "Modify" and allow the installer to finish.
The SDK debugging tools must be installed after the SDK is installed.
1) Using the Search bar, search "Apps & features".
2) When the setting panel opens, scroll down to "Windows Software Development
Kit - Windows 10.0.22621 and click "Modify".
3) In the new window, select "Change" and click "Next"
4) Check "Debugging Tools for Windows" and click "Change"
:::
The following `git` settings should be changed:
```bash
git config --global core.autocrlf false
git config --global core.filemode false
git config --global branch.autosetuprebase always
```
</TabItem>
</Tabs>
1) Download and install `depot_tools`:
<Tabs groupId="os">
<TabItem value="unix" label="Linux/MacOS">
```bash
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
```
</TabItem>
<TabItem value="win" label="Windows">
[The bundle](https://storage.googleapis.com/chrome-infra/depot_tools.zip) is a
ZIP file that should be downloaded and extracted.
The demo was last tested on an exFAT-formatted drive (mounted at `E:\`).
After extracting, verify that the `depot_tools` folder is not read-only.
</TabItem>
</Tabs>
2) Add the path to the `PATH` environment variable:
<Tabs groupId="os">
<TabItem value="unix" label="Linux/MacOS">
```bash
export PATH="/usr/local/lib/depot_tools:$PATH"
```
@ -169,16 +248,91 @@ export PATH="/usr/local/lib/depot_tools:$PATH"
At this point, it is strongly recommended to add the line to a shell startup
script such as `.bashrc` or `.zshrc`
</TabItem>
<TabItem value="win" label="Windows">
:::caution pass
These instructions are for `cmd` use. Do not run in PowerShell!
It is strongly recommended to use the "Developer Command Prompt" from Visual
Studio as it prepares the console to run build tools.
:::
```bash
set DEPOT_TOOLS_WIN_TOOLCHAIN=0
set PATH=E:\depot_tools;%PATH%
```
In addition, the `vs2022_install` variable must be set to the Visual Studio
folder. For example, using the "Community Edition", the assignment should be
```bash
set vs2022_install="C:\Program Files\Microsoft Visual Studio\2022\Community"
```
These environment variables can be persisted in the Control Panel.
</TabItem>
</Tabs>
3) Run `gclient` once to update `depot_tools`:
<Tabs groupId="os">
<TabItem value="unix" label="Linux/MacOS">
```bash
gclient
```
</TabItem>
<TabItem value="win" label="Windows">
```bash
gclient
```
:::caution pass
`gclient` may throw errors related to `git` and permissions issues:
```
fatal: detected dubious ownership in repository at 'E:/depot_tools'
'E:/depot_tools' is on a file system that doesnot record ownership
To add an exception for this directory, call:
git config --global --add safe.directory E:/depot_tools
```
These issues are related to the exFAT file system. They were resolved by running
the recommended commands and re-running `gclient`.
:::
:::caution pass
There were errors pertaining to `gitconfig`:
```
error: could not write config file E:/depot_tools/bootstrap-2@3_8_10_chromium_26_bin/git/etc/gitconfig: File exists
```
This can happen if the `depot_tools` folder is read-only. The workaround is to
unset the read-only flag for the `E:\depot_tools` folder.
:::
</TabItem>
</Tabs>
### Clone V8
4) Create a base directory:
<Tabs groupId="os">
<TabItem value="unix" label="Linux/MacOS">
```bash
mkdir -p ~/dev/v8
cd ~/dev/v8
@ -188,12 +342,94 @@ cd v8
Note that the actual repo will be placed in `~/dev/v8/v8`.
5) Checkout the desired version. The following command pulls `11.3.244.11`:
</TabItem>
<TabItem value="win" label="Windows">
```bash
git checkout refs/tags/11.3.244.11 -b sample -t
cd E:\
mkdir v8
cd v8
fetch v8
cd v8
```
:::caution pass
On exFAT, every cloned repo elicited the same `git` permissions error. `fetch`
will fail with a clear remedy message such as
```
git config --global --add safe.directory E:/v8/v8
```
Run the command then run `gclient sync`, repeating each time the command fails.
:::
:::caution pass
There were occasional `git` conflict errors:
```
v8/tools/clang (ERROR)
----------------------------------------
[0:00:01] Started.
...
error: Your local changes to the following files would be overwritten by checkout:
plugins/FindBadRawPtrPatterns.cpp
...
Please commit your changes or stash them before you switch branches.
Aborting
error: could not detach HEAD
----------------------------------------
Error: 28> Unrecognized error, please merge or rebase manually.
28> cd E:\v8\v8\tools\clang && git rebase --onto 65ceb79efbc9d1dec9b1a0f4bc0b8d010b9d7a66 refs/remotes/origin/main
```
The recommended fix is to delete the referenced folder and re-run `gclient sync`
:::
</TabItem>
</Tabs>
5) Checkout the desired version. The following command pulls `11.8.82`:
<Tabs groupId="os">
<TabItem value="unix" label="Linux/MacOS">
```bash
git checkout refs/tags/11.8.82 -b sample -t
```
</TabItem>
<TabItem value="win" label="Windows">
```bash
git checkout tags/11.8.82 -b sample
```
:::caution pass
The official documentation recommends:
```bash
git checkout refs/tags/11.8.82 -b sample -t
```
This command failed in local testing:
```
E:\v8\v8>git checkout refs/tags/11.8.82 -b sample -t
fatal: cannot set up tracking information; starting point 'refs/tags/11.8.82' is not a branch
```
:::
</TabItem>
</Tabs>
### Build V8
6) Build the static library.
@ -214,6 +450,54 @@ tools/dev/v8gen.py arm64.release.sample
ninja -C out.gn/arm64.release.sample v8_monolith
```
</TabItem>
<TabItem value="win10-x64" label="Windows">
```bash
python3 tools\dev\v8gen.py -vv x64.release.sample
ninja -C out.gn\x64.release.sample v8_monolith
```
:::caution pass
In local testing, the build sometimes failed with a `dbghelp.dll` error:
```
Exception: dbghelp.dll not found in "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\dbghelp.dll"
```
This issue was fixed by removing and reinstalling "Debugging Tools for Windows"
from the Control Panel as described in step 0.
:::
:::caution pass
In local testing, the `ninja` build failed with C++ deprecation errors:
```c++
../..\src/wasm/wasm-code-manager.h(789,28): error: 'atomic_load<v8::base::OwnedVector<const unsigned char>>' is deprecated: warning STL4029: std::atomic_*() overloads for shared_ptr are deprecated in C++20. The shared_ptr specialization of std::atomic provides superior functionality. You can define _SILENCE_CXX20_OLD_SHARED_PTR_ATOMIC_SUPPORT_DEPRECATION_WARNING or _SILENCE_ALL_CXX20_DEPRECATION_WARNINGS to suppress this warning. [-Werror,-Wdeprecated-declarations]
789 | auto wire_bytes = std::atomic_load(&wire_bytes_);
| ^
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.37.32822\include\memory(3794,1): note: 'atomic_load<v8::base::OwnedVector<const unsigned char>>' has been explicitly marked deprecated here
3794 | _CXX20_DEPRECATE_OLD_SHARED_PTR_ATOMIC_SUPPORT _NODISCARD shared_ptr<_Ty> atomic_load(
| ^
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.37.32822\include\yvals_core.h(1317,7): note: expanded from macro '_CXX20_DEPRECATE_OLD_SHARED_PTR_ATOMIC_SUPPORT'
1317 | [[deprecated("warning STL4029: " \
| ^
2 errors generated.
[14/1303] CXX obj/torque_generated_definitions/js-atomics-synchronization-tq.obj
FAILED: obj/torque_generated_definitions/js-atomics-synchronization-tq.obj
```
The workaround is to append a line to `out.gn\x64.release.sample\args.gn`:
```text title="out.gn\x64.release.sample\args.gn (add to end)"
treat_warnings_as_errors = false
```
:::
</TabItem>
</Tabs>
@ -237,6 +521,14 @@ g++ -I. -Iinclude samples/hello-world.cc -o hello_world -fno-rtti -lv8_monolith
-lv8_libbase -lv8_libplatform -ldl -Lout.gn/arm64.release.sample/obj/ -pthread \
-std=c++17 -DV8_COMPRESS_POINTERS=1 -DV8_ENABLE_SANDBOX
./hello_world
```
</TabItem>
<TabItem value="win10-x64" label="Windows">
```bash
cl /I. /Iinclude samples/hello-world.cc /GR- v8_monolith.lib Advapi32.lib Winmm.lib Dbghelp.lib /std:c++17 /DV8_COMPRESS_POINTERS=1 /DV8_ENABLE_SANDBOX /link /out:hello_world.exe /LIBPATH:out.gn\x64.release.sample\obj\
.\hello_world.exe
```
</TabItem>
@ -247,14 +539,32 @@ g++ -I. -Iinclude samples/hello-world.cc -o hello_world -fno-rtti -lv8_monolith
8) Make a new project folder:
<Tabs groupId="os">
<TabItem value="unix" label="Linux/MacOS">
```bash
cd ~/dev
mkdir -p sheetjs-v8
cd sheetjs-v8
```
</TabItem>
<TabItem value="win" label="Windows">
```bash
cd E:\
mkdir sheetjs-v8
cd sheetjs-v8
```
</TabItem>
</Tabs>
9) Copy the sample source:
<Tabs groupId="os">
<TabItem value="unix" label="Linux/MacOS">
```bash
cp ~/dev/v8/v8/samples/hello-world.cc .
```
@ -280,8 +590,23 @@ ln -s ~/dev/v8/v8/out.gn/arm64.release.sample/obj
</TabItem>
</Tabs>
</TabItem>
<TabItem value="win" label="Windows">
```bash
copy E:\v8\v8\samples\hello-world.cc .\
```
10) Observe that exFAT does not support symbolic links and move on to step 11.
</TabItem>
</Tabs>
11) Build and run the `hello-world` example from this folder:
<Tabs groupId="os">
<TabItem value="unix" label="Linux/MacOS">
```bash
g++ -I. -Iinclude hello-world.cc -o hello_world -fno-rtti -lv8_monolith \
-lv8_libbase -lv8_libplatform -ldl -Lobj/ -pthread -std=c++17 \
@ -289,6 +614,17 @@ g++ -I. -Iinclude hello-world.cc -o hello_world -fno-rtti -lv8_monolith \
./hello_world
```
</TabItem>
<TabItem value="win" label="Windows">
```bash
cl /MT /I..\v8\v8\ /I..\v8\v8\include hello-world.cc /GR- v8_monolith.lib Advapi32.lib Winmm.lib Dbghelp.lib /std:c++17 /DV8_COMPRESS_POINTERS=1 /DV8_ENABLE_SANDBOX /link /out:hello_world.exe /LIBPATH:..\v8\v8\out.gn\x64.release.sample\obj\
.\hello_world.exe
```
</TabItem>
</Tabs>
### Add SheetJS
12) Download the standalone script and test file:
@ -311,18 +647,44 @@ curl -LO https://docs.sheetjs.com/v8/sheetjs.v8.cc
14) Compile standalone `sheetjs.v8` binary
<Tabs groupId="os">
<TabItem value="unix" label="Linux/MacOS">
```bash
g++ -I. -Iinclude sheetjs.v8.cc -o sheetjs.v8 -fno-rtti -lv8_monolith \
-lv8_libbase -lv8_libplatform -ldl -Lobj/ -pthread -std=c++17 \
-DV8_COMPRESS_POINTERS=1 -DV8_ENABLE_SANDBOX
```
</TabItem>
<TabItem value="win" label="Windows">
```bash
cl /MT /I..\v8\v8\ /I..\v8\v8\include sheetjs.v8.cc /GR- v8_monolith.lib Advapi32.lib Winmm.lib Dbghelp.lib /std:c++17 /DV8_COMPRESS_POINTERS=1 /DV8_ENABLE_SANDBOX /link /out:sheetjs.v8.exe /LIBPATH:..\v8\v8\out.gn\x64.release.sample\obj\
```
</TabItem>
</Tabs>
15) Run the demo:
<Tabs groupId="os">
<TabItem value="unix" label="Linux/MacOS">
```bash
./sheetjs.v8 pres.numbers
```
</TabItem>
<TabItem value="win" label="Windows">
```bash
cl /MT /I..\v8\v8\ /I..\v8\v8\include sheetjs.v8.cc /GR- v8_monolith.lib Advapi32.lib Winmm.lib Dbghelp.lib /std:c++17 /DV8_COMPRESS_POINTERS=1 /DV8_ENABLE_SANDBOX /link /out:sheetjs.v8.exe /LIBPATH:..\v8\v8\out.gn\x64.release.sample\obj\
```
</TabItem>
</Tabs>
If the program succeeded, the CSV contents will be printed to console and the
file `sheetjsw.xlsb` will be created. That file can be opened with Excel.
@ -358,7 +720,7 @@ This demo was last tested in the following deployments:
| Architecture | V8 Crate | Date |
|:-------------|:---------|:-----------|
| `darwin-x64` | `0.71.2` | 2023-05-22 |
| `darwin-x64` | `0.75.1` | 2023-08-26 |
| `darwin-arm` | `0.73.0` | 2023-06-05 |
| `linux-x64` | `0.71.2` | 2023-05-23 |
| `win10-x64` | `0.71.2` | 2023-05-23 |

@ -120,13 +120,14 @@ This demo was tested in the following deployments:
| Architecture | Git Commit | Date |
|:-------------|:-----------|:-----------|
| `darwin-x64` | `c3ead3f` | 2023-07-05 |
| `darwin-arm` | `c3ead3f` | 2023-07-05 |
| `darwin-x64` | `c3ead3f` | 2023-08-26 |
| `darwin-arm` | `c3ead3f` | 2023-08-26 |
| `win10-x64` | `c3ead3f` | 2023-08-26 |
| `linux-x64` | `c3ead3f` | 2023-07-05 |
:::
0) Install `icu` and `cmake` dependencies.
0) Install dependencies:
<Tabs groupId="triple">
<TabItem value="darwin-x64" label="Intel Mac">
@ -151,13 +152,19 @@ On Arch Linux / HoloOS:
sudo pacman -S cmake clang
```
</TabItem>
<TabItem value="win10-x64" label="Windows">
Install Visual Studio 2022 with the "Desktop Development with C++" workflow.
All commands in this demo should be run in a Developer Command Prompt.
</TabItem>
</Tabs>
1) Download ChakraCore:
```bash
git clone https://github.com/Microsoft/ChakraCore
git clone https://github.com/Microsoft/ChakraCore.git
cd ChakraCore
git checkout c3ead3f
cd ..
@ -241,6 +248,31 @@ When the demo was last tested, ChakraCore JIT was not supported.
cd ChakraCore
./build.sh --static --embed-icu --test-build -j=8 --no-jit
cd ..
```
</TabItem>
<TabItem value="win10-x64" label="Windows">
:::info pass
As explained in the ChakraCore project wiki[^1], the build accepts a few flags:
- `/p:Platform=x64` controls the architecture
- `/p:Configuration=Debug` enables runtime checks
- `/p:RuntimeLib=static_library` ensures MSVC libraries are statically linked
:::
```
cd ChakraCore
msbuild /m /p:Platform=x64 /p:Configuration=Debug /p:RuntimeLib=static_library Build\Chakra.Core.sln
cd ..
```
After building, the generated DLL should be copied into the project folder:
```
copy .\ChakraCore\Build\VcBuild\bin\x64_debug\ChakraCore.dll .
```
</TabItem>
@ -252,18 +284,19 @@ cd ..
- [`Makefile`](pathname:///chakra/Makefile)
```bash
curl -LO https://docs.sheetjs.com/chakra/sheetjs.ch.cpp
curl -LO https://docs.sheetjs.com/chakra/Makefile
curl -L -O https://docs.sheetjs.com/chakra/sheetjs.ch.cpp
curl -L -O https://docs.sheetjs.com/chakra/Makefile
```
4) Build the sample application:
<Tabs groupId="os">
<TabItem value="unix" label="Linux/MacOS">
```bash
make
```
This program tries to parse the file specified by the first argument
:::caution
When this demo was last tested on macOS, the build failed with the message:
@ -283,6 +316,16 @@ sudo ln -s /opt/homebrew/opt/icu4c
:::
</TabItem>
<TabItem value="win" label="Windows">
```
cl sheetjs.ch.cpp ChakraCore.lib /I ChakraCore\lib\Jsrt /link /LIBPATH:ChakraCore\Build\VcBuild\bin\x64_debug
```
</TabItem>
</Tabs>
5) Download the standalone script, shim script, and test file:
<ul>
@ -292,17 +335,30 @@ sudo ln -s /opt/homebrew/opt/icu4c
</ul>
<CodeBlock language="bash">{`\
curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js
curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/shim.min.js
curl -LO https://sheetjs.com/pres.numbers`}
curl -L -O https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js
curl -L -O https://cdn.sheetjs.com/xlsx-${current}/package/dist/shim.min.js
curl -L -O https://sheetjs.com/pres.numbers`}
</CodeBlock>
6) Run the test program:
<Tabs groupId="os">
<TabItem value="unix" label="Linux/MacOS">
```bash
./sheetjs.ch pres.numbers
```
</TabItem>
<TabItem value="win" label="Windows">
```
.\sheetjs.ch.exe pres.numbers
```
</TabItem>
</Tabs>
If successful, the program will print the contents of the first sheet as CSV.
@ -310,8 +366,7 @@ If successful, the program will print the contents of the first sheet as CSV.
:::note
This demo was last tested on 2023 April 09 against `ch` `1.13.0.0-beta`.
The command line tool was built against commit `c3ead3f`.
This demo was last tested on 2023-08-26 against `ch` commit `c3ead3f`.
:::
@ -321,6 +376,13 @@ file as a Base64 string and directly add it to an amalgamated script.
0) Download and extract the ChakraCore release ZIP. Copy the binary (`bin/ch`)
to your project folder.
:::note pass
The ["Integration Example"](#integration-example) also builds the `ch` binary!
It will typically be placed in the `ChakraCore/out/Test/` folder.
:::
1) Download the standalone script, shim, and test file:
<ul>
@ -329,6 +391,12 @@ to your project folder.
<li><a href="https://sheetjs.com/pres.numbers">pres.numbers</a></li>
</ul>
<CodeBlock language="bash">{`\
curl -L -O https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js
curl -L -O https://cdn.sheetjs.com/xlsx-${current}/package/dist/shim.min.js
curl -L -O https://sheetjs.com/pres.numbers`}
</CodeBlock>
2) Bundle the test file and create `payload.js`:
```bash
@ -364,3 +432,5 @@ ready, it will read the bundled test data and print the contents as CSV.
```bash
./ch xlsx.chakra.js
```
[^1]: See ["Building ChakraCore"](https://github.com/chakra-core/ChakraCore/wiki/Building-ChakraCore#deployment) in the ChakraCore project wiki

@ -1,6 +1,6 @@
---
title: Sheet Visibility
sidebar_position: 7
sidebar_position: 10
---
<details>

@ -8,6 +8,8 @@ The official source code repository is <https://git.sheetjs.com/sheetjs/sheetjs>
Issues should be raised at <https://git.sheetjs.com/sheetjs/sheetjs/issues>
Issues can also be reported on [our Discord server](https://sheetjs.com/chat)
The official changelog can be found [in the source code repository](https://git.sheetjs.com/sheetjs/sheetjs/raw/branch/master/CHANGELOG.md)
:::tip pass

@ -16,12 +16,13 @@ static char *read_file(const char *filename, size_t *sz) {
return buf;
}
v8::Local<v8::Value> eval_code(v8::Isolate *isolate, v8::Local<v8::Context> context, char* code) {
v8::Local<v8::String> source = v8::String::NewFromUtf8(isolate, code).ToLocalChecked();
v8::Local<v8::Value> eval_code(v8::Isolate *isolate, v8::Local<v8::Context> context, char* code, size_t sz = -1) {
v8::Local<v8::String> source = v8::String::NewFromUtf8(isolate, code, v8::NewStringType::kNormal, sz).ToLocalChecked();
v8::Local<v8::Script> script = v8::Script::Compile(context, source).ToLocalChecked();
return script->Run(context).ToLocalChecked();
}
#define EVAL_CODE(x) eval_code(isolate, context, (char *)x)
#define EVAL_CODE2(x,sz) eval_code(isolate, context, (char *)x, sz)
int main(int argc, char* argv[]) {
/* initialize -- this part is from the hello world example */
@ -47,7 +48,7 @@ int main(int argc, char* argv[]) {
if(!file) { perror("Error reading xlsx.full.min.js"); return 1; }
/* evaluate */
v8::Local<v8::Value> result = EVAL_CODE(file);
v8::Local<v8::Value> result = EVAL_CODE2(file, sz);
/* free */
free(file);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 302 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 KiB

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 64 KiB