From e43071fc64e5507eacbe6cd8df2067a1ca37b674 Mon Sep 17 00:00:00 2001 From: SheetJS Date: Tue, 10 May 2022 04:02:52 -0400 Subject: [PATCH] more lotus 1-2-3 formula functions --- README.md | 6 ++-- bits/31_rels.js | 2 +- bits/41_lotus.js | 72 +++++++++++++++++++++++++++++++++++++ demos/array/Makefile | 13 ++++--- demos/array/README.md | 24 ------------- demos/array/package.json | 6 ++++ demos/array/propel.js | 59 ------------------------------ demos/electron/README.md | 2 +- demos/electron/package.json | 4 +-- demos/parcel/.gitignore | 1 + demos/parcel/Makefile | 9 +++-- demos/parcel/package.json | 11 +++++- demos/vue/SheetJS-vue.js | 2 +- demos/vue/package.json | 2 +- docbits/10_install.md | 4 +-- misc/docs/README.md | 6 ++-- 16 files changed, 116 insertions(+), 107 deletions(-) create mode 100644 demos/array/package.json delete mode 100644 demos/array/propel.js diff --git a/README.md b/README.md index d0e1ae1..00d0681 100644 --- a/README.md +++ b/README.md @@ -164,10 +164,10 @@ These scripts are also available on the CDN: -[Bower](https://bower.io/search/?q=js-xlsx) will pull the entire repo: +[Bower](https://bower.io/) plays nice with the CDN tarballs: ```bash -$ bower install js-xlsx +$ npx bower install https://cdn.sheetjs.com/xlsx-0.18.7/xlsx-0.18.7.tgz ``` Bower will place the standalone scripts in `bower_components/js-xlsx/dist/` @@ -2591,7 +2591,7 @@ XLSX.write(wb, {Props:{Author:"SheetJS"}});
Format Support (click to show) -**Defined Names**: XLSX/M, XLSB, BIFF8 XLS, XLML, SYLK +**Defined Names**: XLSX/M, XLSB, BIFF8 XLS, XLML, SYLK **Unicode Defined Names**: XLSX/M, XLSB, BIFF8 XLS, XLML diff --git a/bits/31_rels.js b/bits/31_rels.js index e29600c..56f7f52 100644 --- a/bits/31_rels.js +++ b/bits/31_rels.js @@ -30,10 +30,10 @@ var RELS = ({ XLMETA: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sheetMetadata", TCMNT: "http://schemas.microsoft.com/office/2017/10/relationships/threadedComment", PEOPLE: "http://schemas.microsoft.com/office/2017/10/relationships/person", + CONN: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/connections", VBA: "http://schemas.microsoft.com/office/2006/relationships/vbaProject" }/*:any*/); - /* 9.3.3 Representing Relationships */ function get_rels_path(file/*:string*/)/*:string*/ { var n = file.lastIndexOf("/"); diff --git a/bits/41_lotus.js b/bits/41_lotus.js index 00d305e..433ce9c 100644 --- a/bits/41_lotus.js +++ b/bits/41_lotus.js @@ -403,16 +403,88 @@ var WK_ = /*#__PURE__*/(function() { ]; */ /* TODO: flesh out */ var FuncTab = { + 0x1F: ["NA", 0], + // 0x20: ["ERR", 0], + 0x21: ["ABS", 1], + 0x22: ["TRUNC", 1], + 0x23: ["SQRT", 1], + 0x24: ["LOG", 1], + 0x25: ["LN", 1], + 0x26: ["PI", 0], + 0x27: ["SIN", 1], + 0x28: ["COS", 1], + 0x29: ["TAN", 1], + 0x2A: ["ATAN2", 2], + 0x2B: ["ATAN", 1], + 0x2C: ["ASIN", 1], + 0x2D: ["ACOS", 1], + 0x2E: ["EXP", 1], + 0x2F: ["MOD", 2], + // 0x30 + 0x31: ["ISNA", 1], + 0x32: ["ISERR", 1], 0x33: ["FALSE", 0], 0x34: ["TRUE", 0], + 0x35: ["RAND", 0], + // 0x36 DATE + // 0x37 NOW + // 0x38 PMT + // 0x39 PV + // 0x3A FV + // 0x3B IF + // 0x3C DAY + // 0x3D MONTH + // 0x3E YEAR + 0x3F: ["ROUND", 2], + // 0x40 TIME + // 0x41 HOUR + // 0x42 MINUTE + // 0x43 SECOND + 0x44: ["ISNUMBER", 1], + 0x45: ["ISTEXT", 1], 0x46: ["LEN", 1], + 0x47: ["VALUE", 1], + // 0x48: ["FIXED", ?? 1], + 0x49: ["MID", 3], 0x4A: ["CHAR", 1], + // 0x4B + // 0x4C FIND + // 0x4D DATEVALUE + // 0x4E TIMEVALUE + // 0x4F CELL 0x50: ["SUM", 69], 0x51: ["AVERAGEA", 69], 0x52: ["COUNTA", 69], 0x53: ["MINA", 69], 0x54: ["MAXA", 69], + // 0x55 VLOOKUP + // 0x56 NPV + // 0x57 VAR + // 0x58 STD + // 0x59 IRR + // 0x5A HLOOKUP + // 0x5B DSUM + // 0x5C DAVERAGE + // 0x5D DCOUNTA + // 0x5E DMIN + // 0x5F DMAX + // 0x60 DVARP + // 0x61 DSTDEVP + // 0x62 INDEX + // 0x63 COLS + // 0x64 ROWS + // 0x65 REPEAT + 0x66: ["UPPER", 1], + 0x67: ["LOWER", 1], + // 0x68 LEFT + // 0x69 RIGHT + // 0x6A REPLACE + 0x6B: ["PROPER", 1], + // 0x6C CELL + 0x6D: ["TRIM", 1], + // 0x6E CLEAN 0x6F: ["T", 1] + // 0x70 V }; var BinOpTab = [ "", "", "", "", "", "", "", "", // eslint-disable-line no-mixed-spaces-and-tabs diff --git a/demos/array/Makefile b/demos/array/Makefile index 3420ad0..abeba97 100644 --- a/demos/array/Makefile +++ b/demos/array/Makefile @@ -1,8 +1,7 @@ -.PHONY: tfjs -tfjs: - npm install @tensorflow/tfjs - node tf.js +.PHONY: init +init: + npm i -.PHONY: propel -propel: - node propel.js +.PHONY: tfjs +tfjs: init + node tf.js diff --git a/demos/array/README.md b/demos/array/README.md index b50ed85..18a50d3 100644 --- a/demos/array/README.md +++ b/demos/array/README.md @@ -104,30 +104,6 @@ function array_to_sheet(farray, shape, headers) { } ``` -#### Tensor Operations with Propel ML - -[Propel ML](http://propelml.org/) `tensor` objects can be transposed: - -```js -var tensor = pr.tensor(aoa).transpose(); -var col1 = tensor.slice(0, 1); -var col2 = tensor.slice(1, 1); -``` - -To export to a worksheet, `dataSync` generates a `Float32Array` that can be -re-shaped in JS: - -```js -/* extract shape and float array */ -var tensor = pr.concat([col1, col2]).transpose(); -var shape = tensor.shape; -var farray = tensor.dataSync(); -var ws = array_to_sheet(farray, shape, ["header1", "header2"]); -``` - -The demo generates a sample dataset and uses Propel to calculate the OLS linear -regression coefficients. Afterwards, the tensors are exported to a new file. - #### TensorFlow [TensorFlow](https://js.tensorflow.org/) `tensor` objects can be created from diff --git a/demos/array/package.json b/demos/array/package.json new file mode 100644 index 0000000..2630a5b --- /dev/null +++ b/demos/array/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "@tensorflow/tfjs": "^3.16.0", + "xlsx": "https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz" + } +} diff --git a/demos/array/propel.js b/demos/array/propel.js deleted file mode 100644 index 6bbf3e6..0000000 --- a/demos/array/propel.js +++ /dev/null @@ -1,59 +0,0 @@ -/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ -/* eslint-env node */ -var XLSX = require('xlsx'); -var pr = require('propel'); -var linest = require('./linest'); - -/* generate linreg.xlsx with 100 random points */ -linest.generate_random_file(100); - -/* get the first worksheet as an array of arrays, skip the first row */ -var wb = XLSX.readFile('linreg.xlsx'); -var ws = wb.Sheets[wb.SheetNames[0]]; -var aoa = XLSX.utils.sheet_to_json(ws, {header:1, raw:true}).slice(1); - -/* calculate the coefficients in JS */ -(function(aoa) { - var x_ = 0, y_ = 0, xx = 0, xy = 0, n = aoa.length; - for(var i = 0; i < n; ++i) { - x_ += aoa[i][0] / n; - y_ += aoa[i][1] / n; - xx += aoa[i][0] * aoa[i][0]; - xy += aoa[i][0] * aoa[i][1]; - } - var m = Math.fround((xy - n * x_ * y_)/(xx - n * x_ * x_)); - console.log(m, Math.fround(y_ - m * x_), "JS Post"); -})(aoa); - -/* build X and Y vectors */ -var tensor = pr.tensor(aoa).transpose(); -var xs = tensor.slice(0, 1); -var ys = tensor.slice(1, 1); - -/* compute the coefficient */ -var n = xs.size; -var x_ = Math.fround(xs.reduceMean().dataSync()[0]); -var y_ = Math.fround(ys.reduceMean().dataSync()[0]); -var xx = Math.fround(xs.dot(xs.transpose()).dataSync()[0]); -var xy = Math.fround(xs.dot(ys.transpose()).dataSync()[0]); -var m = Math.fround((xy - n * x_ * y_)/(xx - n * x_ * x_)); -var b_ = Math.fround(y_ - m * x_); -console.log(m, b_, "Propel"); -var yh = xs.mul(m).add(b_); - -/* export data to aoa */ -var prdata = pr.concat([xs, ys, yh]).transpose(); -var shape = prdata.shape; -var prarr = prdata.dataSync(); -var praoa = []; -for(var j = 0; j < shape[0]; ++j) { - praoa[j] = []; - for(var i = 0; i < shape[1]; ++i) praoa[j][i] = prarr[j * shape[1] + i]; -} - -/* add headers and export */ -praoa.unshift(["x", "y", "pred"]); -var new_ws = XLSX.utils.aoa_to_sheet(praoa); -var new_wb = XLSX.utils.book_new(); -XLSX.utils.book_append_sheet(new_wb, new_ws, "Sheet1"); -XLSX.writeFile(new_wb, "propel.xls"); diff --git a/demos/electron/README.md b/demos/electron/README.md index 316b283..22c57aa 100644 --- a/demos/electron/README.md +++ b/demos/electron/README.md @@ -1,7 +1,7 @@ # Electron This library is compatible with Electron and should just work out of the box. -The demonstration uses Electron 17.1.0. The library is added via `require` from +The demonstration uses Electron 18.2.0. The library is added via `require` from the renderer process. The library can also be required from the main process, as shown in this demo diff --git a/demos/electron/package.json b/demos/electron/package.json index 9656d6c..808560b 100644 --- a/demos/electron/package.json +++ b/demos/electron/package.json @@ -4,8 +4,8 @@ "version": "0.0.0", "main": "main.js", "dependencies": { - "@electron/remote": "^2.0.5", - "electron": "^17.1.0", + "@electron/remote": "^2.0.8", + "electron": "^18.2.0", "xlsx": "https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz" }, "scripts": { diff --git a/demos/parcel/.gitignore b/demos/parcel/.gitignore index ba70f38..55f055f 100644 --- a/demos/parcel/.gitignore +++ b/demos/parcel/.gitignore @@ -1,2 +1,3 @@ .cache +.parcel-cache dist diff --git a/demos/parcel/Makefile b/demos/parcel/Makefile index 2df336a..81250eb 100644 --- a/demos/parcel/Makefile +++ b/demos/parcel/Makefile @@ -1,7 +1,12 @@ .PHONY: app -app: +app: init npx parcel build index.html +.PHONY: init +init: + mkdir -p node_modules + npm i + .PHONY: ctest -ctest: +ctest: init npx parcel index.html diff --git a/demos/parcel/package.json b/demos/parcel/package.json index 8503b3f..da9860f 100644 --- a/demos/parcel/package.json +++ b/demos/parcel/package.json @@ -1 +1,10 @@ -{ "source": "index.html", "scripts": { "build": "parcel build" } } +{ + "source":"index.html", + "scripts": { + "build":"parcel build" + }, + "dependencies": { + "parcel": "^2.5.0", + "xlsx":"https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz" + } +} diff --git a/demos/vue/SheetJS-vue.js b/demos/vue/SheetJS-vue.js index 7180216..a21d563 100644 --- a/demos/vue/SheetJS-vue.js +++ b/demos/vue/SheetJS-vue.js @@ -1,6 +1,6 @@ /* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ var SheetJSFT = [ - "xlsx", "xlsb", "xlsm", "xls", "xml", "csv", "txt", "ods", "fods", "uos", "sylk", "dif", "dbf", "prn", "qpw", "123", "wb*", "wq*", "html", "htm" + "xlsx", "xlsb", "xlsm", "xls", "xml", "csv", "txt", "ods", "fods", "uos", "sylk", "dif", "dbf", "prn", "qpw", "123", "wb*", "wq*", "html", "htm", "numbers" ].map(function(x) { return "." + x; }).join(","); var SJSTemplate = [ diff --git a/demos/vue/package.json b/demos/vue/package.json index cd6ff9c..c25e85c 100644 --- a/demos/vue/package.json +++ b/demos/vue/package.json @@ -2,6 +2,6 @@ "dependencies": { "@nuxt/content": "1.15.1", "nuxt": "2.15.8", - "xlsx": "^0.18.3" + "xlsx": "https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz" } } diff --git a/docbits/10_install.md b/docbits/10_install.md index 31274b2..b67a92e 100644 --- a/docbits/10_install.md +++ b/docbits/10_install.md @@ -45,10 +45,10 @@ These scripts are also available on the CDN:
-[Bower](https://bower.io/search/?q=js-xlsx) will pull the entire repo: +[Bower](https://bower.io/) plays nice with the CDN tarballs: ```bash -$ bower install js-xlsx +$ npx bower install https://cdn.sheetjs.com/xlsx-0.18.7/xlsx-0.18.7.tgz ``` Bower will place the standalone scripts in `bower_components/js-xlsx/dist/` diff --git a/misc/docs/README.md b/misc/docs/README.md index 25be7a2..dd5a23d 100644 --- a/misc/docs/README.md +++ b/misc/docs/README.md @@ -158,10 +158,10 @@ These scripts are also available on the CDN: -[Bower](https://bower.io/search/?q=js-xlsx) will pull the entire repo: +[Bower](https://bower.io/) plays nice with the CDN tarballs: ```bash -$ bower install js-xlsx +$ npx bower install https://cdn.sheetjs.com/xlsx-0.18.7/xlsx-0.18.7.tgz ``` Bower will place the standalone scripts in `bower_components/js-xlsx/dist/` @@ -2439,7 +2439,7 @@ XLSX.write(wb, {Props:{Author:"SheetJS"}}); #### Defined Names -**Defined Names**: XLSX/M, XLSB, BIFF8 XLS, XLML, SYLK +**Defined Names**: XLSX/M, XLSB, BIFF8 XLS, XLML, SYLK **Unicode Defined Names**: XLSX/M, XLSB, BIFF8 XLS, XLML