2013-10-30 19:26:07 +00:00
/* vim: set ts=2: */
var XLSX ;
var fs = require ( 'fs' ) , assert = require ( 'assert' ) ;
2014-02-15 05:08:18 +00:00
describe ( 'source' , function ( ) { it ( 'should load' , function ( ) { XLSX = require ( './' ) ; } ) ; } ) ;
var opts = { } ;
if ( process . env . WTF ) opts . WTF = true ;
2014-01-28 16:38:02 +00:00
var ex = [ ".xlsb" , ".xlsm" , ".xlsx" ] ;
2014-02-13 06:22:42 +00:00
if ( process . env . FMTS ) ex = process . env . FMTS . split ( ":" ) . map ( function ( x ) { return x [ 0 ] === "." ? x : "." + x ; } ) ;
2014-02-12 06:09:42 +00:00
var exp = ex . map ( function ( x ) { return x + ".pending" ; } ) ;
2014-01-28 16:38:02 +00:00
function test _file ( x ) { return ex . indexOf ( x . substr ( - 5 ) ) >= 0 || exp . indexOf ( x . substr ( - 13 ) ) >= 0 ; }
var files = ( fs . existsSync ( 'tests.lst' ) ? fs . readFileSync ( 'tests.lst' , 'utf-8' ) . split ( "\n" ) : fs . readdirSync ( 'test_files' ) ) . filter ( test _file ) ;
2013-10-30 19:26:07 +00:00
2014-01-23 06:20:19 +00:00
/* Excel enforces 31 character sheet limit, although technical file limit is 255 */
function fixsheetname ( x ) { return x . substr ( 0 , 31 ) ; }
2013-12-27 03:15:16 +00:00
function normalizecsv ( x ) { return x . replace ( /\t/g , "," ) . replace ( /#{255}/g , "" ) . replace ( /"/g , "" ) . replace ( /[\n\r]+/g , "\n" ) . replace ( /\n*$/ , "" ) ; }
2014-02-15 05:08:18 +00:00
var dir = "./test_files/" ;
2013-10-30 19:26:07 +00:00
function parsetest ( x , wb ) {
describe ( x + ' should have all bits' , function ( ) {
2014-02-15 05:08:18 +00:00
var sname = dir + '2011/' + x + '.sheetnames' ;
2013-10-30 19:26:07 +00:00
it ( 'should have all sheets' , function ( ) {
wb . SheetNames . forEach ( function ( y ) { assert ( wb . Sheets [ y ] , 'bad sheet ' + y ) ; } ) ;
} ) ;
it ( 'should have the right sheet names' , fs . existsSync ( sname ) ? function ( ) {
var file = fs . readFileSync ( sname , 'utf-8' ) ;
2014-01-23 06:20:19 +00:00
var names = wb . SheetNames . map ( fixsheetname ) . join ( "\n" ) + "\n" ;
2013-12-27 03:15:16 +00:00
assert . equal ( names , file ) ;
2013-10-30 19:26:07 +00:00
} : null ) ;
} ) ;
2014-01-23 06:20:19 +00:00
describe ( x + ' should generate CSV' , function ( ) {
wb . SheetNames . forEach ( function ( ws , i ) {
it ( '#' + i + ' (' + ws + ')' , function ( ) {
var csv = XLSX . utils . make _csv ( wb . Sheets [ ws ] ) ;
} ) ;
} ) ;
} ) ;
2014-01-23 15:55:07 +00:00
describe ( x + ' should generate JSON' , function ( ) {
wb . SheetNames . forEach ( function ( ws , i ) {
it ( '#' + i + ' (' + ws + ')' , function ( ) {
var json = XLSX . utils . sheet _to _row _object _array ( wb . Sheets [ ws ] ) ;
} ) ;
} ) ;
} ) ;
describe ( x + ' should generate formulae' , function ( ) {
wb . SheetNames . forEach ( function ( ws , i ) {
it ( '#' + i + ' (' + ws + ')' , function ( ) {
var json = XLSX . utils . get _formulae ( wb . Sheets [ ws ] ) ;
} ) ;
} ) ;
} ) ;
2013-10-30 19:26:07 +00:00
describe ( x + ' should generate correct output' , function ( ) {
wb . SheetNames . forEach ( function ( ws , i ) {
2014-02-15 05:08:18 +00:00
var name = ( dir + x + '.' + i + '.csv' ) ;
2014-02-22 21:36:28 +00:00
if ( x . substr ( - 5 ) === ".xlsb" ) {
root = x . slice ( 0 , - 5 ) ;
2014-02-26 19:30:32 +00:00
if ( ! fs . existsSync ( name ) ) name = ( dir + root + '.xlsx.' + i + '.csv' ) ;
if ( ! fs . existsSync ( name ) ) name = ( dir + root + '.xlsm.' + i + '.csv' ) ;
if ( ! fs . existsSync ( name ) ) name = ( dir + root + '.xls.' + i + '.csv' ) ;
2014-02-22 21:36:28 +00:00
}
2013-10-30 19:26:07 +00:00
it ( '#' + i + ' (' + ws + ')' , fs . existsSync ( name ) ? function ( ) {
var file = fs . readFileSync ( name , 'utf-8' ) ;
var csv = XLSX . utils . make _csv ( wb . Sheets [ ws ] ) ;
2013-12-27 03:15:16 +00:00
assert . equal ( normalizecsv ( csv ) , normalizecsv ( file ) , "CSV badness" ) ;
2013-10-30 19:26:07 +00:00
} : null ) ;
} ) ;
} ) ;
2014-02-17 08:44:22 +00:00
if ( ! fs . existsSync ( dir + '2013/' + x + '.xlsb' ) ) return ;
describe ( x + '.xlsb from 2013' , function ( ) {
it ( 'should parse' , function ( ) {
var xlsb = XLSX . readFile ( dir + '2013/' + x + '.xlsb' , opts ) ;
} ) ;
} ) ;
2013-10-30 19:26:07 +00:00
}
describe ( 'should parse test files' , function ( ) {
files . forEach ( function ( x ) {
it ( x , x . substr ( - 8 ) == ".pending" ? null : function ( ) {
2014-02-15 05:08:18 +00:00
var wb = XLSX . readFile ( dir + x , opts ) ;
2013-10-30 19:26:07 +00:00
parsetest ( x , wb ) ;
} ) ;
} ) ;
} ) ;
2014-01-15 07:26:00 +00:00
2014-02-12 06:09:42 +00:00
describe ( 'options' , function ( ) {
var html _cell _types = [ 's' ] ;
before ( function ( ) {
XLSX = require ( './' ) ;
} ) ;
2014-02-15 05:08:18 +00:00
describe ( 'cell' , function ( ) {
it ( 'should generate HTML by default' , function ( ) {
var wb = XLSX . readFile ( dir + 'comments_stress_test.xlsx' ) ;
var ws = wb . Sheets . Sheet1 ;
2014-02-13 06:22:42 +00:00
Object . keys ( ws ) . forEach ( function ( addr ) {
if ( addr [ 0 ] === "!" || ! ws . hasOwnProperty ( addr ) ) return ;
2014-02-15 05:08:18 +00:00
assert ( html _cell _types . indexOf ( ws [ addr ] . t ) === - 1 || ws [ addr ] . h ) ;
2014-02-13 06:22:42 +00:00
} ) ;
} ) ;
2014-02-15 05:08:18 +00:00
it ( 'should not generate HTML when requested' , function ( ) {
var wb = XLSX . readFile ( dir + 'comments_stress_test.xlsx' , { cellHTML : false } ) ;
var ws = wb . Sheets . Sheet1 ;
2014-02-13 06:22:42 +00:00
Object . keys ( ws ) . forEach ( function ( addr ) {
if ( addr [ 0 ] === "!" || ! ws . hasOwnProperty ( addr ) ) return ;
2014-02-15 05:08:18 +00:00
assert ( typeof ws [ addr ] . h === 'undefined' ) ;
2014-02-13 06:22:42 +00:00
} ) ;
} ) ;
2014-02-15 05:08:18 +00:00
it ( 'should generate formulae by default' , function ( ) {
var wb = XLSX . readFile ( dir + 'formula_stress_test.xlsb' ) ;
var found = false ;
wb . SheetNames . forEach ( function ( s ) {
var ws = wb . Sheets [ s ] ;
Object . keys ( ws ) . forEach ( function ( addr ) {
if ( addr [ 0 ] === "!" || ! ws . hasOwnProperty ( addr ) ) return ;
if ( typeof ws [ addr ] . f !== 'undefined' ) return found = true ;
} ) ;
2014-02-13 08:48:41 +00:00
} ) ;
2014-02-15 05:08:18 +00:00
assert ( found ) ;
2014-02-13 08:48:41 +00:00
} ) ;
2014-02-15 05:08:18 +00:00
it ( 'should not generate formulae when requested' , function ( ) {
var wb = XLSX . readFile ( dir + 'formula_stress_test.xlsb' , { cellFormula : false } ) ;
wb . SheetNames . forEach ( function ( s ) {
var ws = wb . Sheets [ s ] ;
Object . keys ( ws ) . forEach ( function ( addr ) {
if ( addr [ 0 ] === "!" || ! ws . hasOwnProperty ( addr ) ) return ;
assert ( typeof ws [ addr ] . f === 'undefined' ) ;
} ) ;
} ) ;
} ) ;
it ( 'should not generate number formats by default' , function ( ) {
var wb = XLSX . readFile ( dir + 'number_format.xlsm' ) ;
wb . SheetNames . forEach ( function ( s ) {
var ws = wb . Sheets [ s ] ;
Object . keys ( ws ) . forEach ( function ( addr ) {
if ( addr [ 0 ] === "!" || ! ws . hasOwnProperty ( addr ) ) return ;
assert ( typeof ws [ addr ] . z === 'undefined' ) ;
} ) ;
2014-02-13 08:48:41 +00:00
} ) ;
} ) ;
2014-02-15 05:08:18 +00:00
it ( 'should generate number formats when requested' , function ( ) {
var wb = XLSX . readFile ( dir + 'number_format.xlsm' , { cellNF : true } ) ;
wb . SheetNames . forEach ( function ( s ) {
var ws = wb . Sheets [ s ] ;
Object . keys ( ws ) . forEach ( function ( addr ) {
if ( addr [ 0 ] === "!" || ! ws . hasOwnProperty ( addr ) ) return ;
2014-02-26 19:30:32 +00:00
assert ( ws [ addr ] . t !== 'n' || typeof ws [ addr ] . z !== 'undefined' ) ;
2014-02-15 05:08:18 +00:00
} ) ;
} ) ;
} ) ;
} ) ;
describe ( 'sheet' , function ( ) {
it ( 'should not generate sheet stubs by default' , function ( ) {
var wb = XLSX . readFile ( dir + 'merge_cells.xlsx' ) ;
assert . throws ( function ( ) { wb . Sheets . Merge . A2 . v ; } ) ;
} ) ;
it ( 'should generate sheet stubs when requested' , function ( ) {
var wb = XLSX . readFile ( dir + 'merge_cells.xlsx' , { sheetStubs : true } ) ;
assert ( typeof wb . Sheets . Merge . A2 . t !== 'undefined' ) ;
} ) ;
2014-02-19 03:03:28 +00:00
it ( 'should read all cells by default' , function ( ) {
var wb = XLSX . readFile ( dir + 'formula_stress_test.xlsb' ) ;
assert ( typeof wb . Sheets . Text . A46 !== 'undefined' ) ;
assert ( typeof wb . Sheets . Text . B26 !== 'undefined' ) ;
assert ( typeof wb . Sheets . Text . C16 !== 'undefined' ) ;
assert ( typeof wb . Sheets . Text . D2 !== 'undefined' ) ;
wb = XLSX . readFile ( dir + 'formula_stress_test.xlsx' ) ;
assert ( typeof wb . Sheets . Text . A46 !== 'undefined' ) ;
assert ( typeof wb . Sheets . Text . B26 !== 'undefined' ) ;
assert ( typeof wb . Sheets . Text . C16 !== 'undefined' ) ;
assert ( typeof wb . Sheets . Text . D2 !== 'undefined' ) ;
} ) ;
it ( 'sheetRows n=20' , function ( ) {
var wb = XLSX . readFile ( dir + 'formula_stress_test.xlsx' , { sheetRows : 20 } ) ;
assert ( typeof wb . Sheets . Text . A46 === 'undefined' ) ;
assert ( typeof wb . Sheets . Text . B26 === 'undefined' ) ;
assert ( typeof wb . Sheets . Text . C16 !== 'undefined' ) ;
assert ( typeof wb . Sheets . Text . D2 !== 'undefined' ) ;
wb = XLSX . readFile ( dir + 'formula_stress_test.xlsb' , { sheetRows : 20 } ) ;
assert ( typeof wb . Sheets . Text . A46 === 'undefined' ) ;
assert ( typeof wb . Sheets . Text . B26 === 'undefined' ) ;
assert ( typeof wb . Sheets . Text . C16 !== 'undefined' ) ;
assert ( typeof wb . Sheets . Text . D2 !== 'undefined' ) ;
} ) ;
it ( 'sheetRows n=10' , function ( ) {
var wb = XLSX . readFile ( dir + 'formula_stress_test.xlsb' , { sheetRows : 10 } ) ;
assert ( typeof wb . Sheets . Text . A46 === 'undefined' ) ;
assert ( typeof wb . Sheets . Text . B26 === 'undefined' ) ;
assert ( typeof wb . Sheets . Text . C16 === 'undefined' ) ;
assert ( typeof wb . Sheets . Text . D2 !== 'undefined' ) ;
wb = XLSX . readFile ( dir + 'formula_stress_test.xlsx' , { sheetRows : 10 } ) ;
assert ( typeof wb . Sheets . Text . A46 === 'undefined' ) ;
assert ( typeof wb . Sheets . Text . B26 === 'undefined' ) ;
assert ( typeof wb . Sheets . Text . C16 === 'undefined' ) ;
assert ( typeof wb . Sheets . Text . D2 !== 'undefined' ) ;
} ) ;
2014-02-13 08:48:41 +00:00
} ) ;
2014-02-14 06:25:46 +00:00
describe ( 'book' , function ( ) {
it ( 'bookSheets should not generate sheets' , function ( ) {
2014-02-15 05:08:18 +00:00
var wb = XLSX . readFile ( dir + 'merge_cells.xlsx' , { bookSheets : true } ) ;
2014-02-14 06:25:46 +00:00
assert ( typeof wb . Sheets === 'undefined' ) ;
} ) ;
it ( 'bookProps should not generate sheets' , function ( ) {
2014-02-15 05:08:18 +00:00
var wb = XLSX . readFile ( dir + 'number_format.xlsb' , { bookProps : true } ) ;
2014-02-14 06:25:46 +00:00
assert ( typeof wb . Sheets === 'undefined' ) ;
} ) ;
it ( 'bookProps && bookSheets should not generate sheets' , function ( ) {
2014-02-15 05:08:18 +00:00
var wb = XLSX . readFile ( dir + 'LONumbers.xlsx' , { bookProps : true , bookSheets : true } ) ;
2014-02-14 06:25:46 +00:00
assert ( typeof wb . Sheets === 'undefined' ) ;
} ) ;
2014-02-15 05:08:18 +00:00
it ( 'should not generate deps by default' , function ( ) {
2014-02-17 08:44:22 +00:00
var wb = XLSX . readFile ( dir + 'formula_stress_test.xlsx' ) ;
assert ( typeof wb . Deps === 'undefined' || ! ( wb . Deps . length > 0 ) ) ;
} ) ;
it ( 'bookDeps should generate deps' , function ( ) {
2014-02-15 05:08:18 +00:00
var wb = XLSX . readFile ( dir + 'formula_stress_test.xlsx' , { bookDeps : true } ) ;
assert ( typeof wb . Deps !== 'undefined' && wb . Deps . length > 0 ) ;
} ) ;
2014-02-17 08:44:22 +00:00
it ( 'should not generate files or keys by default' , function ( ) {
2014-02-15 05:08:18 +00:00
var wb = XLSX . readFile ( dir + 'formula_stress_test.xlsx' ) ;
2014-02-17 08:44:22 +00:00
assert ( typeof wb . files === 'undefined' ) ;
assert ( typeof wb . keys === 'undefined' ) ;
wb = XLSX . readFile ( dir + 'formula_stress_test.xlsb' ) ;
assert ( typeof wb . files === 'undefined' ) ;
assert ( typeof wb . keys === 'undefined' ) ;
} ) ;
it ( 'bookFiles should generate files and keys' , function ( ) {
var wb = XLSX . readFile ( dir + 'formula_stress_test.xlsx' , { bookFiles : true } ) ;
assert ( typeof wb . files !== 'undefined' ) ;
assert ( typeof wb . keys !== 'undefined' ) ;
wb = XLSX . readFile ( dir + 'formula_stress_test.xlsb' , { bookFiles : true } ) ;
assert ( typeof wb . files !== 'undefined' ) ;
assert ( typeof wb . keys !== 'undefined' ) ;
2014-02-15 05:08:18 +00:00
} ) ;
2014-02-14 06:25:46 +00:00
} ) ;
} ) ;
describe ( 'input formats' , function ( ) {
it ( 'should read binary strings' , function ( ) {
2014-02-15 05:08:18 +00:00
XLSX . read ( fs . readFileSync ( dir + 'comments_stress_test.xlsb' , 'binary' ) , { type : 'binary' } ) ;
XLSX . read ( fs . readFileSync ( dir + 'comments_stress_test.xlsx' , 'binary' ) , { type : 'binary' } ) ;
2014-02-14 06:25:46 +00:00
} ) ;
it ( 'should read base64 strings' , function ( ) {
2014-02-15 05:08:18 +00:00
XLSX . read ( fs . readFileSync ( dir + 'comments_stress_test.xlsb' , 'base64' ) , { type : 'base64' } ) ;
XLSX . read ( fs . readFileSync ( dir + 'comments_stress_test.xlsx' , 'base64' ) , { type : 'base64' } ) ;
2014-02-14 06:25:46 +00:00
} ) ;
2014-02-12 06:09:42 +00:00
} ) ;
2014-02-14 03:39:03 +00:00
2014-02-15 05:08:18 +00:00
describe ( 'features' , function ( ) {
describe ( 'should have comment as part of cell properties' , function ( ) {
var ws ;
before ( function ( ) {
XLSX = require ( './' ) ;
var wb = XLSX . readFile ( dir + 'apachepoi_SimpleWithComments.xlsx' ) ;
var sheetName = 'Sheet1' ;
ws = wb . Sheets [ sheetName ] ;
} ) ;
it ( 'Parse comments.xml and insert into cell' , function ( ) {
assert . equal ( ws . B1 . c . length , 1 , "must have 1 comment" ) ;
assert . equal ( ws . B1 . c [ 0 ] . t , "Yegor Kozlov:\r\nfirst cell" , "must have the concatenated texts" ) ;
assert . equal ( ws . B1 . c [ 0 ] . h , '<span style="font-weight: bold;">Yegor Kozlov:</span><span style=""><br/>first cell</span>' , "must have the html representation" ) ;
assert . equal ( ws . B1 . c [ 0 ] . r , '<r><rPr><b/><sz val="8"/><color indexed="81"/><rFont val="Tahoma"/></rPr><t>Yegor Kozlov:</t></r><r><rPr><sz val="8"/><color indexed="81"/><rFont val="Tahoma"/></rPr><t xml:space="preserve">\r\nfirst cell</t></r>' , "must have the rich text representation" ) ;
assert . equal ( ws . B1 . c [ 0 ] . a , "Yegor Kozlov" , "must have the same author" ) ;
} ) ;
2014-02-14 03:39:03 +00:00
} ) ;
2014-02-15 03:15:10 +00:00
2014-02-19 03:03:28 +00:00
describe ( 'should parse core properties and custom properties' , function ( ) {
2014-02-15 05:08:18 +00:00
var wb ;
before ( function ( ) {
XLSX = require ( './' ) ;
wb = XLSX . readFile ( dir + 'custom_properties.xlsx' ) ;
} ) ;
it ( 'Must have read the core properties' , function ( ) {
assert . equal ( wb . Props . Company , 'Vector Inc' ) ;
assert . equal ( wb . Props . Creator , 'Pony Foo' ) ;
} ) ;
it ( 'Must have read the custom properties' , function ( ) {
assert . equal ( wb . Custprops [ 'I am a boolean' ] , true ) ;
assert . equal ( wb . Custprops [ 'Date completed' ] , '1967-03-09T16:30:00Z' ) ;
assert . equal ( wb . Custprops . Status , 2 ) ;
assert . equal ( wb . Custprops . Counter , - 3.14 ) ;
} ) ;
2014-02-15 03:15:10 +00:00
} ) ;
2014-02-15 05:08:18 +00:00
2014-02-19 03:03:28 +00:00
describe ( 'should parse cells with date type (XLSX/XLSB)' , function ( ) {
2014-02-15 05:08:18 +00:00
var wb , ws ;
before ( function ( ) {
XLSX = require ( './' ) ;
wb = XLSX . readFile ( dir + 'xlsx-stream-d-date-cell.xlsx' ) ;
var sheetName = 'Sheet1' ;
ws = wb . Sheets [ sheetName ] ;
} ) ;
it ( 'Must have read the date' , function ( ) {
var sheet = XLSX . utils . sheet _to _row _object _array ( ws ) ;
assert . equal ( sheet [ 3 ] [ 'てすと' ] , '2/14/14' ) ;
} ) ;
2014-02-15 03:15:10 +00:00
} ) ;
2014-02-19 03:03:28 +00:00
describe ( 'sheetRows' , function ( ) {
it ( 'should use original range if not set' , function ( ) {
var wb = XLSX . readFile ( dir + 'formula_stress_test.xlsb' ) ;
assert . equal ( wb . Sheets . Text [ "!ref" ] , "A1:F49" ) ;
wb = XLSX . readFile ( dir + 'formula_stress_test.xlsx' ) ;
assert . equal ( wb . Sheets . Text [ "!ref" ] , "A1:F49" ) ;
} ) ;
it ( 'should adjust range if set' , function ( ) {
var wb = XLSX . readFile ( dir + 'formula_stress_test.xlsx' , { sheetRows : 10 } ) ;
assert . equal ( wb . Sheets . Text [ "!fullref" ] , "A1:F49" ) ;
assert . equal ( wb . Sheets . Text [ "!ref" ] , "A1:F10" ) ;
wb = XLSX . readFile ( dir + 'formula_stress_test.xlsb' , { sheetRows : 10 } ) ;
assert . equal ( wb . Sheets . Text [ "!fullref" ] , "A1:F49" ) ;
assert . equal ( wb . Sheets . Text [ "!ref" ] , "A1:F10" ) ;
} ) ;
it ( 'should not generate comment cells' , function ( ) {
var wb = XLSX . readFile ( dir + 'comments_stress_test.xlsx' , { sheetRows : 10 } ) ;
assert . equal ( wb . Sheets . Sheet7 [ "!fullref" ] , "A1:N34" ) ;
assert . equal ( wb . Sheets . Sheet7 [ "!ref" ] , "A1:A1" ) ;
wb = XLSX . readFile ( dir + 'comments_stress_test.xlsb' , { sheetRows : 10 } ) ;
assert . equal ( wb . Sheets . Sheet7 [ "!fullref" ] , "A1:N34" ) ;
assert . equal ( wb . Sheets . Sheet7 [ "!ref" ] , "A1:A1" ) ;
} ) ;
} ) ;
2014-02-15 03:15:10 +00:00
} ) ;