(wb.Sheets[wb.SheetNames[0]]);
---
Presidents
Name | Index |
{/* Display each row object as a TR within the TBODY element */}
{data.map(row => (
{row.Name} | {row.Index} |
))}
```
When built using `npx astro build`, Astro will perform the conversion and emit
a simple HTML table without any reference to the existing spreadsheet file!
## Complete Example
:::note
This demo was tested on 2023 February 21 using AstroJS `v2.0.14`
:::
0) Disable Astro telemetry:
```bash
npx astro telemetry disable
```
1) Create a new site using the `docs` template:
```bash
npm create astro@latest -- --template docs --yes ./sheetjs-astro
cd sheetjs-astro
```
2) Fetch the example file [`pres.numbers`](https://sheetjs.com/pres.numbers):
```bash
mkdir -p src/data
curl -Lo src/data/pres.numbers https://sheetjs.com/pres.numbers
```
3) Install the SheetJS library:
{`\
npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz`}
4) Replace `src/pages/index.astro` with the following:
```jsx title="src/pages/index.astro"
---
/* -- the code in the frontmatter is only run at build time -- */
import { read, utils } from "xlsx";
/* parse workbook */
import b64 from "../data/pres.numbers";
const wb = read(b64, {type: "base64"});
/* generate row objects */
interface IPresident {
Name: string;
Index: number;
}
const data = utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]);
---
Presidents
Name | Index |
{data.map(row => (
{row.Name} | {row.Index} |
))}
```
5) Append the following lines to `src/env.d.ts`:
```ts title="src/env.d.ts"
/* add to the end of the file */
declare module '*.numbers' {
const data: string;
export default data;
}
declare module '*.xlsx' {
const data: string;
export default data;
}
```
6) Add the highlighted lines to `astro.config.mjs`:
```js title="astro.config.mjs"
// highlight-start
/* import `readFileSync` at the top of the script*/
import { readFileSync } from 'fs';
// highlight-end
import { defineConfig } from 'astro/config';
export default defineConfig({
// highlight-start
/* this vite section should be added as a property of the object */
vite: {
// this tells astro which extensions to handle
assetsInclude: ['**/*.numbers', '**/*.xlsx'],
plugins: [
{ // this plugin presents the data as a Base64 string
name: "sheet-base64",
transform(code, id) {
if(!id.match(/\.(numbers|xlsx)$/)) return;
var data = readFileSync(id, "base64");
return `export default '${data}'`;
}
}
]
},
// highlight-end
integrations: [
```
7) Build the static site:
```bash
npx astro build
```
AstroJS will place the generated site in the `dist` subfolder.
8) Start a web server to host the static site:
```bash
npx http-server dist
```
Open a web browser and access the displayed URL (usually http://localhost:8080).
View the page source and confirm that no JS was added to the page. It only
contains the content from the file in an HTML table.