将excel文件内容存储到数据库,并可以实时在前端查看(不必生成文件)

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载 本文主要讲前端内容,后端涉及较少,可以认为是使用Java。 首先是excel文件上传,这个较为简单,可以html5的数据接口FormData()进行操作。

版权声明:本文为博主原创文章,未经博主允许不得转载

本文主要讲前端内容,后端涉及较少,可以认为是使用Java。

首先是excel文件上传,这个较为简单,可以html5的数据接口FormData()进行操作。具体代码如下:

<!DOCTYPE html>
<html>
    <head>
    </head>
    <body>
        <input type="file" id="_file" value=""/><p for="file">或点此选择文件</p>    
<button id = "file_button" >按钮</button> </body> </html>

然后是对应的javascript

$("#button").click(function(){
  var files = $('#_file').prop('files');
  var data = new FormData();
  data.append("upload",files[0]); //因为是只选择一个文件,故而只取file[0]
  $.ajax({
    url: yourPath,
    type: 'POST',
    data: data, 
    cache: false,
    dataType:'text',
    processData: false,
    contentType: false,
    success: function(result) {
                // Do something with the result
        alert("成功");
    },
    error : function(result){
        alert("失败"+result.toString());
    }
  });

});

后端接收到文件之后,将其存储成二进制数组,在数据库中,比如postgresql,使用blob数据类型,然后在java中使用byte数组映射就可以了。

那么怎么从后端存储的文件内容直接在页面上excel呢?这里需要用到sheetJs,官网:http://sheetjs.com/,可以直接取其demo来用,

demo下载地址放在github上了:https://github.com/SheetJS/SheetJS.github.io。 

在这里是直接使用它的一些代码,主要说说思路。

下载后解压是SheetJS.github.io-master文件夹,在而显示生成excel的Js代码主要在SheetJS.github.io-master\assets\js\dropsheet.js中。其中发下其最后是通过调用该文件中以下代码

function handleDrop(e) {
        e.stopPropagation();
        e.preventDefault();
        if(pending) return opts.errors.pending();
        var files = e.dataTransfer.files;
        var i,f;
        for (i = 0, f = files[i]; i != files.length; ++i) {
            var reader = new FileReader();
            var name = f.name;
            reader.onload = function(e) {
                var data = e.target.result;
                var wb, arr;
                var readtype = {type: rABS ? 'binary' : 'base64' };
                if(!rABS) {
                    arr = fixdata(data);
                    data = btoa(arr);
                }
                function doit() {
                    try {
                        if(useworker) { sheetjsw(data, process_wb, readtype); return; }
                        wb = XLSX.read(data, readtype);
                        process_wb(wb);
                    } catch(e) { console.log(e); opts.errors.failed(e); }
                }

                if(e.target.result.length > 1e6) opts.errors.large(e.target.result.length, function(e) { if(e) doit(); });
                else { doit(); }
            };
            if(rABS) reader.readAsBinaryString(f);
            else reader.readAsArrayBuffer(f);
        }
    }

说明:SheetJs这个demo中,解析excel使用的是js-xlsx这个库,这个库对excel的操作很多,解析只是一个方面,具体可以上github上看。而根据解析在html上绘制excel表格的是canvas-datagrid.js这个表格控件。

可以看到它是通过FileReader的readAsBinaryString方法读取每个选中的文件,根据文件内容在html中绘制出excel表格,那么我们只要在这里自己从后端接收那个二进制数据,生成一个File对象,再跑同样这段代码就OK。

这个过程中碰到两个问题:

一个就是后端的byte数组传递到前端很不方便,而且我在用ajax传递的时候,二进制数组参数会变成string型。

另一个就是javascript中无法直接新建一个File对象。。

首先第一个问题,二进制数组不能传递,那么就只能传递字符串了,但是不能直接转字符串,那么有什么办法呢?再上面的代码看到,里面有一句

var readtype = {type: rABS ? 'binary' : 'base64' };

说明这个操作可以操作base64编码的字符串,那就是转成base64,这个需要引入apache的一个包,包名为commons-codec,再Maven中引用如下,

<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.10</version>
</dependency>

再调用其一个方法,

Base64.encodeBase64String(byteArray);   //将byteArray转为base64字符串

这样就可以传输到前端了。

 

再说第二个问题,通过百度发现,javascript有一种数据类型Blob,而File正是基于这种Blob的。

一个Blob对象就是一个包含有只读原始数据的类文件对象

但是Blob是可以初始化来生成的,

var blob = new Blob([base64Data], { type: "mime" })
然后就可以通过FileReader读取了,再接下来只需要按照demo的代码调用就可以了。。。
reader.readAsBinaryString(blob);
 

 


 


...
相关文章
|
19天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
89 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
1月前
|
Python
按条件将Excel文件拆分到不同的工作表
使用Python的pandas库,可以轻松将Excel文件按条件拆分到不同的工作表中。本文通过一个示例代码展示了如何生成一个包含总成绩表和三个班级表的Excel文件。代码首先创建了一个包含学生姓名、班级和各科成绩的数据框,然后按班级分组,将每个班级的数据分别写入不同的工作表。最后,生成的Excel文件将包含四个工作表,分别为总成绩表和三个班级的成绩表。
38 6
按条件将Excel文件拆分到不同的工作表
|
23天前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
30天前
|
存储 druid 分布式数据库
列式存储数据库与超市的关系?
列式存储数据库是一种高效的数据管理方式,类似于超市将相似商品集中摆放。它将相同类型的数据(如年龄、价格)归类存储,便于快速查询和压缩,广泛应用于市场分析、财务报告和健康数据分析等领域。知名产品包括HBase、ClickHouse、Druid和Apache Cassandra等,适合处理大规模数据和实时分析任务。
36 4
|
1月前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
1月前
|
Python
批量将不同的工作簿合并到同一个Excel文件
本文介绍如何使用Python的`pandas`库批量合并不同工作簿至同一Excel文件。通过模拟生成三个班级的成绩数据,分别保存为Excel文件,再将这些文件合并成一个包含所有班级成绩的总成绩单。步骤包括安装必要库、生成数据、保存与合并工作簿。
55 6
|
1月前
|
Python
按条件将Excel文件拆分到不同的工作表
使用Python的pandas库,可以轻松将Excel文件按条件拆分为多个工作表。本文通过一个具体示例,展示了如何根据学生班级将成绩数据拆分到不同的工作表中,并生成一个包含总成绩表和各班级成绩表的Excel文件。代码简洁明了,适合初学者学习和应用。
49 6
|
1月前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
2月前
|
Oracle 关系型数据库 数据库
Oracle数据恢复—Oracle数据库文件有坏快损坏的数据恢复案例
一台Oracle数据库打开报错,报错信息: “system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。管理员联系我们数据恢复中心寻求帮助,并提供了Oracle_Home目录的所有文件。用户方要求恢复zxfg用户下的数据。 由于数据库没有备份,无法通过备份去恢复数据库。
|
1月前
|
存储 Oracle 关系型数据库
服务器数据恢复—华为S5300存储Oracle数据库恢复案例
服务器存储数据恢复环境: 华为S5300存储中有12块FC硬盘,其中11块硬盘作为数据盘组建了一组RAID5阵列,剩下的1块硬盘作为热备盘使用。基于RAID的LUN分配给linux操作系统使用,存放的数据主要是Oracle数据库。 服务器存储故障: RAID5阵列中1块硬盘出现故障离线,热备盘自动激活开始同步数据,在同步数据的过程中又一块硬盘离线,RAID5阵列瘫痪,上层LUN无法使用。

热门文章

最新文章