TS write test

run `make tslint` to run TS checks
This commit is contained in:
SheetJS 2017-05-15 11:48:44 -04:00
parent cb6633be18
commit 409581b317
6 changed files with 224 additions and 35 deletions

@ -71,7 +71,7 @@ dist-deps: ## Copy dependencies for distribution
aux: $(AUXTARGETS)
.PHONY: bytes
bytes: ## display minified and gzipped file sizes
bytes: ## Display minified and gzipped file sizes
for i in dist/xlsx.min.js dist/xlsx.{core,full}.min.js; do printj "%-30s %7d %10d" $$i $$(wc -c < $$i) $$(gzip --best --stdout $$i | wc -c); done
.PHONY: graph
@ -156,6 +156,11 @@ old-lint: $(TARGET) $(AUXTARGETS) ## Run jshint and jscs checks
@jscs $(TARGET) $(AUXTARGETS)
if [ -e $(CLOSURE) ]; then java -jar $(CLOSURE) $(REQS) $(FLOWTARGET) --jscomp_warning=reportUnknownTypes >/dev/null; fi
.PHONY: tslint
tslint: $(TARGET) ## Run typescript checks
#@npm install dtslint typescript
@npm run-script dtslint
.PHONY: flow
flow: lint ## Run flow checker
@flow check --all --show-all-errors

@ -1,11 +1,11 @@
/* writing feature test -- look for TEST: in comments */
/* vim: set ts=2: */
/* vim: set ts=2 ft=javascript: */
/* original data */
var data = [
[1,2,3],
[1, 2, 3],
[true, false, null, "sheetjs"],
["foo","bar",new Date("2014-02-19T14:30Z"), "0.3"],
["foo", "bar", new Date("2014-02-19T14:30Z"), "0.3"],
["baz", null, "qux", 3.14159],
["hidden"],
["visible"]
@ -26,15 +26,16 @@ var wsrows = [
{hpx: 16}, // "pixels"
,
{hpx: 24},
{hidden:true}, // hide row
{hidden:false}
{hidden: true}, // hide row
{hidden: false}
];
console.log("Sheet Name: " + ws_name);
console.log("Data: "); for(var i=0; i!=data.length; ++i) console.log(data[i]);
console.log("Columns :"); for(i=0; i!=wscols.length;++i) console.log(wscols[i]);
console.log("Data: ");
var i = 0;
for(i = 0; i != data.length; ++i) console.log(data[i]);
console.log("Columns :");
for(i = 0; i != wscols.length; ++i) console.log(wscols[i]);
/* require XLSX */
if(typeof XLSX === "undefined") { try { XLSX = require('./'); } catch(e) { XLSX = require('../'); } }
@ -166,7 +167,7 @@ console.log(ws);
'sheetjs.prn',
'sheetjs.dif'
].forEach(function(r) {
if(typeof r == 'string') {
if(typeof r === 'string') {
/* write file */
XLSX.writeFile(wb, r);
/* test by reading back files */

56
types/index.d.ts vendored

@ -1,5 +1,4 @@
// Project: https://github.com/SheetJS/js-xlsx
// Definitions by: themauveavenger <https://github.com/themauveavenger/>, Wolfgang Faust <https://github.com/wolfgang42>
/* index.d.ts (C) 2015-present SheetJS and contributors */
// TypeScript Version: 2.2
/** Attempts to read filename and parse */
@ -14,15 +13,20 @@ export function write(data: WorkBook, opts?: WritingOptions): any;
export const utils: Utils;
export interface Properties {
LastAuthor?: string;
Title?: string;
Subject?: string;
Author?: string;
Manager?: string;
Company?: string;
Category?: string;
Keywords?: string;
Comments?: string;
LastAuthor?: string;
CreatedDate?: Date;
ModifiedDate?: Date;
Application?: string;
AppVersion?: string;
Company?: string;
DocSecurity?: string;
Manager?: string;
HyperlinksChanged?: boolean;
SharedDoc?: boolean;
LinksUpToDate?: boolean;
@ -138,7 +142,7 @@ export interface WritingOptions {
* Type of Workbook
* @default 'xlsx'
*/
bookType?: 'xlsx' | 'xlsm' | 'xlsb' | 'ods' | 'biff2' | 'fods' | 'csv';
bookType?: 'xlsx' | 'xlsm' | 'xlsb' | 'biff2' | 'xlml' | 'ods' | 'fods' | 'csv' | 'txt' | 'sylk' | 'html' | 'dif' | 'prn';
/**
* Name of Worksheet for single-sheet formats
@ -169,7 +173,13 @@ export interface WorkBook {
* an object storing the standard properties. wb.Custprops stores custom properties.
* Since the XLS standard properties deviate from the XLSX standard, XLS parsing stores core properties in both places.
*/
Props: Properties;
Props?: Properties;
Workbook?: WBProps;
}
export interface WBProps {
Sheets?: any[];
}
export interface ColInfo {
@ -180,7 +190,7 @@ export interface ColInfo {
/**
* width in Excel's "Max Digit Width", width*256 is integral
*/
width: number;
width?: number;
/**
* width in screen pixels
*/
@ -314,7 +324,7 @@ export interface Sheet {
* object representing the worksheet
*/
export interface WorkSheet extends Sheet {
[cell: string]: WorkSheetCell | any;
[cell: string]: CellObject | any;
'!cols'?: ColInfo[];
'!rows'?: RowInfo[];
'!merges'?: Range[];
@ -326,9 +336,9 @@ export interface WorkSheet extends Sheet {
* The Excel data type for a cell.
* b Boolean, n Number, e error, s String, d Date
*/
export type ExcelDataType = 'b' | 'n' | 'e' | 's' | 'd';
export type ExcelDataType = 'b' | 'n' | 'e' | 's' | 'd' | 'z';
export interface WorkSheetCell {
export interface CellObject {
/**
* The raw value of the cell.
*/
@ -386,7 +396,7 @@ export interface WorkSheetCell {
s?: object;
}
export interface Cell {
export interface CellAddress {
/** Column number */
c: number;
/** Row number */
@ -395,12 +405,14 @@ export interface Cell {
export interface Range {
/** Starting cell */
s: Cell;
s: CellAddress;
/** Ending cell */
e: Cell;
e: CellAddress;
}
export interface Utils {
/* --- Cell Address Utilities --- */
/** converts an array of arrays of JS data to a worksheet. */
aoa_to_sheet<T>(data: T[], opts?: any): WorkSheet;
@ -410,26 +422,36 @@ export interface Utils {
range?: any;
header?: "A"|number|string[];
}): T[];
/** Generates delimiter-separated-values output */
sheet_to_csv(worksheet: WorkSheet, options?: { FS: string, RS: string }): string;
/** Generates a list of the formulae (with value fallbacks) */
sheet_to_formulae(worksheet: WorkSheet): any;
/* --- Cell Address Utilities --- */
/** Converts 0-indexed cell address to A1 form */
encode_cell(cell: Cell): string;
encode_cell(cell: CellAddress): string;
/** Converts 0-indexed row to A1 form */
encode_row(row: number): string;
/** Converts 0-indexed column to A1 form */
encode_col(col: number): string;
/** Converts 0-indexed range to A1 form */
encode_range(s: Cell, e: Cell): string;
encode_range(s: CellAddress, e: CellAddress): string;
/** Converts A1 cell address to 0-indexed form */
decode_cell(address: string): Cell;
decode_cell(address: string): CellAddress;
/** Converts A1 row to 0-indexed form */
decode_row(row: string): number;
/** Converts A1 column to 0-indexed form */
decode_col(col: string): number;
/** Converts A1 range to 0-indexed form */
decode_range(range: string): Range;
}

8
types/tslint.json Normal file

@ -0,0 +1,8 @@
{
"extends": "dtslint/dtslint.json",
"rules": {
"whitespace": false,
"no-sparse-arrays": false,
"no-consecutive-blank-lines": false
}
}

153
types/write.ts Normal file

@ -0,0 +1,153 @@
/* writing feature test -- look for TEST: in comments */
/* vim: set ts=2 ft=javascript: */
/* original data */
let data = [
[1, 2, 3],
[true, false, null, "sheetjs"],
["foo", "bar", new Date("2014-02-19T14:30Z"), "0.3"],
["baz", null, "qux", 3.14159],
["hidden"],
["visible"]
];
const ws_name = "SheetJS";
let wscols = [
{wch: 6}, // "characters"
{wpx: 50}, // "pixels"
,
{hidden: true} // hide column
];
/* At 96 PPI, 1 pt = 1 px */
let wsrows = [
{hpt: 12}, // "points"
{hpx: 16}, // "pixels"
,
{hpx: 24},
{hidden: true}, // hide row
{hidden: false}
];
console.log("Sheet Name: " + ws_name);
console.log("Data: ");
let i = 0;
for(i = 0; i !== data.length; ++i) console.log(data[i]);
console.log("Columns :");
for(i = 0; i !== wscols.length; ++i) console.log(wscols[i]);
/* require XLSX */
import XLSX = require('xlsx');
/* blank workbook constructor */
let wb: XLSX.WorkBook = { SheetNames: <string[]>[], Sheets: {} };
/* convert an array of arrays in JS to a CSF spreadsheet */
let ws = XLSX.utils.aoa_to_sheet(data, {cellDates:true});
/* TEST: add worksheet to workbook */
wb.SheetNames.push(ws_name);
wb.Sheets[ws_name] = ws;
/* TEST: simple formula */
ws['C1'].f = "A1+B1";
ws['C2'] = {t:'n', f:"A1+B1"};
/* TEST: single-cell array formula */
ws['D1'] = {t:'n', f:"SUM(A1:C1*A1:C1)", F:"D1:D1"};
/* TEST: multi-cell array formula */
ws['E1'] = {t:'n', f:"TRANSPOSE(A1:D1)", F:"E1:E4"};
ws['E2'] = {t:'n', F:"E1:E4"};
ws['E3'] = {t:'n', F:"E1:E4"};
ws['E4'] = {t:'n', F:"E1:E4"};
ws["!ref"] = "A1:E6";
/* TEST: column props */
ws['!cols'] = wscols;
/* TEST: row props */
ws['!rows'] = wsrows;
/* TEST: hyperlink note: Excel does not automatically style hyperlinks */
ws['A3'].l = { Target: "http://sheetjs.com", Tooltip: "Visit us <SheetJS.com!>" };
/* TEST: built-in format */
ws['B1'].z = "0%"; // Format Code 9
/* TEST: custom format */
const custfmt = "\"This is \"\\ 0.0";
ws['C2'].z = custfmt;
/* TEST: page margins */
ws['!margins'] = { left:1.0, right:1.0, top:1.0, bottom:1.0, header:0.5, footer:0.5 };
console.log("JSON Data:");
console.log(XLSX.utils.sheet_to_json(ws, {header:1}));
/* TEST: hidden sheets */
wb.SheetNames.push("Hidden");
wb.Sheets["Hidden"] = XLSX.utils.aoa_to_sheet(["Hidden".split(""), [1,2,3]]);
wb.Workbook = {Sheets:[]};
wb.Workbook.Sheets[1] = {Hidden:1};
/* TEST: properties */
wb.Props = {
Title: "SheetJS Test",
Subject: "Tests",
Author: "Devs at SheetJS",
Manager: "Sheet Manager",
Company: "SheetJS",
Category: "Experimentation",
Keywords: "Test",
Comments: "Nothing to say here",
LastAuthor: "Not SheetJS",
CreatedDate: new Date(2017,1,19)
};
/* TEST: comments */
ws['A4'].c = [];
ws['A4'].c.push({a:"SheetJS",t:"I'm a little comment, short and stout!\n\nWell, Stout may be the wrong word"});
/* TEST: sheet protection */
ws['!protect'] = {
password:"password",
/* enable formatting rows and columns */
formatRows:false,
formatColumns:false,
/* disable editing objects and scenarios */
objects:true,
scenarios:true
};
console.log("Worksheet Model:");
console.log(ws);
const filenames: Array<[string]|[string, XLSX.WritingOptions]> = [
['sheetjs.xlsx', {bookSST:true}],
['sheetjs.xlsm'],
['sheetjs.xlsb'],
['sheetjs.xls', {bookType:'biff2'}],
['sheetjs.xml.xls', {bookType:'xlml'}],
['sheetjs.ods'],
['sheetjs.fods'],
['sheetjs.slk'],
['sheetjs.csv'],
['sheetjs.txt'],
['sheetjs.prn'],
['sheetjs.dif']
];
filenames.forEach((r) => {
/* write file */
XLSX.writeFile(wb, r[0], r[1]);
/* test by reading back files */
XLSX.readFile(r[0]);
});

@ -1,11 +1,11 @@
import xlsx = require('xlsx');
import XLSX = require('xlsx');
const options: xlsx.ParsingOptions = {
const options: XLSX.ParsingOptions = {
cellDates: true
};
const workbook = xlsx.readFile('test.xlsx', options);
const otherworkbook = xlsx.readFile('test.xlsx', {type: 'file'});
const workbook = XLSX.readFile('test.xlsx', options);
const otherworkbook = XLSX.readFile('test.xlsx', {type: 'file'});
console.log(workbook.Props.Author);
@ -20,6 +20,6 @@ interface Tester {
age: number;
}
const jsonvalues: Tester[] = xlsx.utils.sheet_to_json<Tester>(firstworksheet);
const csv = xlsx.utils.sheet_to_csv(firstworksheet);
const formulae = xlsx.utils.sheet_to_formulae(firstworksheet);
const jsonvalues: Tester[] = XLSX.utils.sheet_to_json<Tester>(firstworksheet);
const csv = XLSX.utils.sheet_to_csv(firstworksheet);
const formulae = XLSX.utils.sheet_to_formulae(firstworksheet);