使用java和react关于EasyExcel导出图片的问题,文件打开提示已损坏

使用java和react关于EasyExcel导出图片的问题,文件打开提示已损坏


这是alibaba开放的一个导出工具,便捷好用,参考官方文档:
https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write#%E5%9B%BE%E7%89%87%E5%AF%BC%E5%87%BA

1.先说一下EasyExcel导出图片,这里主要说一下导出远程图片,其他的后面再补充
1.1 要导出的图片字段:

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.converters.url.UrlImageConverter;
import lombok.Data;

import java.net.URL;

@Data
@ContentRowHeight(40)
@ColumnWidth(25)
public class ExportExcel {
    @ExcelProperty(value = "Event Photo", converter = UrlImageConverter.class)
    private URL imagePath;
}

1.2 给字段赋值

try {
	ExportExcel exportExcel = new ExportExcel();
    exportExcel.setImagePath(new URL("https//....远程地址"));
} catch (MalformedURLException e) {
    e.printStackTrace();
}

1.3 写入数据

EasyExcel.write("test.xlsx", ExportExcel.class).sheet().doWrite(exportExcel);

2.后端返回乱码,文件下载后无法打开,提示已损坏
2.1 如果后端返回的是一堆乱码(blob),就需要前端修改一下文件下载的方法,参考链接:
http://t.csdnimg.cn/8s8GQ

import { request } from '@/utils/axios'
// 导出Excel公用方法
export function exportMethod(data: any) {
    return request({
        method: data.method,
        url: `${data.url}${data.params ? '?' + data.params : ''}`,
        responseType: 'blob',
        headers: {
            'Content-Type': 'application/json'
        }
    }).then((res) => {
        // console.log('明细导出')
        const link = document.createElement('a')
        let blob = new Blob([res.data], { type: 'application/vnd.ms-excel' })
        link.style.display = 'none'
        link.href = URL.createObjectURL(blob)
 
        // link.download = res.headers['content-disposition'] //下载后文件名
        link.download = data.fileName //下载的文件名
        document.body.appendChild(link)
        link.click()
        document.body.removeChild(link)
    }).catch(error => {
        console.log(error)
    })
}

2.2 此时文件可以正常下载了,但是用office或者wps打开时提示已损坏
解决:前端请求导出接口后,增加返回类型 responseType: ‘blob’
参考链接:http://t.csdnimg.cn/JeIpa
在这里插入图片描述

export const exportExcelData = async (payload) => {
  return api.securedAxios().get("/web/export", {
    params: payload, responseType: 'blob'
  });
};

如果有遇到类似的问题,欢迎留言关注

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React前端和Node.js后端之间使用WebSocket连接的方法如下: 1在Node.js服务器端安装websocket库: ```bash npm install websocket ``` 2.在Node.js服务器端创建WebSocket服务器: ```javascript const WebSocket = require('websocket').server; const http = require('http'); const server = http.createServer(function(request, response) { // 处理HTTP请求 }); server.listen(8080, function() { console.log((new Date()) + ' Server is listening on port 8080'); }); wsServer = new WebSocket({ httpServer: server }); // 处理WebSocket连接 wsServer.on('request', function(request) { const connection = request.accept(null, request.origin); console.log('WebSocket connection accepted.'); // 处理WebSocket消息 connection.on('message', function(message) { if (message.type === 'utf8') { console.log('Received Message: ' + message.utf8Data); connection.sendUTF('Hi this is WebSocket server!'); } }); // 处理WebSocket关闭 connection.on('close', function(reasonCode, description) { console.log('WebSocket connection closed.'); }); }); ``` 在此示例中,我们使用了Node.js的HTTP模块和WebSocket库。我们创建了一个HTTP服务器,并将WebSocket服务器绑定到该服务器上。当收到WebSocket连接请求时,我们将打印一条消息,当接收到WebSocket消息时,我们将回复一个消息。当WebSocket连接关闭时,我们将打印一条消息。 3.在React前端中使用WebSocket连接: ```javascript import React, { Component } from 'react'; import logo from './logo.svg'; import './App.css'; import WebSocket from 'websocket'; class App extends Component { constructor(props) { super(props); this.state = { message: '', ws: null }; } componentDidMount() { // 创建WebSocket连接 const ws = new WebSocket('ws://localhost:8080'); ws.onopen = () => { console.log('WebSocket Client Connected'); }; ws.onmessage = (message) => { console.log('Received:', message.data); this.setState({ message: message.data }); }; ws.onclose = () => { console.log('WebSocket closed'); }; this.setState({ ws }); } render() { return ( <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <h1 className="App-title">Welcome to React</h1> </header> <p className="App-intro"> {this.state.message} </p> </div> ); } } export default App; ``` 在React前端中,我们使用了WebSocket库来创建WebSocket连接。我们使用`componentDidMount`方法在组件挂载后创建WebSocket连接。当WebSocket连接打开时,我们将打印一条消息,当接收到WebSocket消息时,我们将更新组件状态以显示该消息。当WebSocket连接关闭时,我们将打印一条消息。 在React前端中,我们只需要提供WebSocket服务器的URL,即可建立WebSocket连接。在此示例中,我们将WebSocket服务器的URL设置为`ws://localhost:8080`,因为我们假设Node.js服务器运行在本地8080端口上。 以上是React前端和Node.js后端之间使用WebSocket连接的基本步骤,你可以根据自己的实际需求进行进一步的开发和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值