diff options
author | Jacob Schatz <jschatz1@gmail.com> | 2017-04-09 14:49:57 +0300 |
---|---|---|
committer | Jacob Schatz <jschatz1@gmail.com> | 2017-04-09 14:49:57 +0300 |
commit | a927f5e1b4d60aa597e64a2860efd85746d66f51 (patch) | |
tree | e5bc036352fcee4d9d25ed15e8d7036d4882fd12 /app | |
parent | 3d1cade13f61115b63bf6dbda5a1f194ba54b24b (diff) |
Get xlsx back as JSON
Diffstat (limited to 'app')
-rw-r--r-- | app/assets/javascripts/blob/xlsx/index.js | 68 | ||||
-rw-r--r-- | app/assets/javascripts/blob/xlsx_viewer.js | 5 | ||||
-rw-r--r-- | app/assets/stylesheets/framework/xlsx.scss | 0 | ||||
-rw-r--r-- | app/models/blob.rb | 6 | ||||
-rw-r--r-- | app/views/projects/blob/_xlsx.html.haml | 4 |
5 files changed, 83 insertions, 0 deletions
diff --git a/app/assets/javascripts/blob/xlsx/index.js b/app/assets/javascripts/blob/xlsx/index.js new file mode 100644 index 00000000000..fb823e639de --- /dev/null +++ b/app/assets/javascripts/blob/xlsx/index.js @@ -0,0 +1,68 @@ +import xlsx from 'xlsx' + +export default class XlsxViewer { + constructor(el) { + this.el = el; + this.loadXlsxFile(); + } + + loadXlsxFile() { + var self = this; + var url = this.el.dataset.endpoint; + var oReq = new XMLHttpRequest(); + oReq.open("GET", url, true); + oReq.responseType = "arraybuffer"; + + oReq.onload = function(e) { + var arraybuffer = oReq.response; + + /* convert data to binary string */ + var data = new Uint8Array(arraybuffer); + var arr = new Array(); + for(var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]); + var bstr = arr.join(""); + + /* Call XLSX */ + var workbook = xlsx.read(bstr, {type:"binary"}); + self.processWorkbook(workbook); + } + + oReq.send(); + } + + + getColumns(sheet, type) { + var val, rowObject, range, columnHeaders, emptyRow, C; + if(!sheet['!ref']) return []; + range = xlsx.utils.decode_range(sheet["!ref"]); + columnHeaders = []; + for (C = range.s.c; C <= range.e.c; ++C) { + val = sheet[xlsx.utils.encode_cell({c: C, r: range.s.r})]; + if(!val) continue; + columnHeaders[C] = val.v; + } + return columnHeaders; + } + + toJson(wb) { + var result = {}; + wb.SheetNames.forEach(function(sheetName) { + var roa = xlsx.utils.sheet_to_row_object_array(wb.Sheets[sheetName], {raw:true}); + if(roa.length > 0) result[sheetName] = roa; + }); + return result; + } + + chooseSheet(sheetidx) { + this.processWorkbook(last_wb, sheetidx); + } + + processWorkbook(wb, sheetidx) { + // opts.on.wb(wb, sheetidx); + var sheet = wb.SheetNames[sheetidx || 1]; + var json = this.toJson(wb)[sheet], cols = this.getColumns(wb.Sheets[sheet]); + // opts.on.sheet(json, cols, wb.SheetNames, chooseSheet); + console.log(sheet) + console.log(json) + } +}
\ No newline at end of file diff --git a/app/assets/javascripts/blob/xlsx_viewer.js b/app/assets/javascripts/blob/xlsx_viewer.js new file mode 100644 index 00000000000..69a72a9be7a --- /dev/null +++ b/app/assets/javascripts/blob/xlsx_viewer.js @@ -0,0 +1,5 @@ +import XlsxViewer from './xlsx'; + +document.addEventListener('DOMContentLoaded', () => { + new XlsxViewer(document.getElementById('js-xlsx-viewer')); +});
\ No newline at end of file diff --git a/app/assets/stylesheets/framework/xlsx.scss b/app/assets/stylesheets/framework/xlsx.scss new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/app/assets/stylesheets/framework/xlsx.scss diff --git a/app/models/blob.rb b/app/models/blob.rb index 801d3442803..49a87370c61 100644 --- a/app/models/blob.rb +++ b/app/models/blob.rb @@ -50,6 +50,10 @@ class Blob < SimpleDelegator name && File.extname(name) == '.pdf' end + def xlsx? + binary? && name && File.extname(name) == '.xlsx' + end + def ipython_notebook? text? && language&.name == 'Jupyter Notebook' end @@ -89,6 +93,8 @@ class Blob < SimpleDelegator 'stl' elsif text? 'text' + elsif xlsx? + 'xlsx' else 'download' end diff --git a/app/views/projects/blob/_xlsx.html.haml b/app/views/projects/blob/_xlsx.html.haml new file mode 100644 index 00000000000..b06a9abf6b4 --- /dev/null +++ b/app/views/projects/blob/_xlsx.html.haml @@ -0,0 +1,4 @@ +- content_for :page_specific_javascripts do + = page_specific_javascript_bundle_tag('xlsx_viewer') + +.file-content#js-xlsx-viewer{ data: { endpoint: namespace_project_raw_path(@project.namespace, @project, @id) } }
\ No newline at end of file |