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

4

我正在尝试获取剪贴板中的内容,以确保我的应用与Excel兼容性,使用以下代码:

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

问题是,如果我在一列中有[1、2、3],然后选择单元格[1]和[3],那么在剪贴板内容中,我会找到

1\r\n2\r\n3\r\n

代替了只有1和3. 换句话说,剪贴板似乎无法处理不相交的单元格。
请问有人知道发生了什么吗?

1
这与SWT无关,因为我从Excel复制到文本编辑器时得到了相同的结果。尽管如此,这仍然是一个有趣的问题。 - Baz
1
剪贴板中保存的不仅是字符串,你只返回了字符串。当你粘贴到Excel中时,会考虑到更多的值,因此你会得到1和3。如果你将同样的内容粘贴到记事本中,那么你会得到1、2和3。 - user4039065
1个回答

6
我不相信除了Excel之外还有其他方式可以做到这一点,原因有几个:
As @Baz指出,文本编辑器也会打印三个单元格的内容。即使是Word也是如此。 例如,假设我在Excel中打开一个包含以下内容的电子表格: enter image description here 然后在Word中插入一个新的Excel电子表格: enter image description here 当我们尝试复制并粘贴仅包含AC的单元格时,我们得到了预期的结果: enter image description here 但是,如果在将新电子表格添加到Word文档时Excel没有打开,我们会得到: enter image description here 对我来说,这似乎表明当在Word中添加电子表格时仍然打开Excel时,Excel的实例以某种方式被共享,这是它知道要粘贴哪些单元格的唯一方式。(我正在使用Office 365) 据我所知,Excel不会将任何内容放入剪贴板以指示选择了哪些单元格。考虑到在关闭Excel后将其粘贴到Word中的结果,这是Excel在仅复制包含AC的单元格时放入剪贴板的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() {
    }

    /**
     * @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());
}

非常感谢您详细的回答! - user3890394

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接