前端利用 js-xlsx 实现 Excel 文件导入导出功能

前端代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  <title>自定义派单 - Powered By </title>
  <link href="${base}/template/admin/js/eayyui132/themes/icon.css" rel="stylesheet" type="text/css" />
  <link href="${base}/template/admin/js/eayyui132/themes/default/easyui.css" rel="stylesheet" type="text/css" />
  <script type="text/javascript" src="${base}/template/admin/js/eayyui132/jquery-1.8.0.min.js"></script>
  <script type="text/javascript" src="${base}/template/admin/js/eayyui132/jquery.easyui.min.js"></script>
  <script type="text/javascript" src="${base}/template/admin/js/eayyui132/easyui-lang-zh_CN.js"></script>
  <script type="text/javascript" src="${base}/template/admin/js/ajaxfileupload.js"></script>
        <script type="text/javascript" src="${base}/template/admin/js/report.js"></script>
  


  <script type="text/javascript" src="${base}/template/admin/js/datagridSelectCascade.js"></script>

  <script type="text/javascript" src="${base}/template/common/datePicker/WdatePicker.js"></script>
  <script type="text/javascript" src="${base}/template/admin/js/jsXlsx/xlsx.full.min.js"></script>

</head>
<body style="width:100%;height:100%">
<div style="width:100%;position:absolute;bottom:30px;top:0;left:0">
<table id="clientGrid" class="easyui-datagrid" style="padding:5px;" toolbar="#toolbar" fit="true" rownumbers="true" fitColumns="true" singleSelect="true" >
  <thead>
  <tr>
    <th sortable="true" data-options=" halign:'center',field:'city_ID',formatter:isNull">本地网标识</th>
    <th sortable="true" data-options=" halign:'center',field:'hd_ID',formatter:isNull">活动ID</th>
    <th sortable="true" data-options=" halign:'center',field:'hd_NAME',formatter:isNull">活动名称</th>
    <th sortable="true" data-options=" halign:'center',field:'hd_ST_DATE',formatter:isNull">活动开始时间</th>
    <th sortable="true" data-options=" halign:'center',field:'hd_ED_DATE',formatter:isNull">活动结束时间</th>
    <th sortable="true" data-options=" halign:'center',field:'connectno',formatter:isNull">接入号</th>
    <th sortable="true" data-options=" halign:'center',field:'client_MARK',formatter:isNull">客户标识</th>
    <th sortable="true" data-options=" halign:'center',field:'regional_PIC',formatter:isNull">片区负责人工号</th>
    <th sortable="true" data-options=" halign:'center',field:'main_COMMEND_NAME',formatter:isNull">主推荐名称</th>
    <th sortable="true" data-options=" halign:'center',field:'main_COMMEND_INTRO',formatter:isNull">主推推荐简介</th>
    <th sortable="true" data-options=" halign:'center',field:'sale_INFO',formatter:isNull">营销建议</th>
    <th sortable="true" data-options=" halign:'center',field:'main_COMMEND_TYPE',formatter:isNull">主推推荐类型</th>
    <th sortable="true" data-options=" halign:'center',field:'sc_COMMEND_NAME',formatter:isNull">次推推荐名称</th>
    <th sortable="true" data-options=" halign:'center',field:'sc_COMMEND_INTRO',formatter:isNull">次推推荐简介</th>
    <th sortable="true" data-options=" halign:'center',field:'sc_COMMEND_TYPE',formatter:isNull">次推推荐类型</th>
    <th sortable="true" data-options=" halign:'center',field:'ds_COMMEND_NAME',formatter:isNull">顺销推荐名称</th>
    <th sortable="true" data-options=" halign:'center',field:'ds_COMMEND_INTRO',formatter:isNull">顺销推荐简介</th>
    <th sortable="true" data-options=" halign:'center',field:'ds_COMMEND_TYPE',formatter:isNull">顺销推荐类型</th>

  </tr>
  </thead>
</table>
        </div>

    <div id="pp" class="easyui-pagination" style="border:1px solid #ccc;position:fixed;bottom:0;right:0;left:0;background-color:#fff" data-options="  
            total: 0,  
            pageList: [50,100,200],  
                onSelectPage: function(pageNumber, pageSize){ // 页面切换动作  
                    getDataByPageRows(pageNumber,pageSize);     
            }">
        </div>

<div id="toolbar">
  <div>
    <label class="textStyle ">工单创建时间段:</label>
    <input id="staTime" style="width:110px " class="easyui-text " name="staTime"  onclick="WdatePicker({dateFmt: 'yyyy-MM-dd'}) " " />
    <label class="textStyle">--</label>
    <input id="overTime" style="width:110px" class="easyui-text" name="overTime"  onclick="WdatePicker({dateFmt:'yyyy-MM-dd'})" />

    <a href="#" onclick="searchEnd();" class="easyui-linkbutton" plain="true" icon="icon-search">查询</a>
    <a href="#" id="export" onclick="clientExport()" class="easyui-linkbutton" plain="true" icon="icon-print">导出</a>
    <a href="#" onclick="exportExcel(jsono)" class="easyui-linkbutton" iconCls="icon-selectAll" plain="true">模板下载</a>
    <a href="" download="自定义派单.xlsx" id="hf"></a>
    <a href="#" onclick="importDataModel()" class="easyui-linkbutton" iconCls="icon-add" plain="true">批量导入</a>

  </div>
</div>


<!-- 导入数据模块 -->
<div id="importDataTable" class="easyui-window" title="导入信息" style="width:980px;height:510px; padding:2px;" data-options="modal:true, collapsible:false, minimizable:false,maximizable:true,closed:true,onMaximize:function(){MaximizeImport()},onRestore:function(){MaximizeImport()}">

  <div style="width:100%;height:100%;" data-options="fit:true">
    <div id="tb3" style="padding:4px 10px;">
      <input type="hidden" id="inputID" />
      <a href="#" onclick="chooseFile()" class="easyui-linkbutton" type="file" icon="icon-add">选择文件导入</a>
        <form action="custom_dispatch_order!checkExport.action" method='post' onsubmit="return exportCheckResult();" style="position:relative;margin-top:-28px;margin-left:120px;width:70px">
                <input type="text" value="[]" id="exportData" name="exportData" style="visibility:hidden;position:fixed" />
                <input type="submit" value="导出检验结果" class="easyui-linkbutton" plain="true" icon="icon-print" style="width:95px;height:23px;" id ="exportCheckBtn"/>
            </form>
    </div>
    <table id="showImportinfo" class="easyui-datagrid" data-options="toolbar:'#tb3',fit:true,fitColumns:false,scrollbarSize:10,pagination:true" rownumbers="true">
      <thead>
      <tr>
        <th data-options="align:'center',field:'HD_NAME',width:140">活动名称</th>
        <th data-options="align:'center',field:'HD_ST_DATE',width:140 ,formatter:crtTimeFtt" >活动开始时间</th>
        <th data-options="align:'center',field:'HD_ED_DATE',width:140 ,formatter:crtTimeFtt">活动结束时间</th>
        <th data-options="align:'center',field:'CONNECTNO',width:140">接入号</th>
        <th data-options="align:'center',field:'MAIN_COMMEND_NAME',width:110">主推荐名称</th>
        <th data-options="align:'center',field:'MAIN_COMMEND_INTRO',width:110">主推推荐简介</th>
        <th data-options="align:'center',field:'SALE_INFO',width:110">营销建议</th>
        <th data-options="align:'center',field:'MAIN_COMMEND_TYPE',width:110">主推推荐类型</th>
        <th data-options="align:'center',field:'SC_COMMEND_NAME',width:100">次推推荐名称</th>
        <th data-options="align:'center',field:'SC_COMMEND_INTRO',width:100">次推推荐简介</th>
        <th data-options="align:'center',field:'SC_COMMEND_TYPE',width:120">次推推荐类型</th>
        <th data-options="align:'center',field:'DS_COMMEND_NAME',width:100">顺销推荐名称</th>
        <th data-options="align:'center',field:'DS_COMMEND_INTRO',width:120">顺销推荐简介</th>
        <th data-options="align:'center',field:'DS_COMMEND_TYPE',width:120">顺销推荐类型</th>
        <th data-options="align:'center',field:'checkResult',width:110,formatter:chenkInfo">校验结果</th>
        <th data-options="align:'center',field:'something'">备注</th>
      </tr>
      </thead>
    </table>
  </div>
</div>
</div>
</div>

<#--选择文件上传窗口-->
  <div id="uploadFileWin" class="easyui-window" title="选择文件" style="width:650px;height:260px" data-options="modal:true,minimizable:false,maximizable:false,closed: true">
    <div style="padding:10px;">
      <table class="inputTable">
        <tr>
          <th>
            上传文件:
          </th>
          <td>
            <input type="file" name="uploadFile" id="uploadFile" onchange="importf(this)"/>
          </td>
        </tr>
        <tr>
          <th>
            文件格式说明:
          </th>
          <td style="color:#999;">
            <label class="requireField" color="red"> <span  color="red"> 1、文件格式必须为Excel2007模板文件,请勿修改模板格式  </span></br>
              <span  color="red"> 2、如果文件为Excel2003格式(扩展名  .xls),请打开文件,然后另存为Excel2007(扩展名 .xlsx) </span></br>
              <span  color="red">3、文档前缀名称不能修改,只能修改日期 </span>
            </label>
          </td>
        </tr>
      </table>
    </div>
    <div class="buttonArea" align="center" style="margin-top:20px;">
      <input type="button" id="submitForm" onclick="submitList()" class="formButton" value="确  定" hidefocus />
    </div>
  </div>

</body>

<script type="text/javascript">
  var excelData;//excel数据
  var checkInfo;//校验结果
  var wb;//读取完成的数据
  var tableCheck;//界面检验结果
  var successfulData=[];//检验成功的数据
  var errorData=[];//检验失败的数据
  var rABS = false; //是否将文件读取为二进制字符串
  var defauleSelectCount=50;
  function MaximizeImport() {
    var pWid = $('#importDataTable').innerWidth(),
      phgt = $('#importDataTable').innerHeight();

    $('#showImportinfo, #showCheckDatainfo').datagrid({
      width: '100%',
      height: '100%'
    });
  }

  //打开上传文件的窗口
  function chooseFile() {
    $("#uploadFileWin").window("open");
  }


  function importf(obj) {//导入
    if (!obj.files) {
      return;
    }
    var f = obj.files[0];
    var reader = new FileReader();
    reader.onload = function (e) {
      var data = e.target.result;
      if (rABS) {
        wb = XLSX.read(btoa(fixdata(data)), {//手动转化
          type: 'base64'
        });
      } else {
        wb = XLSX.read(data, {
          type: 'binary'
        });
      }
      excelData = JSON.stringify(XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]));
      excelData = excelData.replace(/活动名称/g, "HD_NAME").replace(/活动开始时间/g, "HD_ST_DATE").replace(/活动结束时间/g, "HD_ED_DATE").replace(/接入号/g, "CONNECTNO").replace(/主推荐名称/g, "MAIN_COMMEND_NAME").replace(/主推推荐简介/g, "MAIN_COMMEND_INTRO").replace(/营销建议/g, "SALE_INFO").replace(/主推推荐类型/g, "MAIN_COMMEND_TYPE").replace(/次推推荐名称/g, "SC_COMMEND_NAME").replace(/次推推荐简介/g, "SC_COMMEND_INTRO").replace(/次推推荐类型/g, "SC_COMMEND_TYPE").replace(/顺销推荐名称/g, "DS_COMMEND_NAME").replace(/顺销推荐简介/g, "DS_COMMEND_INTRO").replace(/顺销推荐类型/g, "DS_COMMEND_TYPE")
      excelData = eval("(" + excelData + ")");
      console.log(excelData);

      successfulData=[];//检验成功的数据
      errorData=[];//检验失败的数据
    };
    if (rABS) {
      reader.readAsArrayBuffer(f);
    } else {
      reader.readAsBinaryString(f);
    }
  }

  //提交上传文件
  function submitList() {
    successfulData=[];
    errorData=[];//清空
    var cityId = window.location.pathname.substring(window.location.pathname.indexOf('Radar-') + 6, window.location.pathname.indexOf('Radar-') + 9) +"000000";
    var CONNECTNO = "";//接入号
    var HD_NAME = "";//活动名称
    for(var i=0;i<excelData.length;i++){
      CONNECTNO+=excelData[i].CONNECTNO +",";
      HD_NAME+=excelData[i].HD_NAME +",";
    }
    $.post('custom_dispatch_order!checkImportInfo.action', {
      city: cityId,
      connectNo:CONNECTNO.substring(0,CONNECTNO.length-1),
      hdName:HD_NAME.substring(0,HD_NAME.length-1)
    },function(data){
      checkInfo = eval("(" + data + ")");
      console.log(checkInfo);
      var result="";
      console.log(excelData);
      for(var i=0;i < excelData.length;i++){
       result="";
       excelData[i].checkResult='校验成功'
        excelData[i].HD_ST_DATE = crtTimeFtt(excelData[i].HD_ST_DATE);//时间格式化
        excelData[i].HD_ED_DATE = crtTimeFtt(excelData[i].HD_ED_DATE);
        if(excelData[i].HD_NAME == null || excelData[i].HD_NAME == ' '||excelData[i].HD_NAME == ''||excelData[i].HD_NAME == 'null' ||excelData[i].HD_NAME == undefined ){
          excelData[i].checkResult='校验失败';
          result += '活动名称为空、';
        }
        //活动开始时间不为空且是日期格式跳出if
        if(isNaN(Date.parse(excelData[i].HD_ST_DATE))){
          excelData[i].checkResult='校验失败';
          result += '活动开始时间不能为空并且格式需要正确、';
        }
        //活动结束时间不为空且是日期格式跳出if
        if(isNaN(Date.parse(excelData[i].HD_ED_DATE))){
          excelData[i].checkResult='校验失败';
          result += '活动结束时间不能为空并且格式需要正确、';
        }
        //接入号
        if(excelData[i].CONNECTNO ==undefined || excelData[i].CONNECTNO == null || excelData[i].CONNECTNO == ' ' ||excelData[i].CONNECTNO == '' ||excelData[i].CONNECTNO == 'null' ) {
          excelData[i].checkResult='校验失败';
          result += '接入号不能为空、';
        }
        if(checkInfo.data[i].connectNo=='false'){
          excelData[i].checkResult='校验失败';
          result += '请检查接入号输入是否正确、';
        }
        //主推荐名称
        if(excelData[i].MAIN_COMMEND_NAME==undefined ||excelData[i].MAIN_COMMEND_NAME == null || excelData[i].MAIN_COMMEND_NAME == ' '|| excelData[i].MAIN_COMMEND_NAME == ''|| excelData[i].MAIN_COMMEND_NAME == 'null' ) {
          excelData[i].checkResult='校验失败';
          result += '主推荐名称不能为空、';
        }
        //主推推荐简介
        if(excelData[i].MAIN_COMMEND_INTRO == undefined || excelData[i].MAIN_COMMEND_INTRO == null || excelData[i].MAIN_COMMEND_INTRO == ' '|| excelData[i].MAIN_COMMEND_INTRO == ''|| excelData[i].MAIN_COMMEND_INTRO == 'null' ) {
          excelData[i].checkResult='校验失败';
          result += '主推推荐简介不能为空、';
        }
        //判断该接入号是否属于该地市
        if(checkInfo.data[i].isCurrentCity=='false'){
          excelData[i].checkResult='校验失败';
          result += '改接入号不属于当前的地市、';
        }
        excelData[i].checkResult == '校验失败'?errorData.push(excelData[i]):successfulData.push(excelData[i]);
     

        excelData[i].something = result.substring(0,result.length-1);
      }

      $('#showImportinfo').datagrid('reload');
      $('#showImportinfo').datagrid('loadData', excelData);
      importData();//插入检验成功的数据
      $("#uploadFileWin").window("close");
    });

  }

  var jsono = [{ //导出模板数据
    "活动名称": "必填",
    "活动开始时间": "必填(格式为:2018-10-15 00:00:00)",
    "活动结束时间": "必填(格式为:2018-10-15 00:00:00)",
    "接入号": "必填",
    "主推荐名称": "必填",
    "主推推荐简介": "必填",
    "营销建议": "",
    "主推推荐类型": "",
    "次推推荐名称": "",
    "次推推荐简介": "",
    "次推推荐类型": "",
    "顺销推荐名称": "",
    "顺销推荐简介": "",
    "顺销推荐类型": ""
  }];
  var tmpDown; //导出的二进制对象
  function exportExcel(json, type) {
    var tmpdata = json[0];
    json.unshift({});
    var keyMap = []; //获取keys
    //keyMap =Object.keys(json[0]);
    for (var k in tmpdata) {
      keyMap.push(k);
      json[0][k] = k;
    }
    var tmpdata = [];//用来保存转换好的json
    json.map((v, i) => keyMap.map((k, j) => Object.assign({}, {
      v: v[k],
      position: (j > 25 ? getCharCol(j) : String.fromCharCode(65 + j)) + (i + 1)
    }))).reduce((prev, next) => prev.concat(next)).forEach((v, i) => tmpdata[v.position] = {
      v: v.v
    });
    var outputPos = Object.keys(tmpdata); //设置区域,比如表格从A1到D10
    var tmpWB = {
      SheetNames: ['mySheet'], //保存的表标题
      Sheets: {
        'mySheet': Object.assign({},
          tmpdata, //内容
          {
            '!ref': outputPos[0] + ':' + outputPos[outputPos.length - 1] //设置填充区域
          })
      }
    };
    tmpDown = new Blob([s2ab(XLSX.write(tmpWB,
      {bookType: (type == undefined ? 'xlsx':type),bookSST: false, type: 'binary'}//这里的数据是用来定义导出的格式类型
    ))], {
      type: ""
    }); //创建二进制对象写入转换好的字节流
    var href = URL.createObjectURL(tmpDown); //创建对象超链接
    document.getElementById("hf").href = href; //绑定a标签
    document.getElementById("hf").click(); //模拟点击实现下载
    setTimeout(function() { //延时释放
      URL.revokeObjectURL(tmpDown); //用URL.revokeObjectURL()来释放这个object URL
    }, 100);
  }

  function s2ab(s) { //字符串转字符流
    var buf = new ArrayBuffer(s.length);
    var view = new Uint8Array(buf);
    for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
    return buf;
  }
  // 将指定的自然数转换为26进制表示。映射关系:[0-25] -> [A-Z]。
  function getCharCol(n) {
    let temCol = '',
      s = '',
      m = 0
    while (n > 0) {
      m = n % 26 + 1
      s = String.fromCharCode(m + 64) + s
      n = (n - m) / 26
    }
    return s
  }



  //导出检验结果
  function exportCheckResult() {
     $.messager.alert("提示", "导出校验结果成功"); 
  }



  //判断时间格式
  String.prototype.isDate = function() {

    var r = this.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/);
    var r1 = this.match(/^(\d{1,4})(-|\/)(\d{1,1})\2(\d{1,2})$/);
    var r2 = this.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,1})$/);
    var r3 = this.match(/^(\d{1,4})(-|\/)(\d{1,1})\2(\d{1,1})$/);

    if(r == null || r1 != null || r2 != null || r3 != null) {
      return false;
    } else {
      var d = new Date(r[1], r[3] - 1, r[4]);
      return(d.getFullYear() == r[1] && (d.getMonth() + 1) == r[3] && d.getDate() == r[4]);
    }
  };

  //到期日期转换
  function formatRes(value, row, index) {
    var expireDate = row.expireDate;//到期日期
    var result;

    if(expireDate == '2099-01-01 00:00:00.0'){
      result = '';
    }
    return result;
  }



  //验证时分秒
  String.prototype.isTime = function()
  {
    var r = this.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/);
    if(r==null)return false; var d = new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]);
    return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]&&d.getHours()==r[5]&&d.getMinutes()==r[6]&&d.getSeconds()==r[7]);
  };

  //导出客户信息(条件导出)
  function clientExport() {

        location.href = "custom_dispatch_order!searchOrderInfo.action?strTime="+$("#staTime").attr("value")+"&endTime="+$("#overTime").attr("value")+"&staPosition=0&endPosition=0&type=1";



  }


  function importData(){
    console.log(successfulData);
                    Load();
    $.post('custom_dispatch_order!importInfo.action', {
      importData: JSON.stringify(successfulData)
    },function(data){
        dispalyLoad();
       $("#exportData").val(JSON.stringify(excelData))
       $.messager.alert("提示", "导入成功的有"+successfulData.length+"条数据,导入失败的有"+errorData.length+"条数据");
  
    });
  }










  //查询按钮
  function searchEnd() {
                Load();
  $.post('custom_dispatch_order!searchOrderInfo.action', {
      strTime: $("#staTime").attr("value"),
      endTime: $("#overTime").attr("value"),
      staPosition: 0,
      endPosition: defauleSelectCount,
      type:0
    },function(data){
    dispalyLoad();
     jsonObj = eval("(" + data + ")");
     console.log(jsonObj);
     $('#pp').pagination({
        total: jsonObj.count,
        pageNumber: 1,
        });
    $('#clientGrid').datagrid('reload');
    $('#clientGrid').datagrid('loadData', jsonObj.data);    
    });


  }
  
  function getDataByPageRows(pageNum, rowsLimit) {
             defauleSelectCount=rowsLimit;
                var infoMarketInfo = null; //表格的数据
            
                $("#clientGrid").datagrid("loadData", {
                    total: 0,
                    rows: []
                });
                Load();
                $.post("custom_dispatch_order!searchOrderInfo.action", {
                        staTime: $("#staTime").attr("value"),
                        endTime: $("#overTime").attr("value"),
                        staPosition: (pageNum-1) * rowsLimit,
                        endPosition: pageNum * rowsLimit,
                        type: 0
                    },
                    function(data) {
                        dispalyLoad();
                            jsonObj = eval("(" + data + ")");
                            console.log(jsonObj);
                            $('#clientGrid').datagrid('reload');
                            $('#clientGrid').datagrid('loadData', jsonObj.data);                

                    });

            }






  //导入模块弹窗
  function importDataModel() {
    //清空表格导入和校验的数据
    $('#showImportinfo').datagrid('loadData',{total:0,rows:[]});
    $('#showCheckDatainfo').datagrid('loadData',{total:0,rows:[]});
    //导入、校验、信息生成必须按顺序操作否则不能成功
    $('input[id="inputID"]').val(2);
    //导入前禁用校验、信息生成、导出校验结果以及修改样式
    $('#bufe').prop("disabled",true);
    $("#bufe").css({"color":"white","background":"#D3D3D3"});
    $("#importDataTable").window("open");
  }

  //日期时间格式化
  function formatDate(value) {
    if(isNaN(value) && !isNaN(Date.parse(value))) {
      var date = new Date(value);
      return date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate();
    } else {
      return value;
    }
  }
  //创建时间格式化显示
function crtTimeFtt(value){
   var crtTime = new Date(value);
   var time = value!=undefined?dateFtt("yyyy-MM-dd hh:mm:ss",crtTime):value;
   return time;     
}
  
  function dateFtt(fmt,date)   
{   
  var o = {   
    "M+" : date.getMonth()+1,                 //月份   
    "d+" : date.getDate(),                    //日   
    "h+" : date.getHours(),                   //小时   
    "m+" : date.getMinutes(),                 //分   
    "s+" : date.getSeconds(),                 //秒   
    "q+" : Math.floor((date.getMonth()+3)/3), //季度   
    "S"  : date.getMilliseconds()             //毫秒   
  };   
  if(/(y+)/.test(fmt))   
    fmt=fmt.replace(RegExp.$1, (date.getFullYear()+"").substr(4 - RegExp.$1.length));   
  for(var k in o)   
    if(new RegExp("("+ k +")").test(fmt))   
  fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));   
  return fmt;   
}

function chenkInfo(value){
if(value!='校验失败'){
  return "校验成功";
 }else{
 return value;
 }
 

}

function isNull(value){
if(value=='null' || value ==null || value==undefined){
return "";
}else{
return value;
}

}


</script>

</html>

后端代码

package net.radar.action.admin;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.annotation.Resource;

import net.radar.bean.ResponsePage;
import net.radar.entity.DispatchOrder;
import net.radar.entity.PermissionCascade;
import net.radar.service.AdminService;
import net.radar.service.CustomDispatchOrderService;
import net.radar.service.PermissionCascadeService;
import net.radar.util.DateOpUtil;
import net.radar.util.JsonUtil;
import net.radar.util.SpringUtil;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.JSONArray;

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.struts2.convention.annotation.ParentPackage;



@ParentPackage("admin")
public class CustomDispatchOrderAction extends BaseAdminAction {
    private static final long serialVersionUID = 1L;
    private String company;
    private String serviceCenter;
    private String area;
    private String city;
    private String keyid;
    private String grid;
    private String hdName;
    private String connectNo;
    private String strTime;
    private String endTime;
    private String type;
    private String staPosition;
    private String endPosition;
    private String exportData;

    private String importData;

    @Resource(name = "CustomDispatchOrderServiceImpl")
    private CustomDispatchOrderService customDispatchOrderService;
    
    @Resource(name = "adminServiceImpl")
    private AdminService adminService;


    public String list() {
        return LIST;
    }

    // 查询派单信息
    public String searchOrderInfo() {
        Map<String, Object> map = customDispatchOrderService.searchOrderInfo(strTime, endTime,type,staPosition,endPosition);
        if(Integer.parseInt(type)==1){
            String result = JsonUtil.toJson(map);
            ReportExportAction tt = new ReportExportAction();
            JSONObject jsStr = JSONObject.fromObject(result);
            String expertInfo = jsStr.get("data").toString();
            tt.customDispatchOrderExport(expertInfo);
        }
         return ajax(JsonUtil.toJson(map));
    }

    public String checkImportInfo() {
        Map<String, Object> map = new HashMap<String, Object>();
        String[] actNameArray = hdName.split(",");
        String[] connectNoArray = connectNo.split(",");

        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

        for (int i = 0; i < actNameArray.length; i++) {
            Map<String, Object> obj = new HashMap<String, Object>();
            // 判断活动名称是否为空则插入数据
             customDispatchOrderService.isCheckActName(actNameArray[i]);
            
            // 判断接入号是否存在
            if (connectNoArray[i] == null || "null".equalsIgnoreCase(connectNoArray[i])
                    || "undefined".equalsIgnoreCase(connectNoArray[i]) || "".equalsIgnoreCase(connectNoArray[i])) {
                obj.put("connectNo", "flase");
                obj.put("isCurrentCity", "flase");// 接入号为空,则改派单也不属于当前地市
            } else {
                String result = customDispatchOrderService.isCheckConnectNo(connectNoArray[i]);
                if (result == "true") {
                    // 判断该派单所属地市
                    String orderCity = customDispatchOrderService.getCity(connectNoArray[i]);
                    if (orderCity.equals(city)) {
                        obj.put("isCurrentCity", "true");
                    } else {
                        obj.put("isCurrentCity", "flase");
                    }
                }
                obj.put("isCurrentCity", "flase");// 接入号查询不存在flase
                obj.put("connectNo", result);
            }

            list.add(obj);
        }

        map.put("data", list);

        return ajax(JsonUtil.toJson(map));
    }
    
    // 插入派单信息
        public void importInfo() {
            JSONArray jsonArray = JSONArray.fromObject(importData);
            @SuppressWarnings({ "unchecked", "rawtypes" })
            List<Map<String, Object>> mapListJson = (List) jsonArray;
            for (int i = 0; i < mapListJson.size(); i++) {
                Map<String, Object> obj = mapListJson.get(i);
                DispatchOrder  dispatchOrder = (DispatchOrder) JSONObject.toBean(
                        (JSONObject) obj, new DispatchOrder().getClass());
                //根据接入号查询网格ID,再查询网格ID的所有父节点
                List<PermissionCascade> allDirectParentNode = customDispatchOrderService.getAllDirectParentNodeNew(dispatchOrder.getCONNECTNO());
                //根据活动名称查新活动ID
                String HD_ID = customDispatchOrderService.getHdId(dispatchOrder.getHD_NAME());
                dispatchOrder.setHD_ID(HD_ID);
                for (int j = 0; j < allDirectParentNode.size(); j++) {
                    PermissionCascade p = allDirectParentNode.get(j);
                    switch(p.getGrade()){
                    case 5: //网格
                        dispatchOrder.setGRID_ID(p.getId());
                        break;
                    case 4://片区
                        dispatchOrder.setAREA_ID(p.getId());
                        String name  = p.getName();
                       if(name.equals("未划分片区")){
                            dispatchOrder.setREGIONAL_PIC("");//片区负责人
                       }else{
                            dispatchOrder.setREGIONAL_PIC(p.getId());//片区负责人
                       }
                        break;
                    case 3://营服
                        dispatchOrder.setBRANCH_ID(p.getId());
                        break;
                    case 2://县份
                        dispatchOrder.setSUBST_ID(p.getId());
                        break;
                    case 1://地市
                        dispatchOrder.setCITY_ID(p.getId());
                        break;
                     default:
                         dispatchOrder.setPROV_ID("1");
                        break;
                    }
                }

                dispatchOrder.setKEYID(Long.toString(DateOpUtil.randomTimestampId()));//keyId
                dispatchOrder.setORDER_CODE("201"+Long.toString(DateOpUtil.randomTimestampId()));//keyId
                dispatchOrder.setORDER_TYPE("1");//工单类型为1
                dispatchOrder.setORDER_STATE("1");//工单状态为1
                dispatchOrder.setORDER_PROCESSING_STATE("1");//工单处理状态为1
                //根据接入号查询客户标识
                String clientMark = customDispatchOrderService.getClientMark(dispatchOrder.getCONNECTNO());
                dispatchOrder.setCLIENT_MARK(clientMark);//工单处理状态为1
                AdminService adminServiceImpl = (AdminService) SpringUtil
                        .getBean("adminServiceImpl");
                String loginUserId =  adminServiceImpl.getLoginAdmin().getId();
                dispatchOrder.setUSER_ID(loginUserId);
                //插入数据
                customDispatchOrderService.insertOrder(dispatchOrder);

            }
    

        
        }
        //导出检验结果
        public String checkExport() {
            ReportExportAction tt = new ReportExportAction();
            tt.checkResultExport(exportData);
            return ajax("导出成功");
            
        }


    public String getCompany() {
        return company;
    }

    public void setCompany(String company) {
        this.company = company;
    }

    public String getServiceCenter() {
        return serviceCenter;
    }

    public void setServiceCenter(String serviceCenter) {
        this.serviceCenter = serviceCenter;
    }

    public String getArea() {
        return area;
    }

    public void setArea(String area) {
        this.area = area;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getKeyid() {
        return keyid;
    }

    public void setKeyid(String keyid) {
        this.keyid = keyid;
    }

    public String getGrid() {
        return grid;
    }

    public void setGrid(String grid) {
        this.grid = grid;
    }

    
    public String getHdName() {
        return hdName;
    }

    public void setHdName(String hdName) {
        this.hdName = hdName;
    }

    public String getConnectNo() {
        return connectNo;
    }

    public void setConnectNo(String connectNo) {
        this.connectNo = connectNo;
    }

    public String getStrTime() {
        return strTime;
    }

    public void setStrTime(String strTime) {
        this.strTime = strTime;
    }

    public String getEndTime() {
        return endTime;
    }

    public void setEndTime(String endTime) {
        this.endTime = endTime;
    }

    public String getImportData() {
        return importData;
    }

    public void setImportData(String importData) {
        this.importData = importData;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getStaPosition() {
        return staPosition;
    }

    public void setStaPosition(String staPosition) {
        this.staPosition = staPosition;
    }

    public String getEndPosition() {
        return endPosition;
    }

    public void setEndPosition(String endPosition) {
        this.endPosition = endPosition;
    }

    public String getExportData() {
        return exportData;
    }

    public void setExportData(String exportData) {
        this.exportData = exportData;
    }

    
}

导出功能(2)

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title></title>
</head>

<body>
    <button onclick="downloadExl(jsono)">导出</button>
    <script src="http://oss.sheetjs.com/js-xlsx/xlsx.full.min.js"></script>
    <!--调用FileSaver saveAs函数可以实现文件下载-->
    <!--<script src="http://sheetjs.com/demos/Blob.js"></script>
    <script src="http://sheetjs.com/demos/FileSaver.js"></script>-->
    <script>
        //如果使用 FileSaver.js 就不要同时使用以下函数
        function saveAs(obj, fileName) {//当然可以自定义简单的下载文件实现方式 
            var tmpa = document.createElement("a");
            tmpa.download = fileName || "下载";
            tmpa.href = URL.createObjectURL(obj); //绑定a标签
            tmpa.click(); //模拟点击实现下载
            setTimeout(function () { //延时释放
                URL.revokeObjectURL(obj); //用URL.revokeObjectURL()来释放这个object URL
            }, 100);
        }
        var jsono = [{ //测试数据
            "保质期临期预警(天)": "adventLifecycle",
            "商品标题": "title",
            "建议零售价": "defaultPrice",
            "高(cm)": "height",
            "商品描述": "Description",
            "保质期禁售(天)": "lockupLifecycle",
            "商品名称": "skuName",
            "商品简介": "brief",
            "宽(cm)": "width",
            "阿达": "asdz",
            "货号": "goodsNo",
            "商品条码": "skuNo",
            "商品品牌": "brand",
            "净容积(cm^3)": "netVolume",
            "是否保质期管理": "isShelfLifeMgmt",
            "是否串号管理": "isSNMgmt",
            "商品颜色": "color",
            "尺码": "size",
            "是否批次管理": "isBatchMgmt",
            "商品编号": "skuCode",
            "商品简称": "shortName",
            "毛重(g)": "grossWeight",
            "长(cm)": "length",
            "英文名称": "englishName",
            "净重(g)": "netWeight",
            "商品分类": "categoryId",
            "这里超过了": 1111.0,
            "保质期(天)": "expDate"
        }];
        const wopts = { bookType: 'xlsx', bookSST: false, type: 'binary' };//这里的数据是用来定义导出的格式类型
        // const wopts = { bookType: 'csv', bookSST: false, type: 'binary' };//ods格式
        // const wopts = { bookType: 'ods', bookSST: false, type: 'binary' };//ods格式
        // const wopts = { bookType: 'xlsb', bookSST: false, type: 'binary' };//xlsb格式
        // const wopts = { bookType: 'fods', bookSST: false, type: 'binary' };//fods格式
        // const wopts = { bookType: 'biff2', bookSST: false, type: 'binary' };//xls格式

        function downloadExl(data, type) {
            const wb = { SheetNames: ['Sheet1'], Sheets: {}, Props: {} };
            wb.Sheets['Sheet1'] = XLSX.utils.json_to_sheet(data);//通过json_to_sheet转成单页(Sheet)数据
            saveAs(new Blob([s2ab(XLSX.write(wb, wopts))], { type: "application/octet-stream" }), "这里是下载的文件名" + '.' + (wopts.bookType=="biff2"?"xls":wopts.bookType));
        }
        function s2ab(s) {
            if (typeof ArrayBuffer !== 'undefined') {
                var buf = new ArrayBuffer(s.length);
                var view = new Uint8Array(buf);
                for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
                return buf;
            } else {
                var buf = new Array(s.length);
                for (var i = 0; i != s.length; ++i) buf[i] = s.charCodeAt(i) & 0xFF;
                return buf;
            }
        }
    </script>
</body>
</html>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,389评论 25 707
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,680评论 2 59
  • 两周前,迷上了《国家宝藏》。不但全家总动员看,而且把链接发到了班级群里,学校同事群里,希望每一个学生都能去看,希望...
    王小唐阅读 590评论 0 3
  • 季康子问:“使民敬、忠以劝,如之何?”子曰:“临之以庄,则敬;孝慈,则忠;举善而教不能,则劝。” “季康子”姓季孙...
    冯静老师阅读 363评论 0 1
  • 开始 并不认为那就是开始  ̄切都是那么的自然 后来 这种自然成为一种习惯 再后来 习惯左右了我 现在 习惯了你 只...
    散盐良雨阅读 202评论 0 2