使用AS3将xls转成Json

背景介绍:

早在2008年,AS3就已经有了三方类库as3xls封装了json / xml和xls之间的格式转换功能,但对中文支持较差(本人估计对所有双字节的和多字节的语种都支持不了)。多年以来这个类库并未随着office软件一起升级,现在几乎到了无法使用的地步。再次引用as圈中一个老鬼的话:现在的江湖已不再是我记忆中的江湖了...


给大家分享下我的方法吧:

1. 将xls保存为xml格式,如下图(一定要选2003格式哦)

2. 使用FileReference将保存的xml文件以二进制的格式读入到程序中并取出字符串

3. 用正则把这个xml字符串中的命名空间去掉

4.再把xml转换成Object

5.本地化存储Json文件

扫描二维码关注公众号,回复: 4932174 查看本文章


详见代码

package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.net.FileFilter;
	import flash.net.FileReference;
	import flash.net.URLLoader;
	import flash.utils.ByteArray;
	
	public class Tools003 extends Sprite
	{
		private var _file:FileReference;
		
		public function Tools003()
		{
			_file = new FileReference();
			_file.addEventListener(Event.SELECT, onSelect);
			_file.addEventListener(Event.COMPLETE, onComplete);
			stage.addEventListener(MouseEvent.CLICK , onClick)
			new Test()
		}
		
		
//Step1 选择文件并读取成字符串
		private function onClick($e:MouseEvent):void{
			var filter:FileFilter = new FileFilter("file" , "*.xml")
			_file.browse([filter]);
		}
		
		private function onSelect($e:Event):void{
			_file.load();
		}
		
		private function onComplete(e:Event):void{
			var byteArray:ByteArray = new ByteArray();
			byteArray = _file.data as ByteArray;
			byteArray.position = 0;
			var str:String = byteArray.readMultiByte(byteArray.length , "utf-8");
			trans2Json(str);
		}
		
//Step2 整理xml字符串为json
		private function trans2Json($str:String):void{
			$str = removeXMLNameSpace($str);	//移除xml中的命名空间
			var xml:XML = XML($str);
			var obj:Object = xml2Object(xml);
			
		}
		
		private function removeXMLNameSpace($str:String):String{
			var a:Array = findXMLNameSpace($str);
			//去除空间声明
			var r:RegExp = /xmlns[^"]+"[^"]+"/g;
			$str = $str.replace(r , "");
			
			//去除空间名使用
			for (var i:int = 0; i < a.length; i++){
				var s:String = a[i] + ":"
				r = new RegExp(s , "g");
				$str = $str.replace(r , "");
			}
			return $str;
		}
		
		private function findXMLNameSpace($str:String):Array{
			var arr:Array = new Array();
			var r:RegExp = /xmlns[^"]+"[^"]+"/g;
			var a:Array = $str.match(r);
			r = /xmlns:[^=]+=/g;
			for each (var s:String in a){
				var a1:Array = s.match(r);
				if(a1 && a1.length){
					s = a1[0];
					s = s.replace("xmlns:" ,"")
					s = s.replace("=","");
					arr.push(s);
				}
			}
			return arr;
		}
		
		private function xml2Object(xml:XML):Object{
			var obj = new Object();
			var ls:XMLList = xml.children();
			var atts:XMLList = xml.attributes();
			
			for each (var att:XML  in atts){
				obj[att.name().toString()]= att.toString();
			}
			
			if(ls.length() > 0){
				for each(var node:XML in ls){
					var objsub:Object = xml2Object(node);
					var tmp:Object = obj[node.name()];
					if(tmp==null){
						obj[node.name()]=objsub;
					}else if(tmp is Array){
						(tmp as Array).push(objsub);
					}
					else{
						obj[node.name()]=new Array(tmp,objsub);
					}
				}
			}
			return obj;
		}
		
//Step3 存储json文件
		private function save($o:Object):void{
			var byteArray:ByteArray = new ByteArray();
			byteArray = _file.data as ByteArray;
			byteArray.position = 0;
			var str:String = byteArray.readMultiByte(byteArray.length , "utf-8");
			trans2Json(str);
		}
	}
}


猜你喜欢

转载自blog.csdn.net/Aman1984/article/details/75000177