简介:
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);
}
}