121 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			121 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | #include <stdio.h>
 | ||
|  | #include <stddef.h>
 | ||
|  | #include <stdlib.h>
 | ||
|  | #include <string.h>
 | ||
|  | 
 | ||
|  | #include "quickjs.h"
 | ||
|  | 
 | ||
|  | static char *read_file(const char *filename, size_t *sz) { | ||
|  | 	FILE *f = fopen(filename, "rb"); | ||
|  | 	if(!f) return NULL; | ||
|  | 	long fsize; { fseek(f, 0, SEEK_END); fsize = ftell(f); fseek(f, 0, SEEK_SET); } | ||
|  | 	char *buf = (char *)malloc(fsize * sizeof(char)); | ||
|  | 	*sz = fread((void *) buf, 1, fsize, f); | ||
|  | 	fclose(f); | ||
|  | 	return buf; | ||
|  | } | ||
|  | 
 | ||
|  | #define CLEANUP(v) { JS_FreeContext(ctx); JS_FreeRuntime(rt); return v; }
 | ||
|  | #define FREE(v) JS_FreeValue(ctx, v);
 | ||
|  | #define VALIDATE(v) { if(JS_IsException(v)) CLEANUP(1) }
 | ||
|  | #define VALINIT(xx,vv) \
 | ||
|  |   JSValue xx = vv;\ | ||
|  | 	VALIDATE(xx) | ||
|  | #define VALPROP(xx,vv,pp) VALINIT(xx, JS_GetPropertyStr(ctx, vv, pp))
 | ||
|  | 
 | ||
|  | int main(int argc, char *argv[]) { | ||
|  | 	JSRuntime *rt = JS_NewRuntime(); | ||
|  | 	JSContext *ctx = JS_NewContext(rt); | ||
|  | 
 | ||
|  | 	/* load library */ | ||
|  | 	{ | ||
|  | 		size_t len; char * buf = read_file("xlsx.full.min.js", &len); | ||
|  | 		VALIDATE(JS_Eval(ctx, buf, len, "<input>", 0)) | ||
|  | 		free(buf); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	VALINIT(global, JS_GetGlobalObject(ctx)) | ||
|  | 	VALPROP(XLSX, global, "XLSX"); | ||
|  | 	FREE(global) | ||
|  | 
 | ||
|  | 	/* print version */ | ||
|  | 	{ | ||
|  | 		VALPROP(version, XLSX, "version") | ||
|  | 		size_t vlen; const char *vers = JS_ToCStringLen(ctx, &vlen, version); | ||
|  | 		printf("Version: %s\n", vers); | ||
|  | 		FREE(version) | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/* parse workbook */ | ||
|  | 	JSValue wb; | ||
|  | 	{ | ||
|  | 		/* read file */ | ||
|  | 		size_t dlen; uint8_t * dbuf = (uint8_t *)read_file(argv[1], &dlen); | ||
|  | 
 | ||
|  | 		/* load data into array buffer */ | ||
|  | 		JSValue ab = JS_NewArrayBuffer(ctx, dbuf, dlen, NULL, NULL, 0); | ||
|  | 		{ | ||
|  | 			VALPROP(byteLen, ab, "byteLength") | ||
|  | 			uint32_t byteLength; JS_ToUint32(ctx, &byteLength, byteLen); | ||
|  | 			FREE(byteLen) | ||
|  | 			printf("Size: %d\n", byteLength); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		/* call XLSX.read(ab) */ | ||
|  | 		{ | ||
|  | 			VALPROP(XLSX_read, XLSX, "read"); | ||
|  | 			JSValue args[] = { ab }; | ||
|  | 			wb = JS_Call(ctx, XLSX_read, XLSX, 1, args); | ||
|  | 			FREE(XLSX_read) | ||
|  | 		} | ||
|  | 
 | ||
|  | 		/* cleanup */ | ||
|  | 		FREE(ab) | ||
|  | 		free(dbuf); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/* print CSV of first worksheet */ | ||
|  | 	{ | ||
|  | 		/* get first worksheet */ | ||
|  | 		JSValue ws; | ||
|  | 		{ | ||
|  | 			/* get name of first sheet */ | ||
|  | 			const char *wsname; | ||
|  | 			{ | ||
|  | 				JSValue SheetNames = JS_GetPropertyStr(ctx, wb, "SheetNames"); | ||
|  | 				JSValue Sheet1 = JS_GetPropertyStr(ctx, SheetNames, "0"); | ||
|  | 				size_t wslen; wsname = JS_ToCStringLen(ctx, &wslen, Sheet1); | ||
|  | 				FREE(Sheet1) | ||
|  | 				FREE(SheetNames) | ||
|  | 			} | ||
|  | 			printf("Worksheet Name: %s\n", wsname); | ||
|  | 
 | ||
|  | 			/* get worksheet object */ | ||
|  | 			{ | ||
|  | 				VALPROP(Sheets, wb, "Sheets"); | ||
|  | 				ws = JS_GetPropertyStr(ctx, Sheets, wsname); | ||
|  | 				FREE(Sheets) | ||
|  | 			} | ||
|  | 		} | ||
|  | 
 | ||
|  | 		/* print CSV */ | ||
|  | 		{ | ||
|  | 			VALPROP(utils, XLSX, "utils") | ||
|  | 			VALPROP(sheet_to_csv, utils, "sheet_to_csv") | ||
|  | 			JSValue args[] = { ws }; | ||
|  | 			JSValue csv = JS_Call(ctx, sheet_to_csv, utils, 1, args); | ||
|  | 			FREE(sheet_to_csv) | ||
|  | 			FREE(utils) | ||
|  | 			size_t csvlen; const char *csvstr = JS_ToCStringLen(ctx, &csvlen, csv); | ||
|  | 			printf("%s\n", csvstr); | ||
|  | 			FREE(csv) | ||
|  | 		} | ||
|  | 
 | ||
|  | 		FREE(ws) | ||
|  | 	} | ||
|  | 
 | ||
|  | 	FREE(wb) | ||
|  | 	FREE(XLSX) | ||
|  | 	CLEANUP(0) | ||
|  | } |