我不相信除了Excel之外还有其他方式可以做到这一点,原因有几个:
As @Baz指出,文本编辑器也会打印三个单元格的内容。即使是Word也是如此。
例如,假设我在Excel中打开一个包含以下内容的电子表格:
![enter image description here](https://istack.dev59.com/43blN.webp)
然后在Word中插入一个新的Excel电子表格:
![enter image description here](https://istack.dev59.com/efMSL.webp)
当我们尝试复制并粘贴仅包含
A
和
C
的单元格时,我们得到了预期的结果:
![enter image description here](https://istack.dev59.com/c6D3X.webp)
但是,如果在将新电子表格添加到Word文档时Excel没有打开,我们会得到:
![enter image description here](https://istack.dev59.com/50SA6.webp)
对我来说,这似乎表明当在Word中添加电子表格时仍然打开Excel时,Excel的实例以某种方式被共享,这是它知道要粘贴哪些单元格的唯一方式。(我正在使用Office 365)
据我所知,Excel不会将任何内容放入剪贴板以指示选择了哪些单元格。考虑到在关闭Excel后将其粘贴到Word中的结果,这是Excel在仅复制包含
A
和
C
的单元格时放入剪贴板的XML:
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
<Styles>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Bottom"/>
<Borders/>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
</Styles>
<Worksheet ss:Name="Sheet1">
<Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="3"
ss:DefaultRowHeight="15">
<Row>
<Cell><Data ss:Type="String">A</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="String">B</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="String">C</Data></Cell>
</Row>
</Table>
</Worksheet>
</Workbook>
请注意,剪贴板内容中包含所有三个单元格的数据,并没有任何指示哪些单元格被选中。
为了获取这个XML,我扩展了“XML电子表格”类型的ByteArrayTransfer类,只是将其写入文件。
public class ExcelTransfer extends ByteArrayTransfer {
private static final String TYPE_NAME = "XML Spreadsheet";
private static final int TYPE_ID = registerType(TYPE_NAME);
private static final ExcelTransfer _instance = new ExcelTransfer();
private ExcelTransfer() {
}
public static ExcelTransfer getInstance() {
return _instance;
}
@Override
protected int[] getTypeIds() {
return new int[] { TYPE_ID };
}
@Override
protected String[] getTypeNames() {
return new String[] { TYPE_NAME };
}
@Override
protected void javaToNative(final Object object, final TransferData transferData) {
}
@Override
protected Object nativeToJava(final TransferData transferData) {
if (!isSupportedType(transferData)) {
return null;
}
final byte[] buffer = (byte[]) super.nativeToJava(transferData);
if (buffer == null) {
return null;
}
final File f = new File("excel_clipboard.xml");
try {
f.createNewFile();
final FileOutputStream fo = new FileOutputStream(f);
fo.write(buffer);
fo.close();
} catch (final IOException e) {
e.printStackTrace();
}
}
}
已复制单元格,运行以下命令:
public static void main(final String... args) {
new Clipboard(Display.getDefault()).getContents(ExcelTransfer.getInstance());
}