如何将 blob 转换为 xlsx 或 csv?
How to convert blob to xlsx or csv?
具有文件下载选项的应用程序前端(可以是以下格式: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)
@黑道克
如果您想下载扩展名为 .csv 的文件,则需要传递文件类型,例如
let blob = new Blob([csv], { type: 'application/vnd.ms-excel' });
而不是
let blob = new Blob([read])
并且不要忘记发送带有扩展名 (test.csv) 的文件名。
对于 excel 文件我使用了不同的插件 exceljs demo.
您无法将 json 数据直接保存到 .xlsx 文件,您可以使用 'sheetjs' (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")
好的,对于通过此主题的任何人,我的解决方案:
(请记住 dl 文件真正更好的解决方案:在 api 响应中发送文件 header 'Content-disposition' 或使用 express like this)
后台(Node)是这样工作的:
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)
}
})
具有文件下载选项的应用程序前端(可以是以下格式: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)
@黑道克 如果您想下载扩展名为 .csv 的文件,则需要传递文件类型,例如
let blob = new Blob([csv], { type: 'application/vnd.ms-excel' });
而不是
let blob = new Blob([read])
并且不要忘记发送带有扩展名 (test.csv) 的文件名。
对于 excel 文件我使用了不同的插件 exceljs demo.
您无法将 json 数据直接保存到 .xlsx 文件,您可以使用 'sheetjs' (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")
好的,对于通过此主题的任何人,我的解决方案:
(请记住 dl 文件真正更好的解决方案:在 api 响应中发送文件 header 'Content-disposition' 或使用 express like this)
后台(Node)是这样工作的:
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)
}
})