Skip to main content

Clipboard Data

Spreadsheet software like Excel typically support copying and pasting cells and data. This is implemented through the Clipboard ("Pasteboard" in MacOS).

When copying a selection of cells, Excel for Windows stores a screenshot of the selected cells as an image. It also creates and stores a number of strings and files for the various formats, including TSV, CSV, HTML, RTF, SYLK, DIF, XLSB, XLS (both '97-2004 and '95), and SpreadsheetML 2003.

Not all Clipboard APIs offer access to all clipboard types.

Browser Reading (paste)

Clipboard data can be read from a paste event, accessible from the event clipboardData property:

document.onpaste = function(e) {
/* get TSV */
var str = e.clipboardData.getData('text/html');
/* parse */
var wb = XLSX.read(str, {type: "string"});
/* DO SOMETHING WITH wb HERE */
};

getData accepts one argument: the desired MIME type. Chrome 103 supports:

MIME typeData format
text/plainTSV (tab separated values)
text/htmlHTML
text/rtfRTF (rich text format)

getData returns a string compatible with the string type for XLSX.read.

Live Demo

Open a file in Excel, copy some cells, then come back to this window. Click on "RESULT" below and paste (Control+V for Windows, Command+V for Mac).

Result
Loading...
Live Editor

Reading Files

Modern browsers support reading files that users have copied into the clipboard.

caution

Excel does not copy data into files! Use your system file browser to select and copy spreadsheets into the clipboard.

The event clipboardData.files property, if it is set, is a list of files.

Result
Loading...
Live Editor

Browser Writing (copy)

Clipboard data can be written from a copy event, accessible from the event clipboardData property:

document.oncopy = function(e) {
/* get HTML of first worksheet in workbook */
var str = XLSX.write(wb, {type: "string", bookType: "html"});
/* set HTML clipboard data */
e.clipboardData.setData('text/html', str);

/* prevent the browser from copying the normal data */
e.preventDefault();
};

setData accepts two arguments: MIME type and new data. Chrome 103 supports:

MIME typeData format
text/plainTSV (tab separated values)
text/htmlHTML

Browsers do not currently support assigning to the text/rtf clipboard type.

Live Demo

This demo creates a simple workbook from the following HTML table:

SheetJSClipboardDemo
bookTypeRTF
sourceHTML Table

Create a new file in Excel then come back to this window. Select the text below and copy (Control+C for Windows, Command+C for Mac). Go back to the excel

Result
Loading...
Live Editor

Electron

Electron Clipboard API supports HTML and RTF clipboards.

There are special methods for specific clipboard types:

File TypeRead Clipboard DataWrite Clipboard Data
RTFclipboard.readRTFclipboard.writeRTF
TSVclipboard.readTextclipboard.writeText
HTMLclipboard.readHTMLclipboard.writeHTML

Each method operates on JS strings.

clipboard.write can assign to multiple clipboard types:

const { clipboard } = require('electron');
const XLSX = require('xlsx');

function copy_first_sheet_to_clipboard(workbook) {
clipboard.write({
text: XLSX.write(wb, {type: "string", bookType: "txt"}),
rtf: XLSX.write(wb, {type: "string", bookType: "rtf"}),
html: XLSX.write(wb, {type: "string", bookType: "html"})
});
}
Experimental Buffer Clipboard Support

Electron additionally supports binary operations using Buffer objects. This support is considered "experimental" and is not guaranteed to work on any platform. Issues should be raised with the Electron project

On the MacOS platform, some versions of Excel store a packaged file with key dyn.ah62d4qmxhk4d425try1g44pdsm11g55gsu1en5pcqzwc4y5tsz3gg3k. The package is a simple CFB file that can be parsed:

const { clipboard } = require('electron');
const XLSX = require("xlsx");
const buf = clipboard.readBuffer('dyn.ah62d4qmxhk4d425try1g44pdsm11g55gsu1en5pcqzwc4y5tsz3gg3k');
const cfb = XLSX.CFB.read(buf, {type: "buffer"});
const pkg = XLSX.CFB.find(cfb, "Package").content;
const wb = XLSX.read(pkg);