---
title: Adobe Apps
---

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

Photoshop, InDesign and other Adobe Creative Suite applications offer extension
support.  Over the years there have been a few different JavaScript platforms:

- "ExtendScript": This uses an old JavaScript dialect but is supported in older
  versions of Creative Suite and Creative Cloud.

- "CEP": This was recommended in CS6 but eventually deprecated.

- "UXP": This is the current Adobe recommendation for new CC extensions.

This demo intends to cover parts relevant to SheetJS.  General setup as well as
general Adobe considerations are not covered here.  A basic familiarity with
extension development is assumed.

## ExtendScript Scripts

[Installation is straightforward:](../getting-started/installation/extendscript) download a
script and move it to your project directory.

### Reading Files

`XLSX.readFile` can directly accept an absolute URI:

```js
var workbook = XLSX.readFile("~/Documents/test.xlsx");
```

The path can be user-configurable using `File.openDialog`:

```js
/* Show File Picker */
var thisFile = File.openDialog("Select a spreadsheet");
if(!thisFile) { alert("File not found!"); return; }

/* Read file from disk */
var workbook = XLSX.readFile(thisFile.absoluteURI);
```

<details open><summary><b>Complete Example</b> (click to hide)</summary>

In this example, the script will show a dialog to select a file.  After reading
the file, the workbook Author property will be extracted and the Photoshop doc
author (`activeDocument.info.author`) will be changed accordingly.

This demo was verified in Photoshop CS6 64-bit on Windows 10.

```js
#target photoshop
#include "xlsx.extendscript.js";

function main_parse() {
  /* Show File Picker */
  var thisFile = File.openDialog("Select a spreadsheet");
  if(!thisFile) { alert("File not found!"); return; }

  /* Read file from disk */
  var workbook = XLSX.readFile(thisFile.absoluteURI);

  /* Get Workbook Author */
  var Props = workbook.Props; if(!Props) { alert("Missing Author!"); return; }
  var Author = Props.Author; if(!Author) { alert("Missing Author!"); return; }

  /* Change Document Author to Workbook Author */
  var info = activeDocument.info;
  alert("Changing Author from |" + info.author + "| to |" + Author + "|");
  info.author = Author;
}

main_parse();
```

0) Download the [test workbook](pathname:///files/SheetJS.xlsb).

1) Download the following scripts:
- [`xlsx.extendscript.js`](https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.extendscript.js)
- [`parse.jsx`](pathname:///live/parse.jsx)

and place in the scripts directory.  For CS6 Windows 10 the path is typically

`C:\Program Files\Adobe\Adobe Photoshop CS6 (64 Bit)\Presets\Scripts`

2) Restart Photoshop and open a file (or create a new one)

3) File > Scripts > parse and select the test workbook

4) An alert will confirm that the file was read and the author will be changed:

!["Changing Author" popup](pathname:///files/psparse.png)

5) File > File Info... should show the updated Author field!

</details>

### Writing Files

`XLSX.writeFile` can directly accept an absolute URI:

```js
XLSX.writeFile(workbook, "~/Documents/test.xlsx");
```

The path can be user-configurable using `File.saveDialog`:

```js
/* Show File Picker */
var thisFile = File.saveDialog("Select an output file", "*.xlsx;*.xls");
if(!thisFile) { alert("File not found!"); return; }

/* Write file to disk */
XLSX.writeFile(workbook, thisFile.absoluteURI);
```

<details open><summary><b>Complete Example</b> (click to hide)</summary>

In this example, the script will show a dialog to select an output file.  Once
selected, the library will create a new workbook with one worksheet.  Cell `A1`
will be "Author" and cell `B1` will be the active Photoshop document Author.
The PS author is available as `activeDocument.info.author`.

This demo was verified in Photoshop CS6 64-bit on Windows 10.

```js
#target photoshop
#include "xlsx.extendscript.js";

function main_write() {
  /* Show File Picker */
  var thisFile = File.saveDialog("Select an output file", "*.xlsx;*.xls");
  if(!thisFile) { alert("File not found!"); return; }

  /* Create new Worksheet */
  var ws = XLSX.utils.aoa_to_sheet([
    ["Author", activeDocument.info.author]
  ]);

  /* Create new Workbook and add worksheet */
  var wb = XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(wb, ws, "Sheet1");

  /* Write file to disk */
  XLSX.writeFile(wb, thisFile.absoluteURI);
  alert("Created File " + thisFile.absoluteURI);
}

main_write();
```

1) Download the following scripts:
- [`xlsx.extendscript.js`](https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.extendscript.js)
- [`write.jsx`](pathname:///live/write.jsx)

and place in the scripts directory.  For CS6 Windows 10 the path is typically

`C:\Program Files\Adobe\Adobe Photoshop CS6 (64 Bit)\Presets\Scripts`

2) Restart Photoshop and open a file (or create a new one)

3) File > File Info ... and confirm there is an Author. If not, set to `SheetJS`

4) File > Scripts > write and use the popup to select the Documents folder.
   Enter `SheetJSPSTest.xlsx` and press "Save"

4) An alert will confirm that the file was created:

!["Created File" popup](pathname:///files/pswrite.png)

5) Open the generated `SheetJSPSTest.xlsx` file and compare to Photoshop author

</details>

## CEP

[The standalone scripts](../getting-started/installation/standalone) can be added to CEP
extension HTML

## UXP

UXP officially recommends `require` and NodeJS Modules for third party support.

[Use the "Frameworks" instructions to download.](../getting-started/installation/frameworks)

