在Excel与Flex之间粘贴数据

试用过Google Spreadsheets的朋友,可能发现其一个有意思的特性,我们可以直接将Excel中的多行数据直接复制插入到Google Spreadsheets中(OpenOffice也可以直接复制过去),没尝试过的朋友可以马上按如下步骤测试下:
在Excel(或OpenOffice Calc)中选择多行数据,敲Ctrl+C键,复制选择的多行数据:
然后到Google Spreadsheets,敲Ctrl+V键,前面复制的单元格就被复制过来了:
这是如何做到的呢?其实很简单,在Excel(OpenOffice Calc)中,当多个单元格被复制时,这些单元格的数据是以tab键分隔一行行数据(tab-separated values (TSV))存放在剪贴板中的,当这些数据被粘贴到Google Spreadsheets中时,这些TSV格式的数据被解析并被相应插入到Google Spreadssheets中了。
既然知道其中的奥妙,那么剩下的就是在Flex中实现同样的效果了。以下是我们的实现思路,可以在Excel和Flex相互直接复制粘贴数据。
我们的思路的精妙所在是隐藏文本(TextField)组件的使用:
在DataGrid中,当按下Ctrl键时,我们创建一个隐藏的文本(TextField)组件,并将焦点定位给它,这样,我们就可以接受任何通过Ctrl+V粘贴过来的数据。相应的我们也将DataGrid选择行数据以TSV格式拷贝到TextField组件中,并且将所有的文本选择,这样我们使用Ctrl+C操作就可以复制当前行所有数据了。
监听隐藏文件组件的textInput事件。如果有任何数据被粘贴的话,那么在这里数据将被解析,并插入到DataGrid中。
当Ctrl键释放后,移除隐藏的文本组件。
以下是完整实现示例代码:

<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
    
<mx:Script>
        
<![CDATA[
            
import flash.events.KeyboardEvent;

            
private function dataGridKeyDownHandler(event:KeyboardEvent):void
            
{
                
if (event.ctrlKey && !dataGrid.getChildByName("clipboardProxy"))
                
{
                    
// Add an invisible TextField object to the DataGrid 
                    var textField:TextField=new TextField();
                    textField.name
="clipboardProxy";
                    dataGrid.addChild(textField);
                    textField.visible
=false;

                    textField.type
=TextFieldType.INPUT;
                    textField.multiline
=true;

                    
// Populate the TextField with selected data in TSV format 

                    textField.text
=getTextFromItems(dataGrid.selectedItems);
                    textField.setSelection(
0, textField.text.length - 1);

                    
// Listen for textInput event 

                    textField.addEventListener(TextEvent.TEXT_INPUT,
                        clipboardProxyPasteHandler);

                    
// Set player-level focus to the TextField 

                    systemManager.stage.focus
=textField;
                }

            }


            
private function dataGridKeyUpHandler(event:KeyboardEvent):void
            
{
                
if (!event.ctrlKey)
                
{
                    var textField:TextField
=TextField(dataGrid
                        .getChildByName(
"clipboardProxy"));
                    
if (textField)
                        dataGrid.removeChild(textField);
                }

            }


            
private function clipboardProxyPasteHandler(event:TextEvent):void
            
{
                
// Extract values from TSV format and populate the DataGrid 

                var items:Array
=getItemsFromText(event.text);
                
for each (var item:Object in items)
                    dataGrid.dataProvider.addItem(item);
            }


            
private function getItemsFromText(text:String):Array
            
{
                var rows:Array
=text.split("\n");
                
if (!rows[rows.length - 1])
                    rows.pop();

                var columns:Array
=dataGrid.columns;
                var itemsFromText:Array
=[];

                
for each (var rw:String in rows)
                
{
                    var fields:Array
=rw.split("\t");

                    var n:
int=Math.min(columns.length, fields.length);
                    var item:Object
={};
                    
for (var i:int=0; i < n; i++)
                        item[columns[i].dataField]
=fields[i];
                    itemsFromText.push(item);
                }


                
return itemsFromText;
            }


            
private function getTextFromItems(items:Array):String
            
{
                var columns:Array
=dataGrid.columns;
                var textFromItems:String
="";

                
for each (var it:Object in items)
                
{
                    
for each (var c:DataGridColumn in columns)
                        textFromItems
+=it[c.dataField] + "\t";
                    textFromItems
+="\n";
                }


                
return textFromItems;
            }

        ]]
>
    
</mx:Script>

    
<mx:DataGrid id="dataGrid" editable="true" keyDown="dataGridKeyDownHandler(event)" keyUp="dataGridKeyUpHandler(event)">
        
<mx:columns>
            
<mx:DataGridColumn headerText="Scheduled Date" dataField="scheduledDate"/>
            
<mx:DataGridColumn headerText="Home Team" dataField="homeTeam"/>
            
<mx:DataGridColumn headerText="Away Team" dataField="awayTeam"/>
            
<mx:DataGridColumn headerText="Field" dataField="field"/>
        
</mx:columns>
        
<mx:dataProvider>
            
<mx:Object scheduledDate="4/1/2006" homeTeam="Chester Bucks" awayTeam="Long Valley Hitters" field="Dawn Field"/>
        
</mx:dataProvider>
    
</mx:DataGrid>
</mx:Application>

posted on 2010-10-25 09:56 aiaiwoo 阅读(396) 评论(0)  编辑  收藏 所属分类: AC3/FLEX


只有注册用户登录后才能发表评论。


网站导航:
 
<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

常用链接

留言簿

随笔分类

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜