js处理xml文件,成execl格式

简介:

js读取,xml的Dom,然后处理,最后用"\t","\n",整理成execl规整的格式。

搜了一圈,没有合适的,主要格式问题。

xml是每条包含,所有属性/值,excel需要的是,第一行属性名,其余行值。

并非通用,仅代表如下格式,

<dom>

        <xxx>

                <Row  XXX="111", xxxx = "222"></Row>

                <Row  XXX="111", xxxx = "222"></Row>

                <Row  XXX="111", xxxx = "222"></Row>

.....

就直接js处理了,

思路,nginx + js,

三个问题,

1.服务器,用nginx起了,配置里映射了8877端口,

2.跨域,搜了半天,在nginx配置里,粘贴了几句,就好了

3.读写文件,直接搜,调试着用。

/*
*主逻辑入口,链接开起,关闭。
*/

//文件名
var strName="";

//最终字符串
var strss="";




//写函数
function doSave(value, type, name) {

  var blob;

  if (typeof window.Blob == "function") {

    blob = new Blob([value], {

      type: type

    });

  } 
  // else {

  //   var BlobBuilder = window.BlobBuilder || window.MozBlobBuilder || window.WebKitBlobBuilder || window.MSBlobBuilder;

  //   var bb = new BlobBuilder();

  //   bb.append(value);

  //   blob = bb.getBlob(type);

  // }

  var URL = window.URL || window.webkitURL;

  var bloburl = URL.createObjectURL(blob);

  var anchor = document.createElement("a");

  if ('download' in anchor) {

    anchor.style.visibility = "hidden";

    anchor.href = bloburl;

    anchor.download = name;

    document.body.appendChild(anchor);

    var evt = document.createEvent("MouseEvents");

    evt.initEvent("click", true, true);

    anchor.dispatchEvent(evt);

    document.body.removeChild(anchor);

  } 
  // else if (navigator.msSaveBlob) {

  //   navigator.msSaveBlob(blob, name);

  // } else {

  //   location.href = bloburl;

  // }

}

let httpRequest = new XMLHttpRequest(); 

//读到文件后的处理
function ff(){
    if(httpRequest.readyState === 4){
        if(httpRequest.status === 200 || httpRequest.status == 0){
            
            var allText = httpRequest.responseText;
            //document
            let a = httpRequest.responseXML;
            //array rows
            let b = a.getElementsByTagName("Row");

            //存储 每条数据
            let nameArr = [];
            //最后所有数据 加成字符串 到str里
            let str = "";
            //特殊处理 第一行,获得所有属性名
            let first=true;

            for(let i = 0; i < b.length; i++){

                let t = b[i];
                let atr = t.attributes;
                let l = atr.length
                let obj = {};
                for(let j = 0; j < l; j++){

                    let name = atr[j]["name"];
                    let value = atr[j]["value"];
                    obj[name] = value;
                    if(first){
                        str += name+"\t";
                    }

                }
                first = false;
                nameArr.push(obj);
            }
            
            str += "\n";


            for(let p = 0; p < nameArr.length; p++){
                for(var ap in nameArr[p]){
                    let s = nameArr[p][ap] ;
                    str += s + "\t";
                    //想手动对齐,结果\t自己处理好了
                    // let ll = s.length < 10?10:(s.length+1);
                    // for(let d = s.length;d < ll;d++){
                    //     str+=" ";
                    // }

                }
                str += "\n";
            }
            
            console.log(str);
            strss = str;

        }
    }
}

 
//这里是触发,绑定 button 在html处理下,

// var name = window.getElementsById("fileName");

// httpRequest.open('GET', "http://localhost:8877/"+strName+".xml", true);

// httpRequest.send();


// httpRequest.onreadystatechange = ff;


//doSave("11", "text/latex", "hello.txt");




//默认
server {
        listen 80;
        index index.html;
        root /;
}

//你要加的
server {
        add_header 'Access-Control-Allow-Origin' http://localhost:7456;
        add_header 'Access-Control-Allow-Credentials' true;
        add_header 'Access-Control-Allow-Headers' *;
        add_header 'Access-Control-Allow-Methods' *;
        add_header 'Access-Control-Expose-Headers' *; 
        

         listen 8877;
         index index.html;
        root /Users/xxx/xxx/;//这里要改成自己的,我是mac,windows要自己改下
 }


这是配置,文件,不懂的 很简单的,
nginx.conf文件,在里面 加上这个,
我是 用cocos写了界面,cocos自己用7456,
所以要 跨域解决下,
就相当于,nginx 将一个http请求 
http://loaclhost:8877/index.html 
映射到了/Users/xxx/xxx/index.html,这个文件

默认的配置文件 有server段,写在他旁边就行了,
和他同等地位,默认server是80,443等。

如果 用 其他语言 直接写,更简单点,因为,js读写文件和请求,就是很麻烦。

那样的话 ff 函数,是核心,解决对应格式的处理,

其余的 只是读/与写文件而已。

。。。。对 代码的一点解释:。。。。



    //写函数
    static doSave(value, type, name) {
        //创建 blob 一种 媒体 或文件载体
        var blob;
        if (typeof window.Blob == "function") {
            blob = new Blob([value], {
                type: type
            });
        } 
        var URL = window.URL || window.webkitURL;
        var bloburl = URL.createObjectURL(blob);
        //创建 跳转链接 标签
        var anchor = document.createElement("a");
        if ('download' in anchor) {
            anchor.style.visibility = "hidden";
            //将blob 与 a标签 绑定
            anchor.href = bloburl;
            anchor.download = name;
            document.body.appendChild(anchor);
            var evt = document.createEvent("MouseEvents");
            evt.initEvent("click", true, true);
            //代码 触发 a标签 点击事件,即跳转到blob,一般浏览器解释为下载文件
            anchor.dispatchEvent(evt);
            document.body.removeChild(anchor);
        } 
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值