2014-10-22 84 views
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()); 
} 
+0

查看'nio'包中的緩衝區類。可能有用的方法可以是「flip」和「compact」。 – Tirath 2014-10-22 07:52:43

回答

0

經過幾次測試後,我發現,它確實認識到內部的變化,但窗戶不是。 將粘貼過程設置爲具有5 ms延遲的線程足以讓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(); 
相關問題