在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>
分享到:
相关推荐
flex中dataGrid导出数据到excel中,不存在乱码问题
AdvancedDataGrid导出复杂表头excel
Flex利用JSP导出Excel Flex利用JSP导出Excel
NULL 博文链接:https://189merlin.iteye.com/blog/1184251
本JavaWeb工程用于研究Flex与Servlet之间数据的交互 本工程编码方式:UTF-8 欢迎下载
flex air 导出excel表格(这个不支持中文)。。。。。。
flex与java结合的excel导出
原Rxlsx不支持日期格式,读取日期单元格的数据会变成数字,本人将excel的日期格式整理出来,并在读取的时候重新将数字转换回格式,进一步完善了类库的功能。该类库的用法非常简单,只需加载完成excel文件后执行: ...
FLEX 读取Excel数据,展示,可传入后台入库
使用java做后台,flex做前台的一个智能选择excel中的头标题与数据库的字段一一对应然后把excel中的数据自动导入数据中,本资料中含有具体代码并有注释一一解释.
Flex与java交换数据 Flex数据交换 Flex与java交换数据教程。
flex与PHP后台数据交互的学习小记,Flex与后台交互的方法
Flex 与其它数据访问技术的比较 使用 Flash Builder 访问数据服务 数据访问组件 第 2 章: 使用 Flash Builder 构建以数据为中心的应用程序 创建 Flex 项目以访问数据服务 连接数据服务 安装 Zend Framework ...
将flex中datagrid组件中数据导出到excel表格中。思路很简单,利用as将datagrid中的数据解析出来,传到后台java服务端处理,即可保存为excel文件。
flex主页面与弹出窗口之间数据传输的示例
抓取AMF协议的flex页面,支持模拟登录和页面抓取。
使用as3xls-1.0.1.SWC包做的Flex界面DateGrid数据导出Excel表格。
Flex 本地数据共享与压缩存储,因为flex本地共享空间存储数据有限,在面对大数据,如xml或大数组存储时,我们可能要考虑对数据进行压缩后再存;本类以xmllist 数据为例来进行压缩存储;
flex air 导出 excel 支持中文
一个as类,读取excel,使用是要对应自己的应用稍作改动,上传在mxml里即可读取excel数据