背景介绍:
早在2008年,AS3就已经有了三方类库as3xls封装了json / xml和xls之间的格式转换功能,但对中文支持较差(本人估计对所有双字节的和多字节的语种都支持不了)。多年以来这个类库并未随着office软件一起升级,现在几乎到了无法使用的地步。再次引用as圈中一个老鬼的话:现在的江湖已不再是我记忆中的江湖了...
给大家分享下我的方法吧:
1. 将xls保存为xml格式,如下图(一定要选2003格式哦)
2. 使用FileReference将保存的xml文件以二进制的格式读入到程序中并取出字符串
3. 用正则把这个xml字符串中的命名空间去掉
4.再把xml转换成Object
5.本地化存储Json文件
详见代码
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);
}
}
}