forked from sheetjs/docs.sheetjs.com
		
	
		
			
	
	
		
			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)
							 | 
						||
| 
								 | 
							
								}
							 |