1
我想從Excel複製並粘貼到我們自己的應用程序中進入幾個字段。 爲此,我正在讀出剪貼板並創建一個數組,它等於從excel複製的字段。有沒有辦法在動態改變剪貼板的內容的同時複製和粘貼Java端?
應用程序的外觀在某種程度上與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());
}
查看'nio'包中的緩衝區類。可能有用的方法可以是「flip」和「compact」。 – Tirath 2014-10-22 07:52:43