【开发实践】网页预览excel表格原版样式

news2024/11/26 17:28:19

一、需求分析

由于业务部门需要,在导出excel表格页面,不需要先下载,就可以直接在页面上预览该表格文件。

二、代码实现

使用Luckysheet实现:

什么是Luckysheet
Luckysheet ,一款纯前端类似excel的在线表格,功能强大、配置简单、完全开源。

Luckysheet官网:Luckysheet官方在线文档

引入cdn:

<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/css/pluginsCss.css' />
<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/plugins.css' />
<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/css/luckysheet.css' />
<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/assets/iconfont/iconfont.css' />
<script src="https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/js/plugin.js"></script>
<script src="https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/luckysheet.umd.js"></script>

【前后端数据处理】:

 后端返回给前端的数据,需要时流数据:

 /**
     * 下载文件
     *
     * @param filePath 目标路径
     * @param response 响应请求
     */
    public static void downloadExcelFiles(String filePath, String fileName, HttpServletResponse response, boolean delete) {
        try {
            // 读到流中
            File file = new File(filePath);
            // 设置输出的格式
            //设置中文文件名称
            fileName = URLEncoder.encode(fileName, "UTF-8");
            //浏览器默认服务器传过去的是html,不是excel文件
            //设置响应类型:传输内容是流,并支持中文
            response.setContentType("application/octet-stream;charset=UTF-8");
            //设置响应头信息header,下载时以文件附件下载
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            // 循环取出流中的数据
            if (file.exists()) {
                InputStream inStream = new FileInputStream(filePath);
                byte[] b = new byte[100];
                int len;
                while ((len = inStream.read(b)) > 0) {
                    response.getOutputStream().write(b, 0, len);
                }
                inStream.close();
                if (delete) {
                    deleteDir(new File(filePath).getParentFile().getParentFile());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

前端请求:

axios({
                        method: "post",
                        url: url,
                        responseType:'arraybuffer', //告诉服务器想到的响应格式
                        headers: {}
                    }).then(res => {
                        that.getShowData(res)
                    }).catch(function (error) {
                        $.Notification.autoHideNotify('error', 'top right', '错误提示', '抱歉,服务器错误!');
                    })

        //方法
        getShowData(res) {
                const data = res.data
                var blob = new Blob([data], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'});
                // console.log("====blob====", blob)
                if (blob.size === 0) {
                    return alert("数据不存在!");
                }
                const file = new window.File(
                    [blob], // blob
                    'Filename.xlsx',
                    {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}
                );
                // console.log("====file====", file)
                this.loadExcel(file)
                $('#full-width-modal').modal('show');
            },

        //加载方法
        loadExcel(files) {
                LuckyExcel.transformExcelToLucky(files, function (exportJson, luckysheetfile) {
                    // console.log("transformExcelToLucky", files, exportJson)
                    if (exportJson.sheets === null || exportJson.sheets.length === 0) {
                        alert("读取excel文件内容失败,目前不支持xls文件!");
                        return;
                    }
                    window.luckysheet.destroy();
                    window.luckysheet.create({
                        container: 'luckysheet', //luckysheet is the container id
                        showinfobar: false,
                        data: exportJson.sheets,
                        title: exportJson.info.name,
                        userInfo: exportJson.info.name.creator,
                        lang: 'zh', // 设定表格语言
                        showinfobar: false,//是否显示顶部信息栏
                        showtoolbar: false,//是否显示工具栏
                        // showsheetbar: false,//是否显示底部sheet页按钮
                        enableAddRow: false,//允许添加行
                        // 自定义配置底部sheet页按钮
                        showsheetbarConfig: {
                            add: false,
                            menu: false,
                        },
                        //自定义底部sheet页右击菜单
                        sheetRightClickConfig: {
                            delete: false, // 删除
                            copy: false, // 复制
                            rename: false, //重命名
                            color: false, //更改颜色
                            hide: false, //隐藏,取消隐藏
                            move: false, //向左移,向右移
                        },
                        //自定义单元格右键菜单
                        cellRightClickConfig: {
                            copy: false, // 复制
                            copyAs: false, // 复制为
                            paste: false, // 粘贴
                            insertRow: false, // 插入行
                            insertColumn: false, // 插入列
                            deleteRow: false, // 删除选中行
                            deleteColumn: false, // 删除选中列
                            deleteCell: false, // 删除单元格
                            hideRow: false, // 隐藏选中行和显示选中行
                            hideColumn: false, // 隐藏选中列和显示选中列
                            rowHeight: false, // 行高
                            columnWidth: false, // 列宽
                            clear: false, // 清除内容
                            matrix: false, // 矩阵操作选区
                            sort: false, // 排序选区
                            filter: false, // 筛选选区
                            chart: false, // 图表生成
                            image: false, // 插入图片
                            link: false, // 插入链接
                            data: false, // 数据验证
                            cellFormat: false // 设置单元格格式
                        }
                    });
                });
            },

【效果图】


 如果文章对您有帮助的话,点赞支持一下吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1264801.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

求和(打表题)

题目 打个表发现当 n 时答案为 p &#xff0c;否则为 1 &#xff0c;然后套板子。 #include <iostream> #include <algorithm> #include <vector> #include <cstring> #include <cmath>using namespace std;#define int long long using i64 …

西南科技大学数字电子技术实验二(SSI逻辑器件设计组合逻辑电路及FPGA实现 )预习报告

一、计算/设计过程 说明:本实验是验证性实验,计算预测验证结果。是设计性实验一定要从系统指标计算出元件参数过程,越详细越好。用公式输入法完成相关公式内容,不得贴手写图片。(注意:从抽象公式直接得出结果,不得分,页数可根据内容调整) 1、1位半加器 真值表: 逻…

虚幻学习笔记6—摄像机控制

一、前言 摄像机在虚幻中的应用是最常见的。如通常在游戏或应用中会常常出现需要切换不同视角的情况、摄像机拉近缩小等&#xff0c;这个在虚幻中是怎么实现的呢。 二、实现视点切换 2.1、提前设置场景的视点&#xff1a;如图2.1.1所示添加一个摄像机视点到关卡场景中&#x…

2.ORB-SLAM3中如何从二进制文件中加载多地图、关键帧、地图点等数据结构

目录 1 为什么保存&加载(视觉)地图 1.1 加载多地图的主函数 1.2 加载各个地图 Atlas::PostLoad 1.3 加载关键帧及地图点Map::PostLoad 1.4 恢复地图点信息 MapPoint::PostLoad 1.5 恢复关键帧信息KeyFrame::PostLoad 1 为什么保存&加载(视觉)地图 因为我们要去做导…

kali linux nmap 端口扫描 简单教程

本次实验所用工具如下&#xff1a; VMwarekali linux (namp扫描工具)Windows sever 2016 需开启&#xff08;FTP&#xff0c;smp&#xff0c;Telnet&#xff0c;rdp&#xff09;端口namp操作所用部分代码&#xff1a; -sP ping 扫描 -P 指定端口范围 -sV 服务版本探测 -A …

【DevOps】SonarQube 指标解读

SonarQube 指标解读 1.BUG 评级计算方法&#xff08;可靠性&#xff09;2.漏洞评级计算方法&#xff08;安全性&#xff09;3.债务和坏味道4.覆盖率4.1 代码覆盖率4.2 分支覆盖率4.3 单元测试覆盖率 5.重复 1.BUG 评级计算方法&#xff08;可靠性&#xff09; ✅ A&#xff1a…

玻色量子对外合作

2023年 2023.7 首个央企量子云计算项目&#xff0c;中标&#xff01; 2023.6 勇闯“量子电力”新领域&#xff0c;玻色量子与清大科越达成战略合作 2023.5 玻色量子签约移动云“五岳”量子云计算创新加速计划&#xff01; 2023.3 “量子计算通信”&#xff01;玻色量子与…

JAVA文件IO, File类, 字符流,字节流

文章目录 文件IO1. File2. IO流2.1 字符流2.1.1 Reader2.1.2 Writer 2.2 字节流2.2.1 InputStream2.2.2 FileInputStream2.2.3 利用Scanner进行字符读取2.2.4 OutputStream 文件IO I: Input, 从硬盘往内存读数据 O: Output, 从内存往硬盘输出数据 1. File Java 中通过 java…

Android控件全解手册 - 任意View缩放平移工具-实现思路和讲解

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

御云出海记|巴西市场,数字化转型与地区增长的新篇章

在11月的阳光下&#xff0c;巴西圣保罗的热情与活力成为了南半球市场的缩影&#xff0c;尤其是在华为云巴西峰会上。 云峰会亮点 11月22日&#xff0c;圣保罗举办的华为云巴西峰会成为了当地科技界的焦点。此次峰会聚集了数百位政府官员、行业领袖、专家学者&#xff0c;共同讨…

C++基础 -10- 类

类的格式 public:公共成员 类外可访问 protected:保护成员 类外不可访问 private:私有成员 类外不可访问 class base {public:int a;protected:int b;private:int c;};

Linux处理系统常见命令

目录 1 sudo 1.1 介绍 1.2 配合 2 ifconfig与ping 2.1 ifconfig 2.2 ping 3 kill 4 apt-get 4.1 介绍 4.2 配合 5 history 6 clear 7 env 1 sudo 1.1 介绍 给这条命令最高权限&#xff0c;比如 sudo cp something.txt /usr/bin/something.txt 1…

用C++和python混合编写数据采集程序?

之前看过一篇文章&#xff0c;主要阐述的就是多种语言混合编写爬虫程序&#xff0c;结合各种语言自身优势写一个爬虫代码是否行得通&#xff1f;觉得挺有意思的&#xff0c;带着这样的问题&#xff0c;我尝试着利用我毕生所学写了一段C和python混合爬虫程序&#xff0c;目前运行…

echarts点击事件

有这么个需求要点击叶片的时候跳转页面 代码&#xff1a;点击之后 报错了 解决办法 1、使用箭头函数&#xff08;箭头函数没有自己的 this&#xff0c;所以在箭头函数中使用 this 时&#xff0c;其指向与外层作用域相同。&#xff09;或者使用闭包来解决上下文的问题。 2、使…

Java抽象类:类的幕后黑手,提供继承和扩展的框架。

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、抽象类的概念二、注意事项三、抽象类的作用 一、抽象类的概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘…

【JavaSE学习专栏】第02篇 流程控制

文章目录 1 用户交互Scanner2 顺序结构3 选择结构3.1 if单选择结构3.1.1 语法结构3.1.2 案例 3.2 if双选择结构3.2.1 语法结构3.2.2 案例 3.3 if多选择结构3.3.1 语法结构3.3.2 案例 3.4 嵌套的if结构3.4.1 语法结构3.4.2 案例 3.5 switch多选择结构3.5.1 语法结构3.5.2 案例 4…

Opencv | 直方图均衡化

import cv2 #opencv 读取的格式是BGR import numpy as np import matplotlib.pyplot as plt #Matplotlib是RGB %matplotlib inline def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows() cv2.calcHist(images,channels,mask,histSize,ranges) - …

PAT-10道题

PAT算法刷题 1002 1002 一&#xff1a;对于每一的1到6都进行枚举&#xff0c;进行递归操作 二&#xff1a;如果位数到了指定的n的时候&#xff0c;递归的条件&#xff0c;进行判断是否可以整除操作 #include<iostream> #include<algorithm> using namespace std; l…

Programming Abstractions in C阅读笔记:p202-p234

《Programming Abstractions in C》学习第65天&#xff0c;p202-p234总结。 一、技术总结 完成第五章学习&#xff0c;第五章介绍递归在实际问题中的进一步应用&#xff0c;例如汉诺塔问题&#xff0c;数学中的排列问题&#xff0c;更有难度。使用递归解决问题时有时候需要借…

Element-ui合并table表格列方法

merageCell({ row, column, rowIndex, columnIndex }) {if (columnIndex 0 || columnIndex 1) {const property columnIndex 0 ? name : firstDeptName;// 获取当前行的property&#xff0c;这里看自己的需要&#xff0c;改成根据哪个去判断const currentPropertyVal row…