nodejs操作excel并配合edatagrid使用
nodejs读取文件夹下子文件(夹)名称:
/**
* 查询tmp文件夹下子文件夹名称
*/
router.post("/tmpList", function (req, res) {
fs.readdir("./public/tmp", function (err, files) {
var jsonArray = new Array(); //[{id:0,name:'陕西省'},{id:1,name:'福建省'},{id:2,name:'陕西省'}]
jsonArray.push({id: "", name: '请选择省或地区'});
for (var index in files) {
var jsonObj = {};
jsonObj.id = index;
jsonObj.name = files[index];
jsonArray.push(jsonObj);
}
res.send(jsonArray);
});
});
读取之后渲染显示:
<input style="width: 150px;" class="easyui-combobox" id="province" name="province" data-options="valueField:'id',textField:'name',url:'/market/tmpList',panelHeight:'300px;',editable:false">
使用node-xlsx加载、生成excel文件(后缀名为.xlsx):
var xlsx = require("node-xlsx");
var path = require('path');
var url = path.join(__dirname + "/" + req.body.url);
var obj = xlsx.parse(url);
var data = obj[0].data;
其中,url为*.xlsx文件路径,data为读取的excel数据(data[0]为excel表头数据,为一个数组,data[i]分别为第i+1行数据,也是一个数组),使用如下生成一个excel文件:
var fs = require("fs");
var xlsx = require("node-xlsx");
var path = require('path');
var file = xlsx.build([{name: "Sheet1", data: dataArray}]);
fs.writeFileSync(__dirname + "/" + url, file, "binary");
其中,url同样为*.xlsx路径(含后缀名),dataArray的格式为:
[ [ '姓名', '性别', '学号', '年龄', '电话', '地址', '是否党员' ],[ '张三', '男', '000', '13' ],[ '李四', '男', '001', '14' ] ]
其中,[ '姓名', '性别', '学号', '年龄', '电话', '地址', '是否党员' ] 为生成的excel表头,其余为对应的内容(注意:内容数量和表头数不匹配时,空缺默认留空)。
页面效果:

依次选择各个区域后,单击“加载模板”即可读取excel数据显示,读取的excel内容如下:


可以看出是完全读取的excel内容显示,页面部分实现:
<table id="dg" title="行情模板" idField="id" style="width:100%;position: absolute;top: 50px;bottom: 0px;overflow-x: hidden"
toolbar="#toolbar" idField="id" rownumbers="true" fitColumns="true" singleSelect="true" >
</table>
<div id="toolbar">
<div style="margin-top: 10px;margin-bottom: 3px;margin-left: 2px;font-size: 14px;">请选择要修改的行情模板:</div>
<div style="float: left;margin-top: 10px;margin-left: 2px;">
商品区域:<input style="width: 150px;" class="easyui-combobox" id="province" name="province"
data-options="valueField:'id',textField:'name',url:'/tmpList',panelHeight:'300px;',editable:false">
<input style="width: 150px;" class="easyui-combobox" id="city" name="city"
data-options="valueField:'id',textField:'name',panelHeight:'auto',editable:false">
</div>
<div style="float: left;margin-top: 10px;margin-left: 5px;">
商品大类:<input class="easyui-combobox" id="bigType"
data-options="textField:'name',valueField:'id',url:'',panelHeight:'auto',editable:false"
style="width: 150px;"/>
</div>
<div style="margin-top: 10px;float: left;margin-left: 5px;">
品种:<input class="easyui-combobox" id="variety"
data-options="textField:'name',valueField:'id',url:'',panelHeight:'auto',editable:false"
style="width: 150px;"/>
</div>
<input type="hidden" id="headData"/>
<a class="easyui-linkbutton" plain="true" iconCls="icon-2012080412111" style="margin-top: 8px;margin-left: 5px;" href="javascript:void(0)" onclick="javascript:loadTemplet()">加载模板</a>
<div style="clear: both"> </div>
<a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-add" plain="true"
onclick="javascript:add()">添加</a>
<a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-remove" plain="true"
onclick="javascript:del()">删除</a>
<!--<a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-edit" plain="true"-->
<!--onclick="javascript:update()">修改</a>-->
<a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-save" plain="true"
onclick="javascript:save()">保存</a>
<a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-undo" plain="true"
onclick="javascript:cancel()">撤销</a>
<a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-arrow_up" plain="true"
onclick="javascript:moveUp()">上移</a>
<a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-arrow_down" plain="true"
onclick="javascript:moveDown()">下移</a>
</div>
主要js代码实现:
<script type="text/javascript">
var editFlag = undefined;//设置一个编辑标记
var url = null;
jQuery(function () {
jQuery("#dg").edatagrid({});
jQuery("#variety").combobox({
onSelect: function (record) {
var proName = jQuery("#province").combobox("getText");
var cityName = jQuery("#city").combobox("getText");
var bigTypeName = jQuery("#bigType").combobox("getText");
var varietyName = jQuery("#variety").combobox("getText");
if (varietyName == "请选择品种") {
jQuery.messager.show({title: "提示", msg: "请先选择价格行情区域"});
return;
}
url = "../public/tmp/" + proName + "/" + cityName + "/" + bigTypeName + "/" + varietyName + "/" + varietyName + ".xlsx";
jQuery.post("/tmpHead",{
url:url
},function(result){
jQuery("#headData").val(result.data);
});
}
});
});
function add(){
// if(jQuery("#dg").edatagrid("getRows") == null || jQuery("#dg").edatagrid("getRows") == ""){
// jQuery.messager.show({title:"提示",msg:"请先加载模板"});
// return;
// }
jQuery("#dg").edatagrid("addRow");
}
function cancel(){
jQuery("#dg").edatagrid("rejectChanges");
jQuery("#dg").edatagrid("unselectAll");
editFlag = undefined;
}
function del(){
if(jQuery("#dg").edatagrid("getRows") == null || jQuery("#dg").edatagrid("getRows") == ""){
jQuery.messager.show({title:"提示",msg:"请先加载模板"});
return;
}
var rowIndex = editFlag; //要删除的行索引
if(!rowIndex){
jQuery.messager.show({title:"提升",content:"请先选择要删除的行"});
return;
}
jQuery.messager.confirm("提示","确定删除?",function(r){
if(r){
jQuery('#dg').edatagrid('deleteRow', rowIndex);
var data = JSON.stringify(jQuery('#dg').edatagrid("getRows")); //获取删除后的数据,后台重新生成Excel
jQuery.post("/tmpSave",{
data:data,
url:url,
headData:jQuery("#headData").val()
},function(result){
jQuery.messager.show({title:"提示",msg:"删除成功!"});
});
}
})
}
function save(){
if(jQuery("#dg").edatagrid("getRows") == null || jQuery("#dg").edatagrid("getRows") == ""){
jQuery.messager.show({title:"提示",msg:"请先加载模板"});
return;
}
for(var j = 0; j < jQuery("#dg").edatagrid("getRows").length; j++){ //循环校验
if(!jQuery('#dg').edatagrid('validateRow',j)){
jQuery.messager.show({title:"提示",msg:"输入内容要求20字符以内且不能为空!"});
return;
}
}
jQuery('#dg').edatagrid("acceptChanges"); //获取删除后的数据,后台重新生成Excel
var data = JSON.stringify(jQuery('#dg').edatagrid("getRows"));
jQuery.post("/tmpSave",{
data:data,
url:url,
headData:jQuery("#headData").val()
},function(result){
jQuery('#dg').edatagrid("reload");
jQuery.messager.show({title:"提示",msg:"保存成功!"});
});
}
function moveUp() {
var row = jQuery("#dg").edatagrid('getSelected');
var index = jQuery("#dg").edatagrid('getRowIndex', row);
mysort(index, 'up', 'dg');
}
function moveDown(){
var row = jQuery("#dg").datagrid('getSelected');
var index = jQuery("#dg").datagrid('getRowIndex', row);
mysort(index, 'down', 'dg');
}
function mysort(index, type, gridname) {
if ("up" == type) {
if (index != 0) {
var toup = jQuery('#' + gridname).edatagrid('getData').rows[index];
var todown = jQuery('#' + gridname).edatagrid('getData').rows[index - 1];
jQuery('#' + gridname).edatagrid('getData').rows[index] = todown;
jQuery('#' + gridname).edatagrid('getData').rows[index - 1] = toup;
jQuery('#' + gridname).edatagrid('refreshRow', index);
jQuery('#' + gridname).edatagrid('refreshRow', index - 1);
jQuery('#' + gridname).edatagrid('selectRow', index - 1);
}
} else if ("down" == type) {
var rows = jQuery('#' + gridname).edatagrid('getRows').length;
if (index != rows - 1) {
var todown = $('#' + gridname).edatagrid('getData').rows[index];
var toup = $('#' + gridname).edatagrid('getData').rows[index + 1];
jQuery('#' + gridname).edatagrid('getData').rows[index + 1] = todown;
jQuery('#' + gridname).edatagrid('getData').rows[index] = toup;
jQuery('#' + gridname).edatagrid('refreshRow', index);
jQuery('#' + gridname).edatagrid('refreshRow', index + 1);
jQuery('#' + gridname).edatagrid('selectRow', index + 1);
}
}
}
function loadTemplet(){
var proName = jQuery("#province").combobox("getText");
var cityName = jQuery("#city").combobox("getText");
var bigTypeName = jQuery("#bigType").combobox("getText");
var varietyName = jQuery("#variety").combobox("getText");
if (varietyName == "请选择品种") {
jQuery.messager.show({title: "提示", msg: "请先选择要加载的模板"});
return;
}
var url = "../public/tmp/" + proName + "/" + cityName + "/" + bigTypeName + "/" + varietyName + "/" + varietyName + ".xlsx";
var headData = jQuery("#headData").val().split(",");
jQuery("#dg").edatagrid({
url:"/tmpShow",
nowrap: true,
loadMsg : "正在努力为您加载数据",
columns: [[
{
field: 'trade', title: headData[0], width: "15%", align: 'center', editor: {
type: 'text',
options: {
required: true
}
}
},
{
field: 'standard', title: headData[1], width: "15%", align: 'center', editor: {
type: 'text',
options: {
required: true
}
}
},
{
field: 'material', title: headData[2], width: "15%", align: 'center', editor: {
type: 'text',
options: {
required: true
}
}
},
{
field: 'steelFactory', title: headData[3], width: "15%", align: 'center', editor: {
type: 'text',
options: {
required: true
}
}
},
{
field: 'price', title: headData[4], width: "10%", align: 'center'
},
{
field: 'change', title: headData[5], width: "15%", align: 'center'
},
{
field: 'remark', title: headData[6], width: "15%", align: 'center'
}
]],
onBeforeLoad: function (param) {
param.url = url;
},
onAfterEdit : function(rowIndex, rowData, changes) {
editFlag = undefined;//重置
jQuery("#dg").edatagrid("unselectAll");
},
onDblClickCell : function(rowIndex, field, value) {//双击该行修改内容
if (editFlag != undefined) {
jQuery("#dg").edatagrid('endEdit', editFlag);//结束编辑,传入之前编辑的行
jQuery("#dg").edatagrid('beginEdit', rowIndex);//开启编辑并传入要编辑的行
editFlag = rowIndex;
}
if (editFlag == undefined) {
jQuery("#dg").edatagrid('beginEdit', rowIndex);//开启编辑并传入要编辑的行
editFlag = rowIndex;
}
},
onClickCell : function(rowIndex, field, value) {//双击该行修改内容
editFlag = rowIndex;
}
});
}
</script>
可以直接进行修改、保存、撤销、新增以及上移、下移操作,保存后,数据直接提交至后台直接重新生成excel文件。
nodejs操作excel并配合edatagrid使用的更多相关文章
- SpringBoot整合Easyexcel操作Excel,闲暇之余,让我们学习更多
关于封面:晚饭后回自习室的路上 Easyexcel 官方文档 Easyexcel | github 前言 最近也是在写的一个小练习中,需要用到这个.趁着这次就将写个整合的Demo给大家. 希望能够让大 ...
- 免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)
很多的软件项目几乎都包含着对文档的操作,前面已经介绍过两款操作文档的组件,现在介绍一款文档操作的组件NPOI. NPOI可以生成没有安装在您的服务器上的Microsoft Office套件的Excel ...
- C#通过NPOI操作Excel
参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-post.html http://www.yuanjiaocheng.net/w ...
- POI操作Excel
POI和Excel简介 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作 ...
- NPOI操作EXCEL(六)——矩阵类表头EXCEL模板的解析
哈哈~~~很高兴还活着.总算加班加点的把最后一类EXCEL模板的解析做完了... 前面几篇文章介绍了博主最近项目中对于复杂excel表头的解析,写得不好,感谢园友们的支持~~~ 今天再简单讲诉一下另一 ...
- VB操作EXCEL文件
用VB操作Excel(VB6.0)(整理) 首先创建Excel对象,使用ComObj:Dim ExcelID as Excel.ApplicationSet ExcelID as new Excel. ...
- VB.NET操作Excel
VB.NET操作Excel的基本方法与例子:
- C# 操作excel单元格居中
C# 操作excel //导出Excel private void ExportExcel(string fileName, System.Data.DataTable myDGV, s ...
- NPOI操作Excel辅助类
/// <summary> /// NPOI操作excel辅助类 /// </summary> public static class NPOIHelper { #region ...
随机推荐
- hdu3089 Josephus again|快速约瑟夫环
题目链接:戳我 貌似是高一昨天的考试题T2?????感觉挺好玩的就搞了搞qwqwq 其实是HDU上面的题啦.... 对于普通的约瑟夫问题,大概是n个人围成一个环,从1开始报数,数到k,那个人出队,最后 ...
- TL431的应用
TL431的应用 对于基准源,大部分人都认识TL431,因为它物美价廉,高精度,满足一般的应用场合,价格低至1毛钱,就算是ST高端品牌的也是几毛钱.这仅仅是其中一点,还有一点是因为它不仅仅可以作为基准 ...
- MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled
初试redis,删除或者修改值的时候报的错,解决方式是运行命令: 127.0.0.1:6379> config set stop-writes-on-bgsave-error no
- PL/SQL数据库开发那点事
PL/SQL数据库开发那点事-->编程,存储程序 在SQL*plus 中编写PL/SQL程序,并在SQL*plus 中执行它, PL/SQL块的代码就存放在SQL*plus的缓冲区中.如果在SQ ...
- 【随记】WPF中xaml输入中文乱码问题解决
在Visual Studio中开发WPF应用程序时,在XMAL文档编写界面输入中文时变为乱码.可能的原因之一是VS中安装了VAssistX插件,导致编码冲突,使中文输入乱码.解决方法是在VAssist ...
- leetcode-682-Baseball Game
题目描述: You're now a baseball game point recorder. Given a list of strings, each string can be one of ...
- 2016级算法第五次上机-A.Beihang Collegiate Pronunciation Contest 2017
1065 Beihang Collegiate Pronunciation Contest 2017 思路 在字符串中不断做匹配 找到一个匹配就输出 时间复杂度\(O(n)\) ps.模式串是定长的, ...
- mysql 表复制(表备份)
复制一个表数据到新表,我们可以直接执行下面的语句 create table new_table LIKE old_table:--将表结构复制到新表 insert into new_table sel ...
- 股神 C++
题目描述 有股神吗? 有,小赛就是! 经过严密的计算,小赛买了一支股票,他知道从他买股票的那天开始,股票会有以下变化:第一天不变,以后涨一天,跌一天,涨两天,跌一天,涨三天,跌一天...依此类推. 为 ...
- UML图及Visio 2010使用总结
1. 关于UML9种图的详细介绍: 参考链接A:UML 九种图详解 参考链接B:UML的九种图+包图 2. 深入探究类图: 类图间的关系:泛化 .继承.实现.依赖.关联.聚合.组合: 参考链接A:ht ...