用的是koa2框架,但好好处理一下,用express框架也是可以的。导出的Excel是xlsx的格式,解析导入Excel的有xlsx和csv格式。通常导入Excel是要上传的,然后获取文件的路径,这里省略。强烈不建议导入的Excel直接保存到数据库,建议将数据发到页面上确认没问题,再保存,防止导入垃圾数据。导入的Excel里也不要什么样式,防止不符合解析规范。建议用xlsx格式的Excel导入,解析比较简单。

最后用Buffer导出Excel输出,参考了:https://blog.csdn.net/zhangfei8625/article/details/51802166

我的Excel内容

index.html 的代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Excel的导入导出</title>
<script src="https://code.jquery.com/jquery-1.12.4.min.js"
integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ="
crossorigin="anonymous">
</script>
</head>
<body>
<hr/>
导出Excel:<button id="exportexcel">提交</button>
<hr/>
导入xlsx格式:<button id="importexcelxlsx">提交</button>
<hr/>
导入csv格式:<button id="importexcecsv">提交</button>
<script>
$(function () {
$("#exportexcel").on("click",function () {
window.open("/exportexcel")
});
$("#importexcelxlsx").on("click",function () {
$.ajax({
url : "/importexcelxlsx",
type : "POST",
data : {},
success : function(data){
console.log(data);
}
});
});
$("#importexcecsv").on("click",function () {
$.ajax({
url : "/importexcelcsv",
type : "POST",
data : {},
success : function(data){
console.log(data);
}
});
});
})
</script>
</body>
</html>

app.js 的代码

const Koa = require("koa");
const router = require("koa-router")();
const fs=require("fs");
const nodeExcel = require('excel-export');
const csv=require('csv');
const dict = require('gbk-dict').init();//调用gbk-dict中的init这个方法
const xlsx = require('node-xlsx');
const app = new Koa();
app.use(router.routes());
router.get("/",(ctx)=>{
ctx.body = fs.readFileSync("./index.html","utf-8");
}); //导出Excel,xlsx格式
router.get('/exportexcel',async (ctx) => {
async function readydata() {
//做点什么,如从数据库取数据
let exceldata=[
{name:"张三",age:"20",sex:"男",birthday:"1998-10-10"},
{name:"李四",age:"21",sex:"男",birthday:"1997-08-08"},
{name:"王五",age:"22",sex:"男",birthday:"1996-06-06"},
{name:"赵六",age:"20",sex:"男",birthday:"1998-12-12"},
];
return exceldata;
}
//导出
async function exportdata(v) {
let conf ={};
conf.name = "mysheet";//表格名
let alldata = new Array();
for(let i = 0;i<v.length;i++){
let arr = new Array();
arr.push(v[i].name);
arr.push(v[i].age);
arr.push(v[i].sex);
arr.push(v[i].birthday);
alldata.push(arr);
}
//决定列名和类型
conf.cols = [{
caption:'姓名',
type:'string'
},{
caption:'年龄',
type:'number'
},{
caption:'性别',
type:'string'
},{
caption:'出生日期',
type:'string',
//width:280
}];
conf.rows = alldata;//填充数据
let result = nodeExcel.execute(conf);
//最后3行express框架是这样写
// res.setHeader('Content-Type', 'application/vnd.openxmlformats');
// res.setHeader("Content-Disposition", "attachment; filename=" + "Report.xlsx");
// res.end(result, 'binary');
let data = new Buffer(result,'binary');
ctx.set('Content-Type', 'application/vnd.openxmlformats');
ctx.set("Content-Disposition", "attachment; filename=" + "Report.xlsx");
ctx.body=data;
}
let r=await readydata();
r=await exportdata(r);
});
//导入Excel,xlsx格式
const xlsxfile="E:/xlsx格式.xlsx";
router.post('/importexcelxlsx',async (ctx) => {
async function analysisdata() {
return new Promise((resolve,reject)=>{
//解析xlsx
let obj = xlsx.parse(xlsxfile);
resolve(obj);
});
}
async function readdata(v) {
console.log("xlsx =" ,v);//xlsx = [ { name: 'Sheet1', data: [ [Array], [Array], [Array] ] } ]
console.log("数据 = ",v[0]);//数据 = { name: 'Sheet1',
// data: [ [ '姓名', '年龄' ], [ '张三', 20 ], [ '李四', 30 ] ]}
console.log("要上传的数据 = ",v[0].data);//要上传的数据 = [ [ '姓名', '年龄' ], [ '张三', 20 ], [ '李四', 30 ] ]
ctx.body=v;
}
let r=await analysisdata();
r=await readdata(r);
});
//导入Excel,csv格式
const csvfile="E:/csv格式.csv";
router.post('/importexcelcsv',async (ctx) => {
async function analysisdata() {
return new Promise((resolve,reject)=>{
//解析csv
let output = new Array();//创建数组
let parser = csv.parse({delimiter: ','});//调用csv模块的parse方法
let input = fs.createReadStream(csvfile);//调用fs模块的createReadStream方法
input.on("data",function(data){
parser.write(dict.gbkToUTF8(data));
});
input.on("close",function(){
parser.end();
});//读取操作的缓存装不下,只能分成几次发送,每次发送会触发一个data事件,发送结束会触发end事件
parser.on('readable',function(){
while(record = parser.read()){
output.push(record);
}
});
parser.on('finish',function() {
resolve(output); ;
//output是整个数据的数组
})
});
}
async function readdata(v) {
console.log("csv =" ,v);//csv = [ [ '姓名', '年龄' ], [ '张三', '20' ], [ '李四', '30' ] ]
ctx.body=v;
}
let r=await analysisdata();
r=await readdata(r);
});
app.listen(3000);
console.log("listen on 3000");

导出的Excel

nodejs:导出Excel和解析导入的Excel的更多相关文章

  1. 使用ocupload和POI一键上传Excel并解析导入数据库

    使用的工具如下:  JQuery ocupload jquery.ocupload-1.1.2.js Apache POI poi-3.9.jar 如果是Maven项目添加依赖如下: <depe ...

  2. SSM excel文件的导入导出

    对于excel文件的导入导出,后台接收读取和建表封存都是固定死的,所以对于excel导入时,excel文件内容必须匹配后台相关对象,不然报错. excel文件导出,用<a><a/&g ...

  3. 导入数据任务(id:373985)异常, 错误信息:解析导入文件错误,请检查导入文件内容,仅支持导入json格式数据及excel文件

    小程序导入,别人导出的数据库json文件,错误信息如下: 导入数据库失败, Error: Poll error, 导入数据任务(id:373985)异常,错误信息:解析导入文件错误,请检查导入文件内容 ...

  4. excel表格数据导入导出

    /** * 导出数据到excel表格 * Created by shenjianhua on 2018-12-28 */ package com.luer.comm.excel; import jav ...

  5. 通过swagger json一键解析为html页面、导出word和excel的解析算法分享

    写在前面: 完全通过Spring Boot工程 Java代码,将swagger json 一键解析为html页面.导出word和execel的解析算法,不需要任何网上那些类似于“SwaggerMark ...

  6. ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-Excel导入和导出-自定义表模导入

    系列目录 前言 上一节使用了LinqToExcel和CloseXML对Excel表进行导入和导出的简单操作,大家可以跳转到上一节查看: ASP.NET MVC5+EF6+EasyUI 后台管理系统(6 ...

  7. 分享我基于NPOI+ExcelReport实现的导入与导出EXCEL类库:ExcelUtility (续3篇-导出时动态生成多Sheet EXCEL)

    ExcelUtility 类库经过我(梦在旅途)近期不断的优化与新增功能,现已基本趋向稳定,功能上也基本可以满足绝大部份的EXCEL导出需求,该类库已在我们公司大型ERP系统全面使用,效果不错,今天应 ...

  8. 循序渐进开发WinForm项目(5)--Excel数据的导入导出操作

    随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...

  9. nodejs 导出excel

    nodejs 对查询数据生成excel并下载,采用方式先生成本excel文件,然后再下载:通过比较采用excel-export插件代码如下: excel.js代码: var extend = requ ...

随机推荐

  1. 02-Python入门学习-变量

    一.编程语言介绍1.机器语言:直接用二进制编程,直接控制硬件,需要掌握硬件的操作细节优点:执行效率高缺点:开发效率低 2.汇编语言:用英文标签取代二进制指令去编写程序,直接控制硬件,需要掌握硬件的操作 ...

  2. 转UI么?不想

    最近一直在弄UI   对于UI实在是不想弄了    很痛苦...我一开始都比较热衷后台开发  但是前端UI 我只是有点兴趣而已,但是还一直要做...太累了    或许要学的东西还是有很多的!一直不知道 ...

  3. idea 自定义注释模板

    一.类注释模板 打开Preferences Editor -> File and Code Templates -> Files -> Class 效果图: 注释模板 /** * @ ...

  4. BOM 浏览器对象模型_同源限制

    “同源政策”(same-origin policy) 浏览器安全的基石 协议相同 域名相同 端口相同 1995年,同源政策由 Netscape 公司引入浏览器.目前,所有浏览器都实行这个政策 A 网页 ...

  5. react_app 项目开发 (4)_ React UI 组件库 ant-design 的基本使用

    最流行的开源 React UI 组件库 material-ui 国外流行(安卓手机的界面效果)文档 ant-design 国内流行 (蚂蚁金服 设计,一套 PC.一套移动端的____下拉菜单.分页.. ...

  6. vue-cli 脚手架 Command Line Interface

    mac sudo npm install -g nrm sudo npm config -g set unsafe-perm sudo npm install webpack@3.0.0 -g sud ...

  7. 安装Percona版本的MySQL主从复制

    准备两台虚拟机,按顺序执行1.1节的公共部分 1.1 首先安装 cmake # yum –y install cmake     //也需要安装gcc-c++,openssl openssl-deve ...

  8. js 设计模式之观察者模式

    观察者模式 又被称为“发布-订阅”模式,目的是解决主题对象和观察者之间功能的耦合性.发布者和订阅者之间是互不干扰的,没有联系的,通过观察者,当做中介,将二者联系起来. 例子:以学生和老师之间的为例 1 ...

  9. java--List、Set、Map的基础

    好像面试很多面试官都喜欢问这它们的一些问题,所以在这里我稍微总结一下,并把大佬们的文章链接贴在后面. 首先我们借鉴了https://www.cnblogs.com/SnowingYXY/p/67273 ...

  10. Ubuntu上hi3531交叉编译环境arm-hisiv100nptl-linux搭建过程

    安装SDK 1.Hi3531 SDK包位置 在"Hi3531_V100R001***/01.software/board"目录下,您可以看到一个 Hi3531_SDK_Vx.x.x ...