【问题标题】:How to convert blob to xlsx or csv?如何将 blob 转换为 xlsx 或 csv?
【发布时间】:2019-11-03 02:01:09
【问题描述】:

具有文件下载选项的应用程序前端(可以采用以下格式:xlsx、csv、dat)。 为此,我使用fileSaver.js

对于.dat/.csv 格式,一切正常,但对于.xlsx,它不起作用,文件已损坏。

我用以下格式测试了转换:

  • utf8
  • base64
  • binary

我是这样做的:

// /* BACK */ //
// data is 
fs.readFile(filePath, (err, data) {...})

// the api give this answer the important part is "filename" & "data"
{"status":"ok","context":"writing the intermediate file","target":"/temp/","fileName":"name.xlsx","data":{"type":"Buffer","data":[72,82,65,67,67,69,83,83,32,10]}}
// /* FRONT */ //
let json = JSON.stringify(data)
let buffer = Buffer.from(JSON.parse(json).data)
let read = buffer.toString('utf8')
let blob = new Blob([read])
FileSaver.saveAs(blob, fileName)

【问题讨论】:

    标签: javascript csv dataset blob xlsx


    【解决方案1】:

    @哈多克 如果你想下载带有 .csv 扩展名的文件,那么你需要传递文件类型,如

    let blob = new Blob([csv], { type: 'application/vnd.ms-excel' });
    

    而不是

    let blob = new Blob([read])
    

    别忘了发送带有扩展名的文件名 (test.csv)。

    对于 excel 文件,我使用了不同的插件 exceljs demo.

    【讨论】:

    • 对 .csv 有好处,但对 .xlsx 不适用。我在我的帖子中添加了一些细节,比如我的后端发送的 JSON。我阅读了您的示例,但我不明白应该如何将数据存储在文件中。
    • @Hadock 创建一个plunker,我帮你生成excel文件。
    【解决方案2】:

    您不能将 json 数据直接保存到 .xlsx 文件中,您可以使用 'sheetjs' 之类的库将 json 数据转换为 excel 格式 (https://sheetjs.com/)

    var ws_name = filename;//"SheetJS";
    var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);
    /* add worksheet to workbook */
    wb.SheetNames.push(ws_name);
    wb.Sheets[ws_name] = ws;
    var wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: true, type: 'binary' });
    saveAs(new Blob([s2ab(wbout)], { type: "application/octet-stream" }), filename + ".xlsx")
    

    【讨论】:

    • 为什么是 sheet_from_array_of_arrayss2ab 我无法导入它们,我在 sheetjs 文档中看不到它们
    • 好的,正确的路径是XLSX.utils.sheet_add_aoa(data)XLSX.utils.s2ab(wbout)。反正我的数据不是aoa 是缓冲区[72,82,65,67,67,69,83,83,32,10]
    【解决方案3】:

    好的,对于任何通过此主题的人,我的解决方案:

    (请记住真正更好的 dl 文件解决方案:在 api 响应中发送带有标题“Content-disposition”的文件或使用 express 来处理 like this

    后面(节点)是这样工作的:

     fs.readFile(filePath, (err, data) => {
        if (err) {
          console.log(`-------- oups error - read --------`)
          console.log(err)
          res.send({ status: `erreur`, context: `read the source file`, id: err.errno, code: err.code, message: err.message.replace(/\\/g, '/') })
        } else {
          res.send({ status: `ok`, context: `send data file`, target: target, fileName: fileName, data: data })
        } 
      })
    

    这里:

    • target 是前面的路径,带有文件名和他的 扩展名 (/path/name.ext)
    • fileName 就是名称和扩展名 (name.ext)
    • data是readFile发送的数据({"type":"Buffer","data":[72,82,65,67,67,69,83,83,32,10]})

    前端(React)是这样工作的:

    fetch(targetUrl)
        .then(res => res.json())
        .then(res => {
          if (res.status !== `ok`) {
            this.setState({
              errorDlFile: true,
              errorDlFile_context: res.context,
              errorDlFile_id: res.id,
              errorDlFile_code: res.code,
              errorDlFile_message: res.message
            })
          } else {  
            const target = res.target
            const fileName = res.fileName
            const data = res.data
            const splitName = res.fileName.split('.')
            const format = splitName[splitName.length-1]
    
            // file saver blob solution
            let json = JSON.stringify(data)
            let buffer = Buffer.from(JSON.parse(json).data)
            let readUTF8 = buffer.toString('utf8')
            let blob = ''
    
            if (format === 'xlsx') {
              blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })
            } else if (format === 'csv') {
              blob = new Blob([readUTF8], { type: 'application/vnd.ms-excel' })
            } else {
              blob = new Blob([readUTF8])
            }
    
            FileSaver.saveAs(blob, fileName)
    
          }
        })
    

    【讨论】:

    • “csv”的字符集内容类型是text/csv
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 2013-07-01
    相关资源
    最近更新 更多