forked from sheetjs/sheetjs
		
	
		
			
	
	
		
			41 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			41 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
							 | 
						||
| 
								 | 
							
								/* eslint-env node */
							 | 
						||
| 
								 | 
							
								// base64 sheetjs.xlsb | curl -F "data=@-;filename=test.xlsb" http://localhost:3000/LambdaProxy
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								var XLSX = require('xlsx');
							 | 
						||
| 
								 | 
							
								var Busboy = require('busboy');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								exports.handler = function(event, context, callback) {
							 | 
						||
| 
								 | 
							
									/* set up busboy */
							 | 
						||
| 
								 | 
							
									var ctype = event.headers['Content-Type']||event.headers['content-type'];
							 | 
						||
| 
								 | 
							
									var bb = new Busboy({headers:{'content-type':ctype}});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* busboy is evented; accumulate the fields and files manually */
							 | 
						||
| 
								 | 
							
									var fields = {}, files = {};
							 | 
						||
| 
								 | 
							
									bb.on('error', function(err) { console.log('err', err); callback(err); });
							 | 
						||
| 
								 | 
							
									bb.on('field', function(fieldname, val) {fields[fieldname] = val });
							 | 
						||
| 
								 | 
							
									bb.on('file', function(fieldname, file, filename) {
							 | 
						||
| 
								 | 
							
										/* concatenate the individual data buffers */
							 | 
						||
| 
								 | 
							
										var buffers = [];
							 | 
						||
| 
								 | 
							
										file.on('data', function(data) { buffers.push(data); });
							 | 
						||
| 
								 | 
							
										file.on('end', function() { files[fieldname] = [Buffer.concat(buffers), filename]; });
							 | 
						||
| 
								 | 
							
									});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* on the finish event, all of the fields and files are ready */
							 | 
						||
| 
								 | 
							
									bb.on('finish', function() {
							 | 
						||
| 
								 | 
							
										/* grab the first file */
							 | 
						||
| 
								 | 
							
										var f = files[Object.keys(files)[0]];
							 | 
						||
| 
								 | 
							
										if(!f) callback(new Error("Must submit a file for processing!"));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/* f[0] is a buffer, convert to string and interpret as Base64 */
							 | 
						||
| 
								 | 
							
										var wb = XLSX.read(f[0].toString(), {type:"base64"});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/* grab first worksheet and convert to CSV */
							 | 
						||
| 
								 | 
							
										var ws = wb.Sheets[wb.SheetNames[0]];
							 | 
						||
| 
								 | 
							
										callback(null, { body: XLSX.utils.sheet_to_csv(ws) });
							 | 
						||
| 
								 | 
							
									});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									bb.end(event.body);
							 | 
						||
| 
								 | 
							
								};
							 |