我正在尝试将Excel中的内容复制并粘贴到我们自己的应用程序的几个字段中。为此,我正在读出剪贴板并创建一个数组,该数组等于从excel复制的字段。
应用程序的外观在某种程度上等同于excel,您可以使用Tab键进入下一列,使用enter键进入下一行。下面的代码应该读取剪贴板内容并立即粘贴字符串。为了做到这一点,我结合使用了Key Robot和剪贴板的设置。现在我遇到了以下问题。我为Excel工作表中的每个单元格在循环中设置了新的剪贴板内容。我使用以下命令获取每个单元格的单个值
getClipboardContents,但是按下ctrl +v的机器人仍然会复制要复制到Excel中的整个区域。有没有一种方法可以在动态更改剪贴板内容的同时在Java端复制和粘贴?
private String getClipboardContents() {
String result = "";
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
// odd: the Object param of getContents is not currently used
Transferable contents = clipboard.getContents(null);
boolean hasTransferableText = (contents != null) && contents.isDataFlavorSupported(DataFlavor.stringFlavor);
if (hasTransferableText) {
try {
result = (String) contents.getTransferData(DataFlavor.stringFlavor);
} catch (UnsupportedFlavorException ex) {
// highly unlikely since we are using a standard DataFlavor
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} catch (NullPointerException npe) {
npe.printStackTrace();
}
}
return result;
}
private String[][] generateExcelArray() {
String clipboard = getClipboardContents();
String[] rows = clipboard.split("\n");
String[][] table = new String[rows.length][rows[0].split("\t").length];
for (int i = 0; i < table.length; ++i) {
String[] row = rows[i].split("\t");
int _a = 0;
if (row.length != table[i].length)
_a = table[i].length - row.length;
for (int j = 0; j+_a < table[i].length; ++j) {
String cell = row[j];
table[i][j+_a] = cell;
}
}
return table;
}
private void fillFields() throws AWTException {
String[][] excelTable = generateExcelArray();
Robot keySender = new Robot();
String bufferCopy = getClipboardContents();
for (int i = 0; i < excelTable.length; ++i) {
for (int j = 0; j < excelTable[i].length; ++j) {
setClipboard(excelTable[i][j]);
keySender.keyPress(KeyEvent.VK_CONTROL);
keySender.keyPress(KeyEvent.VK_V);
keySender.keyRelease(KeyEvent.VK_CONTROL);
keySender.keyRelease(KeyEvent.VK_V);
keySender.keyPress(KeyEvent.VK_TAB);
keySender.keyRelease(KeyEvent.VK_TAB);
}
keySender.keyPress(KeyEvent.VK_ENTER);
keySender.keyRelease(KeyEvent.VK_ENTER);
}
setClipboard(bufferCopy);
}
private void setClipboard(String input) {
StringSelection selection = new StringSelection(input);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(selection, selection);
System.out.println(getClipboardContents());
}发布于 2014-10-22 16:14:27
经过几次测试,我发现它确实能在内部识别更改,但windows不能。将粘贴过程设置为线程,延迟5毫秒,足以让windows执行剪贴板更改。
final String[][] excelTable = generateExcelArray();
final Robot keySender = new Robot();
final String bufferCopy = getClipboardContents();
final int delay = 5;
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < excelTable.length; ++i) {
for (int j = 0; j < excelTable[i].length; ++j) {
setClipboard(excelTable[i][j] == null ? "":excelTable[i][j]);
try {
Thread.sleep(delay);
} catch (InterruptedException e) {
e.printStackTrace();
}
keySender.keyPress(KeyEvent.VK_CONTROL);
keySender.keyPress(KeyEvent.VK_V);
keySender.keyRelease(KeyEvent.VK_CONTROL);
keySender.keyRelease(KeyEvent.VK_V);
try {
Thread.sleep(delay);
} catch (InterruptedException e) {
e.printStackTrace();
}
keySender.keyPress(KeyEvent.VK_TAB);
keySender.keyRelease(KeyEvent.VK_TAB);
}
try {
Thread.sleep(delay);
} catch (InterruptedException e) {
e.printStackTrace();
}
keySender.keyPress(KeyEvent.VK_ENTER);
keySender.keyRelease(KeyEvent.VK_ENTER);
}
try {
Thread.sleep(delay);
} catch (InterruptedException e) {
e.printStackTrace();
}
setClipboard(bufferCopy);
}
}).start();https://stackoverflow.com/questions/26502379
复制相似问题