From de6ed7b3164cccb450e9af2a941a6909fbc53a20 Mon Sep 17 00:00:00 2001 From: Haifeng Luo Date: Sat, 16 Apr 2022 19:48:48 +0800 Subject: [PATCH] Can download wordset vectors. --- web/package.json | 4 +- web/src/Setting.js | 54 +++++++++++++++++++ web/src/VectorTable.js | 5 ++ web/src/WordsetEditPage.js | 1 + web/src/WordsetListPage.js | 1 + web/src/locales/en/data.json | 1 + web/src/locales/zh/data.json | 1 + web/yarn.lock | 102 +++++++++++++++++++++++++++++++++++ 8 files changed, 168 insertions(+), 1 deletion(-) diff --git a/web/package.json b/web/package.json index a4a91a1..5f195ea 100644 --- a/web/package.json +++ b/web/package.json @@ -10,6 +10,7 @@ "copy-to-clipboard": "^3.3.1", "craco-less": "1.17.1", "d3-force": "^3.0.0", + "file-saver": "^2.0.2", "i18next": "^19.8.9", "moment": "^2.29.1", "react": "17.0.2", @@ -19,7 +20,8 @@ "react-force-graph-3d": "^1.21.10", "react-i18next": "^11.8.7", "react-router-dom": "5.1.2", - "react-scripts": "4.0.3" + "react-scripts": "4.0.3", + "xlsx": "^0.16.9" }, "scripts": { "start": "set PORT=13001 && craco start", diff --git a/web/src/Setting.js b/web/src/Setting.js index 067b9bb..3f20f25 100644 --- a/web/src/Setting.js +++ b/web/src/Setting.js @@ -3,6 +3,8 @@ import {isMobile as isMobileDevice} from "react-device-detect"; import i18next from "i18next"; import moment from "moment"; import Sdk from "casdoor-js-sdk"; +import FileSaver from "file-saver"; +import XLSX from "xlsx"; export let ServerUrl = ''; export let CasdoorSdk; @@ -257,3 +259,55 @@ export function getPercentage(f) { return (100 * f).toFixed(1); } + +function s2ab(s) { + const buf = new ArrayBuffer(s.length); + const view = new Uint8Array(buf); + for (let i = 0; i !== s.length; i ++) { + view[i] = s.charCodeAt(i) & 0xFF; + } + return buf; +} + +export function sheet2blob(sheet, sheetName) { + const workbook = { + SheetNames: [sheetName], + Sheets: {}, + }; + workbook.Sheets[sheetName] = sheet; + return workbook2blob(workbook); +} + +export function workbook2blob(workbook) { + const wopts = { + bookType: "xlsx", + bookSST: false, + type: "binary", + }; + const wbout = XLSX.write(workbook, wopts); + return new Blob([s2ab(wbout)], {type: "application/octet-stream"}); +} + +export function downloadXlsx(wordset) { + let data = []; + wordset.vectors.forEach((vector, i) => { + let row = {}; + + row[0] = vector.name; + vector.data.forEach((dataItem, i) => { + row[i + 1] = dataItem; + }); + + data.push(row); + }); + + let sheet = XLSX.utils.json_to_sheet(data, {skipHeader: true}); + // sheet["!cols"] = [ + // { wch: 18 }, + // { wch: 7 }, + // ]; + + const blob = sheet2blob(sheet, "vectors"); + const fileName = `vectors-${wordset.name}.xlsx`; + FileSaver.saveAs(blob, fileName); +} \ No newline at end of file diff --git a/web/src/VectorTable.js b/web/src/VectorTable.js index 91b3200..8cb907b 100644 --- a/web/src/VectorTable.js +++ b/web/src/VectorTable.js @@ -124,6 +124,11 @@ class VectorTable extends React.Component {
{this.props.title}     + { + this.props.wordset === undefined ? null : ( + + ) + }
)} /> diff --git a/web/src/WordsetEditPage.js b/web/src/WordsetEditPage.js index b8f2da4..93abb20 100644 --- a/web/src/WordsetEditPage.js +++ b/web/src/WordsetEditPage.js @@ -149,6 +149,7 @@ class WordsetEditPage extends React.Component { { this.updateWordsetField('vectors', value)}} /> diff --git a/web/src/WordsetListPage.js b/web/src/WordsetListPage.js index 7670dbf..2c01929 100644 --- a/web/src/WordsetListPage.js +++ b/web/src/WordsetListPage.js @@ -163,6 +163,7 @@ class WordsetListPage extends React.Component { return (
+