从Excel复制后剪贴板中奇怪的内容

我试图让我的应用程序中的剪贴板的内容,以确保excel兼容性,使用:

Clipboard clipboard = new Clipboard(Display.getDefault()); String contents = (String) clipboard.getContents(TextTransfer.getInstance()); 

问题是,如果我有一列[1,2,3],select单元格[1]和[3],那么在剪贴板内容中find

1 \ r \ N 2 \ r \ N3 \ r \ n

而不仅仅是1和3.换句话说,剪贴板似乎不处理脱节的单元格。

有人知道发生了什么吗?

我不相信Excel以外的这种可能性有两个原因:

  1. 正如@Baz指出的那样,文本编辑器也通过打印所有三个单元格的内容做出响应。 即使Word也这样做。

    例如,假设我在Excel中打开了一个电子表格,其中包含以下内容:

    在这里输入图像说明

    然后在Word中插入一个新的Excel电子表格:

    在这里输入图像说明

    当我们试图复制和粘贴只包含AC的单元格时,我们得到了预期的结果:

    在这里输入图像说明

    但是,如果将新电子表格添加到Word文档时未打开Excel,则会得到:

    在这里输入图像说明

    对我来说,这似乎表明,当电子表格添加到Word中时Excel仍然打开时,Excel的实例以某种方式共享,这是它知道要粘贴哪些单元格的唯一方法。 ( 我正在使用Office 365

  2. 据我所知,Excel不会将任何东西放入剪贴板来指示哪些单元格被选中。 考虑到Excelclosures后粘贴到Word中的结果是有道理的,但是为了进一步说明这一点,当只有包含AC的单元格被复制时,这是Excel放入剪贴板的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 Spreadsheet”types的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() { } /** * @return */ public static ExcelTransfer getInstance() { return _instance; } /** * {@inheritDoc} */ @Override protected int[] getTypeIds() { return new int[] { TYPE_ID }; } /** * {@inheritDoc} */ @Override protected String[] getTypeNames() { return new String[] { TYPE_NAME }; } /** * {@inheritDoc} */ @Override protected void javaToNative(final Object object, final TransferData transferData) { // ... } /** * {@inheritDoc} */ @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()); }