`

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里的内容仍然能显示完整吗 ?

相关推荐

    Flex利用as3xls导入excel数据表

    as3xls库通过处理UTF-8编码确保在导入时不会出现乱码问题。 4. **源码和工具**: 博文提供的源码示例可以帮助开发者更好地理解如何在实际项目中应用as3xls库。通常,这样的示例会展示如何初始化库,加载文件,以及...

    flex前台直接导出excel

    总结起来,"flex前台直接导出excel"是一种优化用户体验的技术手段,通过在前端生成Excel文件,既可以解决字符编码问题,又能减少服务器的工作量。开发者需要了解并掌握相关的库和API,才能在Flex应用中顺利实现这个...

    as3xls-1.0.1.swc

    通过AS3XLS,开发者可以轻松地将Flex Datagrid中的数据转换成Excel格式,满足用户的数据导出需求。 二、1.0.1版本改进 相比之前的1.0版本,AS3XLS-1.0.1进行了重要的更新和优化。其中最显著的改进是对中文字符的...

    Flex使用as3xlsUTF8.swc库文件导出Excel

    `as3xlsUTF8`库是基于`as3xls`库进行改进的,主要解决了中文字符在Excel中乱码的问题。`as3xls`库是由Jeroen van Rijswijk开发的一个开源项目,它提供了对Microsoft Excel文件(.xls)的完全读写功能,但默认情况下...

    plsql导出数据到excel的三种方法

    2. **导出数据**:在查询结果集上,即在结果显示区域(注意不要选中任何具体的行或单元格),点击鼠标右键,选择【Copy to Excel】选项下的【Copy as xls/xlsx】,将数据导出为Excel文件。需要注意的是,根据PL/SQL ...

    Flex as3xlsUTF8导出Excel类库文档API

    `as3xlsUTF8` 是一个专门用于处理Excel文件的开源库,它支持Unicode编码(UTF-8),这意味着你可以处理包含多种语言的数据而不用担心字符乱码问题。该库的核心在于提供了一套API,使得在AS3中创建、修改和读取Excel...

    PBdatawindow导出excel函数

    ### PBdatawindow导出Excel函数知识点详解 #### 函数概述 在PowerBuilder应用程序开发中,经常需要将数据窗口(DataWindow)对象中的数据导出到Excel文件中,以方便进行进一步的数据处理或分享。本文档介绍了一个名...

    php 导出excel表数据

    下面我们将深入探讨如何使用PHPExcel库导出包含中文数据的Excel表格,并解决UTF-8编码的问题。 首先,要使用PHPExcel库,你需要先将其下载并引入到你的项目中。PHPExcel库通常包含多个类文件,这些文件提供了操作...

    完美解决phpexcel导出到xls文件出现乱码的问题

    以下是一个具体的解决方案,用于解决使用PHPExcel导出到.xls文件时出现的乱码问题。 首先,确保已经正确安装了PHPExcel库。在示例代码中,我们看到`include 'global.php';`,这意味着全局配置文件已经被引入,其中...

    flex读取excel(含中文字符)的解决

    本文将探讨如何在Adobe Flex中读取包含中文字符的Excel文件,主要涉及使用AS3XLS库来解决这个问题。 首先,AS3XLS是一个ActionScript 3的开源库,专门用于处理Microsoft Excel文件。它允许Flex应用程序创建、读取和...

    GridView导出Excel方法

    ### GridView导出Excel方法 #### 一、概述 在日常工作中,经常需要将网页上的数据导出至Excel文件,方便用户进行数据查看或进一步处理。本文档将详细介绍一种使用GridView控件导出数据到Excel的方法,并提供代码...

    vb.net页面内容导出Excel,.net改改就可以用,2003 2007都能开

    ### vb.net页面内容导出Excel实现方法 在本篇文章中,我们将探讨如何使用VB.NET将Web页面的内容导出到Excel文件中。此方法不仅适用于不同版本的Excel(如2003、2007等),而且能够很好地保留网页原有的布局和格式。...

    Oracle 使用TOAD实现导入导出Excel数据

    选中该表,右键点击“Save as...”,在弹出的对话框中,选择保存类型为"XLS Instance",这是为了确保Excel文件能正确处理中文字符,避免出现乱码问题。如果遇到长数字型字符串被自动格式化的问题,应勾选“String ...

    MySQL实现导出excel的方法分析

    MySQL 实现导出 Excel 文件的方法主要涉及数据库查询和文件输出技术。在 MySQL 中,可以直接使用 SQL 命令将数据导出为 CSV 或其他文本格式,这些格式可以被大多数电子表格软件如 Microsoft Excel 识别。一种简单的...

    使用PHPExcel实现数据批量导出为excel表格的方法(必看)

    导出excel表格 ``` 这里的`./Process1.php`是后台处理页面的URL,当用户点击超链接时,会向这个页面发送请求。 **后台处理页面 (Process.php)** 在后台处理页面,我们需要实现数据的读取和Excel文件的生成。以下...

    Check-xls-table-character-conversion.rar_Table_xls

    在导入或导出这些数据时,如果不进行正确的编码转换,可能会导致乱码问题。因此,我们需要了解如何在Python中使用`openpyxl`、`pandas`等库进行编码设置,或者在VBA脚本中使用`TextToColumns`函数来指定不同的字符...

    Excel文档转换为文本文件

    `to_csv`函数被用来实现这个转换,其中`index=False`表示不保存行索引,`sep='\t'`设置字段间的分隔符为制表符,`encoding='utf-8'`确保文件使用UTF-8编码,这是常见的文本文件编码标准,可以避免字符乱码问题。...

    PHP导出Excel实例讲解

    如果在导出Excel时遇到中文乱码的问题,可以尝试以下方法: 1. **确保编码正确**:确认PHP脚本的字符集设置为UTF-8。 2. **使用正确的文件类型**:对于XLSX文件,确保使用`Excel2007`作为`PHPExcel_IOFactory::...

    dcr.rar_DBF_dbf excel_dbf to

    标题中的"**dcr.rar_DBF_dbf excel_dbf to**"表明我们要讨论的是关于将`.dbf`文件转换为更常见且易于操作的Excel格式(`.xls`或`.xlsx`)的过程。描述中提到的".dbf文件处理,转化为excel"进一步确认了这个主题。现在...

    黄国酬的dw2xls已升级至pb11.5

    通过对dw2xls工具的升级,我们解决了从PB 9到PB 11.5版本迁移过程中遇到的字符串编码问题。主要关注点包括API函数的定义变化、字符串编码转换函数的选择等。通过上述改进措施,确保了程序在PB 11.5中的兼容性和稳定...

Global site tag (gtag.js) - Google Analytics