【发布时间】:2014-07-24 06:17:42
【问题描述】:
我正在尝试使用 java.awt.robot 自动为我修复一些 Excel 数组。为此,我需要选择单元格内的文本。似乎 shift+home 和 shift+箭头键不适用于选择文本。这是一个代码sn-p:
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
public class Fix4DArray {
public static void main(String[] args){
int n = 10; //nominal sleep time
try {
Robot r = new Robot();
Sequence(r,n,KeyEvent.VK_ALT,KeyEvent.VK_TAB); //switch windows to Excel
Thread.sleep(200);
Press(r,n,KeyEvent.VK_F2); //Open Excel editing for currently selected cell
Select(r,n,KeyEvent.VK_SHIFT,KeyEvent.VK_HOME); //Select all text in cell DOES NOT WORK
//Select(r,n,KeyEvent.VK_SHIFT,KeyEvent.VK_LEFT); //Select one character DOES NOT WORK
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void Press(Robot r,int sleep, int keyEvent) throws InterruptedException{
r.keyPress(keyEvent);
r.keyRelease(keyEvent);
Thread.sleep(sleep);
}
public static void Select(Robot r, int sleep, int... keyEvents ) throws InterruptedException{
r.keyPress(keyEvents[0]);
for(int i = 1; i < keyEvents.length; i++){
r.keyPress(keyEvents[i]);
Thread.sleep(sleep);
}
r.keyRelease(keyEvents[0]);
}
public static void Sequence(Robot r, int sleep, int... keyEvents ) throws InterruptedException{
for(int i = 0; i < keyEvents.length; i++){
r.keyPress(keyEvents[i]);
Thread.sleep(sleep);
}
for(int i = keyEvents.length; i > 0 ; i--){
r.keyRelease(keyEvents[i-1]);
Thread.sleep(sleep);
}
}
}
请注意,如果您在开头注释掉 alt+tab(第 12 行)并从 Eclipse(或其他 IDE)运行,它也将不会在 Eclipse 中选择文本,尽管它会移动光标。 CTRL-A 确实有效,但不会在 Excel 中选择文本,所以这是不行的。
我在https://community.oracle.com/thread/1289981?start=0&tstart=0 找到了一个关于这个主题的参考资料,但他们没有找到解决方案。
任何帮助将不胜感激。或在 Excel 中选择文本的另一种解决方案。请注意,VBA 和宏也不适用于我正在尝试的特定任务。
谢谢。
使用 Sesame 的建议进行更新,我能够删除文本。现在我想使用 shift+arrow 或一些变通方法来选择单元格。这是更新的代码sn-p;请注意不起作用的行:
Robot r = new Robot();
Sequence(r,n,KeyEvent.VK_ALT,KeyEvent.VK_TAB); //switch windows to Excel
Thread.sleep(200);
Press(r,n,KeyEvent.VK_SPACE); //replace text with space
Select(r,n,KeyEvent.VK_CONTROL,KeyEvent.VK_Z); //UNDO to select text in cell
Select(r,n,KeyEvent.VK_CONTROL,KeyEvent.VK_X); //CUT
Sequence(r,n,KeyEvent.VK_CONTROL,KeyEvent.VK_SHIFT, KeyEvent.VK_ENTER); //Delete the array
Select(r,n,KeyEvent.VK_SHIFT,KeyEvent.VK_RIGHT,KeyEvent.VK_RIGHT,KeyEvent.VK_RIGHT); //Select cells DOES NOT WORK
Press(r,n,KeyEvent.VK_F2); //Open cell combination for typing array
Sequence(r,n,KeyEvent.VK_CONTROL,KeyEvent.VK_SHIFT, KeyEvent.VK_ENTER); //Input the array
【问题讨论】: