`

as3 xls导出excel乱码问题解决办法

    博客分类:
  • flex
阅读更多

http://blog.csdn.net/Baijinwen/archive/2009/01/06/3722408.aspx

原创   as3xls开源项目的中文乱码问题 收藏

<script type="text/javascript"> document.body.oncopy = function() { if (window.clipboardData) { setTimeout(function() { var text = clipboardData.getData(&quot;text&quot;); if (text &amp;&amp; text.length&gt;300) { text = text + &quot;\r\n\n本文来自CSDN博客,转载请标明出处:&quot; + location.href; clipboardData.setData(&quot;text&quot;, text); } }, 100); } } </script><script type="text/javascript">function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&amp;u='+escape(d.location.href)+'&amp;c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>

as3xls,read and write Excle in Flex,开源项目首页: http://code.google.com/p/as3xls/

不过它对中文支持的不是很好,不知道现在有没有解决这个问题。有段时间我用过一下,曾经采取一个取巧的方式去解决,但我想并不是很好,如果有谁有更好的解决方法,或者已经对这个东东改造好的,给我一份,嘿嘿。

当初我临时解决的方式就是修改com/as3xls/xls/ExcelFile.as的大概255行那里:

  1.                          //var len:uint = String(value).length;
  2.                         var len: uint  = GetStringLength(String(value));           //Bryan update
  3.                         cell.data.writeByte(len);
  4.                          //cell.data.writeUTFBytes(value);
  5.                         cell.data.writeMultiByte(String(value), "cn-gb" );         //Bryan update

增加两个函数:

  1. //获取一个字符串的长度,如果是中文字符则  为2,其他的为1      bryan add          
  2.      private  function GetStringLength(objString:String): int
  3.     {
  4.         var temp: int  = 0;
  5.          for (var i: int =0;i<objString.length;i++)
  6.         {
  7.              if (isChinese(objString.substring(i,i+1)))
  8.             {
  9.                 temp += 2;
  10.             }
  11.              else {temp += 1;}
  12.         } 
  13.             
  14.          return  temp;
  15.     }
    package cn.ishion.excel.util
    {
    	import com.as3xls.biff.BIFFVersion;
    	import com.as3xls.biff.BIFFWriter;
    	import com.as3xls.biff.Record;
    	import com.as3xls.xls.ExcelFile;
    	import com.as3xls.xls.Sheet;
    	import com.as3xls.xls.Type;
    	
    	import flash.utils.ByteArray;
    	
    	import mx.utils.StringUtil;
    	
    	
    	//注释
    	
    	public class ConstomExcelFile extends ExcelFile
    	{
    		public function ConstomExcelFile()
    		{
    			
    		}
    		  private function GetStringLength(objString:String):int
         {
             var temp:int = 0;
             for(var i:int=0;i<objString.length;i++)
             {
                 if(isChinese(objString.substring(i,i+1)))
                 {
                     temp += 2;
                 }
                 else{temp += 1;}
             } 
                 
             return temp;
         }
         //判断是否是中文   bryan add
             private function isChinese(char:String):Boolean{
                 if(char == null){
                     return false;
                 }
                
                 char =  StringUtil.trim(char);
                 var pattern:RegExp = /^[\u0391-\uFFE5]+$/; 
                 var result:Object = pattern.exec(char);
                 if(result == null) {
                     return false;
                 }
                 return true;
             }
    		override public function saveToByteArray():ByteArray{
    		//	var s:Sheet = _sheets[0] as Sheet; //这行源代码 改成如下
    			var s:Sheet =super.sheets[0] as Sheet;
    			
    			var br:BIFFWriter = new BIFFWriter();
    			
    			// Write the BOF and header records
    			var bof:Record = new Record(Type.BOF);
    			bof.data.writeShort(BIFFVersion.BIFF2);
    			bof.data.writeByte(0);
    			bof.data.writeByte(0x10);
    			br.writeTag(bof);
    			
    			// Date mode
    			var dateMode:Record = new Record(Type.DATEMODE);
    			dateMode.data.writeShort(1);
    			br.writeTag(dateMode);
    			
    			// Store built in formats
    			var formats:Array = ["General", 
    				"0", "0.00", ",0", ",0.00", 
    				"", "", "", "",
    				"0%", "0.00%", "0.00E+00",
    				"?/?", "??/??",
    				"M/D/YY", "D-MMM-YY", "D-MMM", "MMM-YY"];
    			
    			var numfmt:Record = new Record(Type.BUILTINFMTCOUNT);
    			numfmt.data.writeShort(formats.length);
    			br.writeTag(numfmt);
    			
    			for(var n:uint = 0; n < formats.length; n++) {
    				var fmt:Record = new Record(Type.FORMAT);
    				fmt.data.writeByte(formats[n].length);
    				fmt.data.writeUTFBytes(formats[n]);
    				br.writeTag(fmt);
    			}
    			
    			var dimensions:Record = new Record(Type.DIMENSIONS);
    			dimensions.data.writeShort(0);
    			dimensions.data.writeShort(s.rows+1);
    			dimensions.data.writeShort(0);
    			dimensions.data.writeShort(s.cols+1);
    			br.writeTag(dimensions);
    			
    			for(var r:uint = 0; r < s.rows; r++) {
    				for(var c:uint = 0; c < s.cols; c++) {
    					var value:* = s.getCell(r, c).value;
    					var cell:Record = new Record(1);
    					cell.data.writeShort(r);
    					cell.data.writeShort(c);
    					
    					if(value is Date) {
    						var dateNum:Number = (value.time / 86400000) + 24106.667;
    						cell.type = Type.NUMBER;
    						cell.data.writeByte(0);
    						cell.data.writeByte(15);
    						cell.data.writeByte(0);
    						cell.data.writeDouble(dateNum);
    					} else if(isNaN(Number(value)) == false && String(value) != "") {
    						cell.type = Type.NUMBER;
    						cell.data.writeByte(0);
    						cell.data.writeByte(0);
    						cell.data.writeByte(0);
    						cell.data.writeDouble(value);
    					} else if(String(value).length > 0) {
    						cell.type = Type.LABEL;
    						cell.data.writeByte(0);
    						cell.data.writeByte(0);
    						cell.data.writeByte(0);
    					//	var len:uint = String(value).length; //源文 改成如下
    						var len:uint=this.GetStringLength(value);
    						cell.data.writeByte(len);
    					//	cell.data.writeUTFBytes(value);//这行源代码 改成如下
    						cell.data.writeMultiByte(value,"gbk");
    					} else {
    						cell.type = Type.BLANK;
    						cell.data.writeByte(0);
    						cell.data.writeByte(0);
    						cell.data.writeByte(0);
    					}
    					
    					br.writeTag(cell);
    				}
    			}
    			
    			
    			// Finally, the closing EOF record
    			var eof:Record = new Record(Type.EOF);
    			br.writeTag(eof);
    			
    			br.stream.position = 0;
    			return br.stream;
    		}
    
    	}
    }
     示例
  16. private function exportExcel():void{
    				var ex:ExcelFile=new ConstomExcelFile();
    				var arr:ArrayCollection=new ArrayCollection();
    				var sheet:Sheet=new Sheet();
    				sheet.header="dsafsdafsaf";
    				sheet.footer="foot";
    				sheet.name="hello";
    				 sheet.resize(10,10);
    				for(var i:int=0;i<10;i++){
    					 sheet.setCell(i,i,"大家好");
    					 
    					 trace(ex.sheets);
    					
    				}
    				 ex.sheets.addItem(sheet);
    				var file:File=File.desktopDirectory.resolvePath("test333.xls");
    				var fs:FileStream=new FileStream();
    				fs.open(file,FileMode.WRITE);
    			
    				fs.writeBytes(ex.saveToByteArray());
    				fs.close();
    				
    			}
     

分享到:
评论
1 楼 ieniac 2010-07-05  
ConstomExcelFile
// line 122
cell.data.writeByte(len);
楼主有没想过, 如果 len 超过了 byte 的范围,cell里的内容仍然能显示完整吗 ?

相关推荐

Global site tag (gtag.js) - Google Analytics