背景:
在Excel中执行Ctrl+V和Ctrl+C,Excel都会去OS粘贴板中获取和设置数据,具体它设置的是什么格式的没有研究过,但是如果按照字符串方式读取这些数据,那么想要把每个单元格的数据区分开,其实很简单。
Excel向OS粘贴板设置的数据,因为技术原因,只能以Text方式读取,那么同一行的每个单元格值之间是有一个制表位的(\t),每行数据之间是有一个回车符(\n),所以我们只需要按照\n分割字符串,然后在每个字符串中再按照\t分割,就可以得到每个cell的值了。向Excel中复制数据:思路很简单,把每个cell之间用\t隔开,每行之间用\n隔开。
基于JS的实现代码,基于Java的应该可以读取到更多信息,Java需要通过Swing来和clipboard交互,或者用其他程序读取了clipboard发给Java服务器(或处理程序)处理:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="jquery.js"></script>
<title>Copy Test</title>
<script>
$(document).ready(function() {
function pastHandler(e) {
var cp = e.clipboardData;
alert(cp);
window.console.debug(e);
}
$(document.body).bind({
copy: function(e) {
var cpTxt = "Id\t名称\t年龄\t\n2100102\tSaillen\t20\t\n";
var clipboardData = window.clipboardData; //for IE
if (!clipboardData) { // for chrome
clipboardData = e.originalEvent.clipboardData;
}
//e.clipboardData.getData('text/plain');
clipboardData.setData('Text', cpTxt);
//alert(cpTxt);
$('#message').text('Copy Data : ' + cpTxt);
return false;
},
paste: function(e) {
var eve = e.originalEvent
var cp = eve.clipboardData;
var data = null;
var clipboardData = window.clipboardData; // IE
if (!clipboardData) { //chrome
clipboardData = e.originalEvent.clipboardData
}
//解析
data = clipboardData.getData('Text');
var datas = data.split("\n");
var html = "<table border='1px' cellspacing='0' style='border-collapse: collapse;' >";
for (var i = 0; i < datas.length; i++) {
var row = datas[i].split("\t");
html += "<tr>";
for (var j = 0; j < row.length; j++) {
html += "<td>" + row[j] + "</td>";
}
html += "</tr>";
}
html += "</table>";
$('#message').html(html);
},
cut: function(e) {
return false;
}
});
});
</script>
</head>
<body>
<div id="ctx" style="margin: 0 auto;width: 600px;">
<h1 style="text-align: center;">Copy/Paste Demo</h1>
<h3>选中复制下面的表</h3>
<table border="1px" cellspacing="0" style="border-collapse: collapse;">
<tr>
<td>Id</td>
<td>名称</td>
<td>年龄</td>
</tr>
<tr>
<td>2100102</td>
<td>Saillen</td>
<td>20</td>
</tr>
</table>
<hr />
<input />
<h3>从外部复制的数据:</h3>
<div id="message"></div>
</div>
</body>
</html>
Excel复制出来的数据,最后会有一个\n,这回无形中多处一行数据。每行的单元格数据最后有一个\t,会让每行无形中多处一列。