我的程序需要用EXCEL打开一个文件,用Runtime.getRuntime().exec来打开,
目前我机子上的EXCEL.EXE位置为:
C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE
代码为:
String addr="C:\\Downloads\\TEST.xls";
Runtime.getRuntime().exec("C:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE " +addr);
可以正常打开,问题是程序布置到客户端时,无法确认用户机子上的
EXCEL.EXE是在哪个路径下,这怎么办呢?我试过直接
Runtime.getRuntime().exec("EXCEL.EXE " +addr);这样是无法打开的.
如何取得机子上EXCEL.EXE的路径呢?
望赐教,最好是写个简单的例子,谢谢.

解决方案 »

  1.   

    我个人认为要在整个磁盘下寻Excel.exe的路径不是一个好的解决办法。
    你可以加段代码在客户端让客户来选择好了。非要这么不可的话,我有段C++代码,你可以参考一下。作些改进。
    void   TForm1::FindFile(AnsiString   Dir)   //   Dir     是路径   如"c:\\"   或   "D:\\"   
      {   
          TSearchRec   sr;   
                      int   iAttributes   =   0;   
                      iAttributes   |=   faAnyFile;   
                      if   (   FindFirst(   Dir+"*.*",   iAttributes,   sr)   ==   0   )   
                      {   
                                      try   
                                      {             AnsiString   dirStr,fileName;   
                                                      do   
                                                      {   
                                                                  if   (   sr.Name   ==   "."   ||   sr.Name   ==   ".."   )   
                                                                      continue;   
                                                                      if   (   sr.Attr   ==   faDirectory   )   
                                                                      {   
                                                                                      FindFile   (Dir+sr.Name+"\\");//找到一个目录   
                                                                      }   
                                                                      else   
                                                                      {   
                                                                          Application->ProcessMessages();   
                                                                            fileName=sr.Name;   
                                                                            dirStr=Dir;   
                                                                          if   (fileName.Pos("mang3160.pbd")>0)   
                                                                                  {   
                                                                                    mydir=   Dir;   
                                                                                  }   
                                                                      }   
                                                                      Application->ProcessMessages();   
                                                      }while   (   FindNext   (sr)   ==   0);   
                                                      Application->ProcessMessages();   
                                                      FindClose(sr);   
                    }   
                  catch(Exception   &e)   
                    {   
                      FindClose(sr);   
                    }   
      }   
      }
      

  2.   

    从注册表读取:
    package org.solol.test;import com.ice.jni.registry.NoSuchKeyException;
    import com.ice.jni.registry.RegStringValue;
    import com.ice.jni.registry.Registry;
    import com.ice.jni.registry.RegistryException;
    import com.ice.jni.registry.RegistryKey;/**
     * @author solo L
     *
     */
    public class JNIRegistryTest {  /**
       * @param args
       */
      public static void main(String[] args) {
        //创建注册表项并设置相应的值
        try {
          RegistryKey software = Registry.HKEY_LOCAL_MACHINE
            .openSubKey("SOFTWARE");      RegistryKey subKey = software.createSubKey("SubKeyName", "");      subKey.setValue(new RegStringValue(subKey, "subKey1", 
            "subKey1Value"));
          subKey.setValue(new RegStringValue(subKey, "subKey2", 
            "subKey2Value"));
          subKey.closeKey();
        } catch (NoSuchKeyException e) {
          e.printStackTrace();
        } catch (RegistryException e) {
          e.printStackTrace();
        }
                    
        //打开注册表项并读出相应的值
        try {
          RegistryKey software = Registry.HKEY_LOCAL_MACHINE.
            openSubKey("SOFTWARE");
          RegistryKey subKey = software.openSubKey("SubKeyName");
          String subKey1Value = subKey.getStringValue("subKey1");
          String subKey2Value = subKey.getStringValue("subKey2");
          System.out.println(subKey1Value);
          System.out.println(subKey2Value);
          subKey.closeKey();
        } catch (NoSuchKeyException e) {
          e.printStackTrace();
        } catch (RegistryException e) {
          e.printStackTrace();
        }                   
      }
    }
      

  3.   

    弹出对话框,让用户进行选择exe的路径
      

  4.   

    弹出对话框,让用户进行选择exe的路径是最简单的方法,但被领导拒掉了。
    TO sureyor() 
    import com.ice.jni.registry.NoSuchKeyException;
    import com.ice.jni.registry.RegStringValue;
    import com.ice.jni.registry.Registry;
    import com.ice.jni.registry.RegistryException;
    import com.ice.jni.registry.RegistryKey;
      是要下什么包吗?还有是不是把你程序中的 RegistryKey subKey = software.openSubKey("SubKeyName");换成software.openSubKey("EXCEL.EXE");然后String subKey1Value = subKey.getStringValue("subKey1");
          String subKey2Value = subKey.getStringValue("subKey2");这两个相加就是具体的路径吗?
      

  5.   

    import com.ice.jni.registry.NoSuchKeyException;
    import com.ice.jni.registry.RegStringValue;
    import com.ice.jni.registry.Registry;
    import com.ice.jni.registry.RegistryException;
    import com.ice.jni.registry.RegistryKey;api中没有找到这些类。。
      

  6.   

    怎嚜感覺這麼麻煩,直接這樣就可以了啊:String addr="C:\\Downloads\\TEST.xls";
    Runtime.getRuntime().exec("cmd /c start \"" +addr + "\"");在cmd下用start就可以了啊,當然跟操作系統有關,windows98應該是command,linux\unix下要查察...
      

  7.   

    zhuokai(海鸥) ( ) 信誉:100  2007-07-23 12:02:27  得分: 0  
     
     
       怎嚜感覺這麼麻煩,直接這樣就可以了啊:String addr="C:\\Downloads\\TEST.xls";
    Runtime.getRuntime().exec("cmd /c start \"" +addr + "\"");在cmd下用start就可以了啊,當然跟操作系統有關,windows98應該是command,linux\unix下要查察...
    =========================
      根本不行,运行结果只是跳出了CMD窗口,标题为C:\Downloads\TEST.xls,而没有打开文件,光标停在当前程序包所在的路径下,即C:\openxls\AmTest> 我试过了只有继续手动输入C:\Downloads\TEST.xls,然后回车才能打开这个文件。为什么会这样?是不是有什么地方写的不对,我的系统为XP。
      

  8.   

    String addr = "C:\\Downloads\\TEST.xls";
    Runtime.getRuntime().exec("cmd /c start "+addr);
      

  9.   

    TO sureyor() 
      正解OK了,结帐,谢谢。
      

  10.   

    ---------------------------------------------
    String addr = "C:\\Downloads\\TEST.xls";
    Runtime.getRuntime().exec("cmd /c start "+addr);
    ----------------------------------------------
    路径中有空格就不行了的。。比如C:\documents and setting\a.xls
    可以试试看。