有没有一种方法可以在动态更改剪贴板内容的同时在Java端进行复制和粘贴?
我正在尝试将Excel复制并粘贴到我们自己的应用程序中的几个字段中。 为此,我读取剪贴板并创建一个数组,该数组等于从excel复制的字段 应用程序的外观在某种程度上与excel相同,您可以使用tab进入下一列,使用enter进入下一行。下面的代码应该读取剪贴板内容并立即粘贴字符串。要做到这一点,我使用的关键机器人与剪贴板的设置相结合。现在我遇到了以下问题。我为Excel工作表中的每个单元格在循环中设置新的剪贴板内容。我得到的是每个单元格的单个值 getClipboardContents,但机器人按ctrl+v仍会复制Excel中复制的整个区域。有没有一种方法可以在动态更改剪贴板内容的同时在Java端进行复制和粘贴有没有一种方法可以在动态更改剪贴板内容的同时在Java端进行复制和粘贴?,java,Java,我正在尝试将Excel复制并粘贴到我们自己的应用程序中的几个字段中。 为此,我读取剪贴板并创建一个数组,该数组等于从excel复制的字段 应用程序的外观在某种程度上与excel相同,您可以使用tab进入下一列,使用enter进入下一行。下面的代码应该读取剪贴板内容并立即粘贴字符串。要做到这一点,我使用的关键机器人与剪贴板的设置相结合。现在我遇到了以下问题。我为Excel工作表中的每个单元格在循环中设置新的剪贴板内容。我得到的是每个单元格的单个值 getClipboardContents,但机器人
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());
}
经过几次测试后,我发现,it确实能够在内部识别更改,但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();
查看nio包中的缓冲区类。可能有用的方法可以是翻转和紧凑。