[JAVA] Error bij gebruik van .net via commandline (Excel)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Vanuit Java wil ik het e.e.a wijzigen aan Excel files. Daarvoor heb ik een commandline utility geschreven in .net. Deze is compiled in een executable.

Deze executable wordt opgestart vanuit java via Process ps = rt.exec(execute);
Bij het executen wordt de .net aangeroepen met:
D:\Apps\CCM\ExcelPivotGenerator.exe" newTemplate "SAP_ParameterHistory_270" "D:\Apps\CCM" "D:\Apps\CCM\output"

Als ik dit commando uitvoer via een de commandline in windows dan werkt alles. Echter, via de rt.exec krijg ik een error melding:
Error: Oude indeling of ongeldig type DLL-bestand. (Uitzondering van HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))

Excel is installed op de machine waarop het draait (engelse versie). De regional settings staan ook op engels. Googlen leverde niets op anders dan het toevoegen van een expliciete regel in .net die de culture instelt:
code:
1
2
3
4
5
6
        Dim oldCI As System.Globalization.CultureInfo = _
            System.Threading.Thread.CurrentThread.CurrentCulture
        System.Threading.Thread.CurrentThread.CurrentCulture = _
            New System.Globalization.CultureInfo("en-US")
        exbook = app.Workbooks.Open(source)
        System.Threading.Thread.CurrentThread.CurrentCulture = oldCI


maar dit lost het probleem niet op.

Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Wat is je exacte aanroep in je code? Kijk ook naar http://www.javaworld.com/...2-2000/jw-1229-traps.html

Verwijderd

Topicstarter
Ik heb het artikel gelezen, maar dat is niet wat hier fout gaat. Ik krijg immers ook geen JAVA error maar een error vanuit .Net (de executable geschreven in VB.NET). Deze output naar java die ik met ReadLine() opvang en print via Java.

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Maar hoe roep je het precies aan vanuit Java?

Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public boolean createGLReport(){
        if(this.analysisResult){
            DB myDB = new DB();
            myDB.connect();
            try{
                myDB.executeQuery("UPDATE RES_Analysis SET glreport = 0 WHERE id=" + this.analysisId);
                String line;
                Runtime rt = Runtime.getRuntime();  // Start command line execution
                String workdir          = this.configuration.get("WorkDir");
                String outputdir        = this.configuration.get("WorkDir") + "\\" + this.configuration.get("OutputFolder");
                
                // Use .Net bridge to generate new template that is bound to ruleresults table in msaccessfile.
                String execute = "\"" + workdir + "\\ExcelPivotGenerator.exe\" newTemplate \"" + this.parent.id + "_"+this.analysisId+"\" \""+workdir+"\" \"" + outputdir + "\"";
                logger.debug(execute);
                
                // Execute the command
                Process ps = rt.exec(execute);
                
                // Create bufferedReader to read cmd results from .Net bridge (for error handling)
                BufferedReader input = new BufferedReader
                    (new InputStreamReader(ps.getInputStream()));
                
                
                
                // Output error handling here.
                Boolean firstLine = true;
                while ((line = input.readLine()) != null) {
                    if(firstLine && line.compareToIgnoreCase("Success")==0) {
                        myDB.executeQuery("UPDATE RES_Analysis SET glreport = 1 WHERE id=" + this.analysisId);
                        logger.debug(line);
                        return true;
                    } else {
                        logger.error(line);
                        return false;
                    }
                }
                input.close();              
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            } finally {
                myDB.close();
            }
        }
        return false;
    }

Verwijderd

Topicstarter
Overigens bij het het executen via:
cmd /c C:\etc\ExcelPivotgenerator.exe krijg ik een andere error:
Uitzondering van HRESULT: 0x800A03EC

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Dan zou ik toch eerst eens je .NET app gaan debuggen voor je via Java een .NET app gaat proberen te runnen

Going for adventure, lots of sun and a convertible! | GMT-8


  • bredend
  • Registratie: September 2001
  • Laatst online: 21:45
Grappig, die link heb ik gisteren nog nodig gehad.

Je moet in de execute string geen spaties gebruiken maar alle argumenten los in een String array zetten.

dus
Java:
1
2
3
String[] execute = {"D:\Apps\CCM\ExcelPivotGenerator.exe", "newTemplate", "SAP_ParameterHistory_270", "D:\Apps\CCM", "D:\Apps\CCM\output"};
// Execute the command
Process ps = rt.exec(execute);


Het argument van exec() wordt niet simpelweg aan de CLI doorgegeven.

[ Voor 50% gewijzigd door bredend op 16-09-2009 22:11 ]


  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09

Bl4ckviper

BlaBlaBla

Je kan ook direct met java en .net lullen he ;) Je kan JNI doen of er bestaan coole tools zoals J-Integra of JNBridge.. JNBridge heb ik zelf gebruikt werkt heel goed.. Deze zijn betaald maar er bestaan ook gratis varianten weet alleen niet of die net zo goed werken.

Je kan er ook altijd nog een webservice van maken :P

Buiten deze tips lijkt het probleem in de .NET applicatie te zitten.. Als je na debug zeker van bent dat dit niet het geval is zou ik gaan kijken naar je aanroep via de CLI..

Kijk even naar ProcessBuilder ipv Runtime.exec.. Deze bouwt het commando anders op.. Problemen met CLI is al vaker voorbij gekomen zie hier of hier.

[ Voor 42% gewijzigd door Bl4ckviper op 16-09-2009 22:22 ]

Be fast .... Be furious....


  • chime
  • Registratie: Januari 2005
  • Laatst online: 09-09 12:46
Maar zijn er geen API's om rechtstreeks vanuit Java excel te benaderen?

Allé, ik ben er zeker van dat er bestaan aangezien ik die al eens ooit gebruikt heb.
Lijkt me ook wat minder omslachtig dan via Java een .Net programma aan te sturen die je updates voor je uitvoert.

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09

Bl4ckviper

BlaBlaBla

Be fast .... Be furious....


  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 16:57
chime schreef op donderdag 17 september 2009 @ 08:16:
Maar zijn er geen API's om rechtstreeks vanuit Java excel te benaderen?
Yep, het Apache POI project.

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Andy Khan's JExcelAPI gaat over het algemeen wat efficienter om met geheugenverbruik.
Of indien het om .xlsx gaat, dan volstaat iedere OpenXML API, zoals OpenXML4J.

[ Voor 6% gewijzigd door BalusC op 17-09-2009 23:24 ]

Pagina: 1