在后端使用 excel4node 在前端下载 excel 文件
Downloading excel file on the frontend using excel4node in the backend
我知道之前有人问过这个问题,但我无法让它工作。后端使用 wb.write('filename.xlsx', res)
发送文件,但在前端,我只得到一个对象响应。如何让浏览器改为下载 .xlsx 文件?
// express backend
const x1 = require('excel4node');
router.get('/excel', async (req, res) => {
const wb = new x1.Workbook();
// do some stuff
wb.write('excel.xlsx', res);
});
// frontend
axis(config).then((res) => {
// What do I do here? res is an object. How do I handle this response so that the browser is downloading the file instead?
}).catch(...);
尝试使用 blob 响应类型
axios.request({url,method,responseType: 'blob'})
.then(({ data }) => {
const downloadUrl = window.URL.createObjectURL(new Blob([data]));
回答 front-end 方,
你可以这样写axios代码:
axios.get('URL TO GET FILE BLOB', {
responseType: 'blob'
}).then(response => {
let headerLine = response.headers['content-disposition'];
let startFileNameIndex = headerLine.indexOf('"') + 1
let endFileNameIndex = headerLine.lastIndexOf('"')
let filename = headerLine.substring(startFileNameIndex, endFileNameIndex)
const url = window.URL.createObjectURL(new Blob([response.data],
{type:'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}));
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', filename);
document.body.appendChild(link);
link.click();
link.remove();
}).catch(error => {
console.log(error)
})
后端:
您需要确保正确配置了 CORS,供您参考,请检查下面的代码。
const express = require('express');
const xl = require('excel4node');
const cors = require('cors') //use this
const app = express();
app.use(cors({exposedHeaders: '*'})) //and this
const PORT = process.env.PORT || 3001;
app.get('/', (req, res) => {
var wb = new xl.Workbook();
// Add Worksheets to the workbook
var ws = wb.addWorksheet('Sheet 1');
var ws2 = wb.addWorksheet('Sheet 2');
// Create a reusable style
var style = wb.createStyle({
font: {
color: '#FF0800',
size: 12,
},
numberFormat: '$#,##0.00; ($#,##0.00); -',
});
// Set value of cell A1 to 100 as a number type styled with
ws.cell(1, 1)
.number(100)
.style(style);
// Set value of cell B1 to 200 as a number type styled with
paramaters of style
ws.cell(1, 2)
.number(200)
.style(style);
// Set value of cell C1 to a formula styled with paramaters of style
ws.cell(1, 3)
.formula('A1 + B1')
.style(style);
// Set value of cell A2 to 'string' styled with paramaters of style
ws.cell(2, 1)
.string('string')
.style(style);
// Set value of cell A3 to true as a boolean type styled with paramaters of style but with an adjustment to the font size.
ws.cell(3, 1)
.bool(true)
.style(style)
.style({font: {size: 14}});
wb.write('Excel.xlsx', res);
});
app.listen(PORT, () => console.log(`Server is listening on port ${PORT}`));
在front-end端,我们可以从内容配置中提取文件名和扩展名header。
这与我们设置的名称相同
wb.write('Excel.xlsx', res);
我知道之前有人问过这个问题,但我无法让它工作。后端使用 wb.write('filename.xlsx', res)
发送文件,但在前端,我只得到一个对象响应。如何让浏览器改为下载 .xlsx 文件?
// express backend
const x1 = require('excel4node');
router.get('/excel', async (req, res) => {
const wb = new x1.Workbook();
// do some stuff
wb.write('excel.xlsx', res);
});
// frontend
axis(config).then((res) => {
// What do I do here? res is an object. How do I handle this response so that the browser is downloading the file instead?
}).catch(...);
尝试使用 blob 响应类型
axios.request({url,method,responseType: 'blob'})
.then(({ data }) => {
const downloadUrl = window.URL.createObjectURL(new Blob([data]));
回答 front-end 方,
你可以这样写axios代码:
axios.get('URL TO GET FILE BLOB', {
responseType: 'blob'
}).then(response => {
let headerLine = response.headers['content-disposition'];
let startFileNameIndex = headerLine.indexOf('"') + 1
let endFileNameIndex = headerLine.lastIndexOf('"')
let filename = headerLine.substring(startFileNameIndex, endFileNameIndex)
const url = window.URL.createObjectURL(new Blob([response.data],
{type:'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}));
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', filename);
document.body.appendChild(link);
link.click();
link.remove();
}).catch(error => {
console.log(error)
})
后端:
您需要确保正确配置了 CORS,供您参考,请检查下面的代码。
const express = require('express');
const xl = require('excel4node');
const cors = require('cors') //use this
const app = express();
app.use(cors({exposedHeaders: '*'})) //and this
const PORT = process.env.PORT || 3001;
app.get('/', (req, res) => {
var wb = new xl.Workbook();
// Add Worksheets to the workbook
var ws = wb.addWorksheet('Sheet 1');
var ws2 = wb.addWorksheet('Sheet 2');
// Create a reusable style
var style = wb.createStyle({
font: {
color: '#FF0800',
size: 12,
},
numberFormat: '$#,##0.00; ($#,##0.00); -',
});
// Set value of cell A1 to 100 as a number type styled with
ws.cell(1, 1)
.number(100)
.style(style);
// Set value of cell B1 to 200 as a number type styled with
paramaters of style
ws.cell(1, 2)
.number(200)
.style(style);
// Set value of cell C1 to a formula styled with paramaters of style
ws.cell(1, 3)
.formula('A1 + B1')
.style(style);
// Set value of cell A2 to 'string' styled with paramaters of style
ws.cell(2, 1)
.string('string')
.style(style);
// Set value of cell A3 to true as a boolean type styled with paramaters of style but with an adjustment to the font size.
ws.cell(3, 1)
.bool(true)
.style(style)
.style({font: {size: 14}});
wb.write('Excel.xlsx', res);
});
app.listen(PORT, () => console.log(`Server is listening on port ${PORT}`));
在front-end端,我们可以从内容配置中提取文件名和扩展名header。
这与我们设置的名称相同
wb.write('Excel.xlsx', res);