使用spreadJS excel時蜀变,壓縮ssjson并使用ajax上傳及下載

背景

由于spreadJS生成的ssjson是json格式沟堡,導(dǎo)致相比excel格式會大出很多厚满,所以需要在前后臺交互時做下壓縮朋贬。

參考大小
.xlsx文件 導(dǎo)入spreadJS再導(dǎo)出的.xlsx文件 ssjson 壓縮的ssjson
2.3MB 1.8MB 24.1MB 640KB

注意點(diǎn)

  1. 提交數(shù)據(jù)時的contentType朴恳,F(xiàn)ormData需要將部分?jǐn)?shù)據(jù)放入該值们陆,所以指定為false
  2. XHR獲取二進(jìn)制數(shù)據(jù)只能使用異步模式,不能使用同步模式粥血,即async必須設(shè)置為true(默認(rèn)即為true)
  3. 目前jquery并不直接支持獲取二進(jìn)制數(shù)據(jù)柏锄,這里使用了jquery-ajax-native.js,當(dāng)然這并不是必須的复亏,你也可以使用原生XHR趾娃,方法參考底部鏈接

代碼

pako.min.js
jquery-ajax-native.js

<script src="assets/libs/compress/zlib/pako.min.js"></script>
<script src="assets/libs/jquery/jquery-ajax-native.js"></script>
function saveExcelData(spread, sheet) {
    const requestPayload = new FormData();
    requestPayload.append('displayTitleName', $('input[name=titleName]:first').val());
    requestPayload.append('excelData', JSON.stringify(sheet.getDatasource()));
    {
        let fullExcelSSJson = JSON.stringify(spread.toJSON({
            includeBindingSource: true
        }));
        // 壓縮ssJson
        let bytes = pako.deflate(new TextEncoder().encode(fullExcelSSJson));
        requestPayload.append('compressSSJson', new Blob([bytes], {type: 'application/octet-stream'}));
    }
    return $.ajax({
        url: '/saveExcelData',
        method: 'POST',
        contentType: false,
        processData: false,
        data: requestPayload,
        async: false
    });
}
function loadCompressSSJson(spread) {
    $.ajax({
        url: '/loadCompressExcelSSJson',
        method: 'GET',
        async: true, // 二進(jìn)制加載不能同步請求
        dataType: 'native',
        xhrFields: {
            responseType: 'arraybuffer'
        },
        data: {
            batchID: excelDataBatchID
        }
    }, function (data) {
        spread.fromJSON(JSON.parse(new TextDecoder().decode(pako.inflate(new Uint8Array(data)))));
    });
}
@Data
public class ExcelBatchHistory {
    private byte[] compressSsJson;
}

@RestController
@RequestMapping(value = "/")
public class IndexController {
    @PostMapping(value = "/saveExcelData")
    public String saveExcelData(@RequestParam("displayTitleName") String displayTitleName,
                                @RequestParam("excelData") String excelDataRequestJson,
                                @RequestParam("compressSSJson") MultipartFile compressSSJson) throws IOException {
        byte[] compressSSJsonByte = compressSSJson.getBytes();

        MyModel m = new MyModel();
        m.setId(111L);
        m.setCompressSsJson(compressSSJsonByte);

        baseMapper.insert(m);

        return "{}";
    }

    @GetMapping(value = "/loadCompressExcelSSJson", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
    public byte[] loadCompressExcelSSJson() throws IOException, IntrospectionException {
        MyModel m = baseMapper.selectById(111L);
        return m.getCompressSsJson();
    }
}
create table excel_batch_history
(
    compress_ss_json mediumblob null comment '壓縮過的ssJson數(shù)據(jù)',
    create_date      datetime   not null,
    history_id       bigint auto_increment
        primary key
);

相關(guān)鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蜓耻,隨后出現(xiàn)的幾起案子茫舶,更是在濱河造成了極大的恐慌,老刑警劉巖刹淌,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饶氏,死亡現(xiàn)場離奇詭異,居然都是意外死亡有勾,警方通過查閱死者的電腦和手機(jī)疹启,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔼卡,“玉大人喊崖,你說我怎么就攤上這事」统眩” “怎么了荤懂?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長塘砸。 經(jīng)常有香客問我节仿,道長,這世上最難降的妖魔是什么掉蔬? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任廊宪,我火速辦了婚禮矾瘾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘箭启。我一直安慰自己壕翩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布傅寡。 她就那樣靜靜地躺著放妈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荐操。 梳的紋絲不亂的頭發(fā)上大猛,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機(jī)與錄音淀零,去河邊找鬼。 笑死膛壹,一個胖子當(dāng)著我的面吹牛驾中,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播模聋,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肩民,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了链方?” 一聲冷哼從身側(cè)響起持痰,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎祟蚀,沒想到半個月后工窍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡前酿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年患雏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罢维。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡淹仑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肺孵,到底是詐尸還是另有隱情匀借,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布平窘,位于F島的核電站吓肋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏初婆。R本人自食惡果不足惜蓬坡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一猿棉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧屑咳,春花似錦萨赁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至紫皇,卻和暖如春慰安,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背聪铺。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工化焕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铃剔。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓撒桨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親键兜。 傳聞我的和親對象是個殘疾皇子凤类,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容

  • @轉(zhuǎn)自GitHub 介紹js的基本數(shù)據(jù)類型。Undefined普气、Null谜疤、Boolean、Number现诀、Strin...
    YT_Zou閱讀 1,153評論 0 0
  • 前端開發(fā)面試題 面試題目: 根據(jù)你的等級和職位的變化夷磕,入門級到專家級,廣度和深度都會有所增加仔沿。 題目類型: 理論知...
    怡寶丶閱讀 2,580評論 0 7
  • FormData對象企锌,是可以使用一系列的鍵值對來模擬一個完整的表單,然后使用XMLHttpRequest發(fā)送這個"...
    Agreal閱讀 190,084評論 49 149
  • 前端開發(fā)面試題 <a name='preface'>前言</a> 只看問題點(diǎn)這里 看全部問題和答案點(diǎn)這里 本文由我...
    自you是敏感詞閱讀 760評論 0 3
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險厭惡者于未,不喜歡去冒險撕攒,但是人生放棄了冒險,也就放棄了無數(shù)的可能烘浦。 ...
    yichen大刀閱讀 6,046評論 0 4