Avatar billede nanders Nybegynder
09. oktober 2003 - 12:15 Der er 25 kommentarer og
1 løsning

Skrive til Excel fra Java

Kære eksperter,

Jeg kan se, at der er stillet lignende spørgsmål før.

Som regel bliver der henvist til siderne:

http://jakarta.apache.org/poi/index.html
http://www.javaworld.com/javaworld/javaqa/2001-06/04-qa-0629-excel.html

Jeg har prøvet den sidste fordi Arne vist nok har henvist til den en gang.

Jeg har prøvet at følge vejledningen på:

http://www.javaworld.com/javaworld/javaqa/2001-06/04-qa-0629-excel.html

hvor der er en trin for trin manøvre. 

Say that you would like to pull out all March 2000 entries. You will need to hit the data source with the following SQL query:

Hvordan hitter man the data source og laver nedenstående sql query ?

select URL from [qas$] where Month='March' and Year=2000;

Note that the table name is the name of the worksheet with a $ appended to the end. You have to append the $ in order for the query to work. Why? Because. The brackets are there because $ is a reserved character in SQL. Life is never easy.

Jeg prøver at køre det java-program der er på siden, men får følgende meddelelse i terminalvinduet (den kompiler i øvrigt fint):

java.sql.SQLException: [Microsoft][ODBC Excel Driver] 'qas$' is not a valid name.  Make sure that it does not include invalid characters or punctuation and that it is not too long.

Er der nogen der på det jeg har skrevet kan instruere mig en smule.

Mit endelige mål er at kunne skrive tal ud i excel der genereres fra et edb-program.

/ nanders
Avatar billede nanders Nybegynder
09. oktober 2003 - 13:29 #1
Kære eksperter,

Jeg omformulerer spørgsmålet, da jeg kan se, at Arne faktisk henviser til Jakartas projekt - og spm. måske er for svært (?)

Hvis jeg vil lave en kommasepareret csv-fil - hvordan gør jeg så det ?

Jeg har en udskriftdel af et program, der printer til et terminalvindue:

if (j==0)
       
        {

          ApH_1.add(new Double(pH_1)); 
       
         
            System.out.println(((Double) ApH_1.get(0)).doubleValue()); 
         
            System.out.println("H_1= "+H_1);
            System.out.println("H_2= "+H_2);
            System.out.println("H_3= "+H_3);
            System.out.println("H_4= "+H_4);
            System.out.println("H_5= "+H_5);
            System.out.println("G_NH3_5= "+G_NH3_5);
            System.out.println("G_H2S_5= "+G_H2S_5);
            System.out.println("G_CH3NH2_5= "+G_CH3NH2_5);
            System.out.println("G_CH2SH_5= "+G_CH3SH_5);
           
           
            System.out.println("((HeNH3 * G_NH3_5) - NH3_5)= "+((HeNH3 * G_NH3_5) - NH3_5));
            System.out.println("TNH4_NH3_5= "+TNH4_NH3_5);
            System.out.println("NH3_5= "+NH3_5);
           
        }
Avatar billede arne_v Ekspert
09. oktober 2003 - 14:03 #2
Hvad med at lave et lille Excel regne-ark, eksporter det til CSV, se
formatet, rette din kode til så den skriver på samme måde !?
Avatar billede nanders Nybegynder
09. oktober 2003 - 18:49 #3
Hej Arne,

Jeg kan se, at det er muligt at generere kommaseparerede filer fra excel.

Jeg ved bare ikke hvordan man:

i) laver en fil fra java, som man kan tilgå fra andre programmer - f.eks. excel.
ii) indsætter flere kommaseparerede talrækker i en sådan fil.

Gode forslag modtages gerne.

På siden http://jakarta.apache.org/poi/apidocs/index.html

er der en API dokumentation.

En af dem der er dokumentation er: org.apache.poi.hssf.model

Hvad skal jeg importere i toppen af mit program - import ... for at kunne tilgå de metoder som der er i Class Sheet, som er org.apache.poi.hssf.model ?
Avatar billede arne_v Ekspert
09. oktober 2003 - 19:28 #4
En ting af gangen.

Komma separeret fil er lige ud af landevejen.

Prøv og gem det her:

1,=a1/a$4
2,=a2/a$4
3,=a3/a$4
=sum(a1..a3),=a4/a$4

som test.csv og åben den i Excel !

1    0.166666667
2    0.333333333
3    0.5
6    1

Nydeligt.
Avatar billede arne_v Ekspert
09. oktober 2003 - 19:30 #5
Hvis du går igang med POI, så skal den import vel være:

import org.apache.poi.hssf.model.*;

eller eksplicit:

import org.apache.poi.hssf.model.Sheet;

[og den relevante jar-fil skal naturligvis være i classpath]
Avatar billede nanders Nybegynder
09. oktober 2003 - 19:58 #6
Hej Arne,

Compileren kan ikke tage:

1,=a1/a$4 heller ikke 1,=a1/a$4;
Avatar billede arne_v Ekspert
09. oktober 2003 - 20:01 #7
????

Det var en .csv fil ikke en .java fil.

Men hvis det virker tilfredsstillende, så er det jo nemt at
outputte sådan en .csv fil fra et Java program.
Avatar billede nanders Nybegynder
09. oktober 2003 - 20:03 #8
Den relevante jar fil, jeg går ud fra, at det er en man skal downloade og ligge ind i det bibliotek hvor der ligger andre jar-filer

F.eks. C:\j2sdk1.4.2_01\jre\lib hvor der ligger executable jar-filer
Avatar billede nanders Nybegynder
09. oktober 2003 - 20:05 #9
Jeg ved altså ikke hvad 1,=a1/a$4 betyder. Er det et tal jeg skal lægge ind i en celle i excel ? og gemme det bagefter som test.csv ?
Avatar billede arne_v Ekspert
09. oktober 2003 - 20:07 #10
Du laver en fil test.csv med det inhold.

Den fil åbner du i Excel (som .txt/.csv).

Hvis du synes at resultatet er værd at arbejde videre på og
du ikke vil kaste dig over nogle af de tuneg API'er, så prøver
du at skrive et lille Java program den genererer den slags
CSV filer.
Avatar billede arne_v Ekspert
09. oktober 2003 - 20:08 #11
Normalt vil man udpakke sådan noget software som POI i et separat
directory og så sætte classpath over til jar filen.
Avatar billede nanders Nybegynder
09. oktober 2003 - 20:12 #12
Jeg har prøvet at gemme en excel fil med indholdet 1,=a1/a$4 i en celle og gemme den med navnet test.csv - men den ser ud som en normal excel fil og kan åbnes som sædvanlig
Avatar billede nanders Nybegynder
09. oktober 2003 - 20:16 #13
Hej Arne

Jeg prøvede at gemme en fil som en csv fil - og kan se at jeg fint kan åbne den i f.eks. wordpad.

Så er spm bare hvordan jeg fra java laver en csv fil som jeg kan lægge tal ind i ?
Avatar billede arne_v Ekspert
09. oktober 2003 - 20:16 #14
Nu er det vel Excel som er mest relevant at åbne CSV filen med !?
Avatar billede arne_v Ekspert
09. oktober 2003 - 20:18 #15
Det er nemt at skriv en CSV fil i Java:

PrintWriter pw = new PrintWriter(new FileOutputStream("noget.csv"));
pw.println("linie 1");
...
pw.println("linie n");
pw.close();
Avatar billede nanders Nybegynder
09. oktober 2003 - 20:24 #16
Hej Arne,

Jeg tror det er tæt på. Den siger dog cannot resolve symbol class PrintWriter

mangler jeg en import ?
Avatar billede arne_v Ekspert
09. oktober 2003 - 20:35 #17
import java.io.*;
Avatar billede nanders Nybegynder
09. oktober 2003 - 20:40 #18
Hej Arne,

Hvis jeg laver

PrintWriter pw = new PrintWriter(new FileOutputStream("noget.csv"));

i constructoren og bagefter kalder den i en metode med

pw.println("linie 1"); giver den compilefejl - cannot resolve symbol pw
Avatar billede arne_v Ekspert
09. oktober 2003 - 21:16 #19
Så skal du erklære:

private PrintWriter pw;

udenfor metoder og bruge:

pw = new PrintWriter(new FileOutputStream("noget.csv"));

i constructor !
Avatar billede nanders Nybegynder
09. oktober 2003 - 21:31 #20
Hej Arne

Den laver en file not found error

Jeg går ud fra, at den ikke kan finde noget.csv som den skal skrive til. Men filen noget ligger ude på mit skrivebord og er af typen csv
Avatar billede arne_v Ekspert
09. oktober 2003 - 22:29 #21
File not found på en output fil ?
Avatar billede nanders Nybegynder
09. oktober 2003 - 22:53 #22
Hej Arne,

Hvis man erklærer writeren i selve metoden skriver den:

unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown

Hvis man kun erklærer den i constructoren bliver fejlen:

java.io.OutputStream is abstract; cannot be instantiated
Avatar billede arne_v Ekspert
09. oktober 2003 - 23:02 #23
Nå.

Jeg troede at det var en runtime fejl.

Du kan enten putte:

throws FileNotFoundException

på metoden eller lave en:

try {



} catch(FileNotFoundException ex) {
}
Avatar billede tjens Nybegynder
10. oktober 2003 - 20:59 #24
Kommentar til det originale spørgsmål:

Man kan bruge et Excel regneark som en ODBC kilde, og dermed køre normal SQL:
I Excel skal man definere et 'Name' under Insert/Name/Define.
Øverste række skal være de feltnavne du vil bruge i SQL.
I windows skal der defineres en ODBC datakilde, der peger på regnearket og Name't.

Jeg har et program der læser et regneark, og jeg føler mig sikker på at man også kan opdatere.

Her er der brudstykker:

static Connection Ci;
static Statement iStmt;
static ResultSet rsi;

loadOdbc();
openInConnection( "Min_Xl_ODBC_kilde");
int i;
String sql = "SELECT * FROM myXLnamedArea WHERE thedata = 'whatIneed' ";
try {
    if (sql.charAt(0) == 'S')
        rsi = iStmt.executeQuery(sql);
    else
        i = iStmt.executeUpdate(sql);
}
catch (SQLException SQLe) {
    System.err.println ("Unable to perform : " + sql );
    System.err.println ("Details : " + SQLe); System.exit(0);
}

static void openInConnection(String link) {
    String url;
    url = "jdbc:odbc:" + link;
    try {
        Ci =DriverManager.getConnection( url, "SA", "");
    }
    catch (SQLException SQLe) {
        System.err.println ("Unable to open connetion to : " + url );
        System.err.println ("Details : " + SQLe); System.exit(0);
    }
    try {
        iStmt = Ci.createStatement();
    }
    catch (SQLException SQLe) {
        System.err.println ("Unable to use createStatement function (infile)" );
        System.err.println ("Details : " + SQLe); System.exit(0);
    }
}

static void loadOdbc() {
    // Attempt to load database driver
    try    {      // Load Sun's jdbc-odbc driver
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
    }
    catch (ClassNotFoundException cnfe) { // driver not found
        System.err.println ("Unable to load database driver");
        System.err.println ("Details : " + cnfe); System.exit(0);
    }
    catch (IllegalAccessException iae) {
        System.err.println ("Autoritetsproblem");
        System.err.println ("Details : " + iae); System.exit(0);
    }
    catch (InstantiationException ie) {
        System.err.println ("Instantieringsproblem");
        System.err.println ("Details : " + ie); System.exit(0);
    }
}

static void closeAll() {
    try    {
        rsi.close();
        iStmt.close(); 
        Ci.close();
       

    }
    catch (SQLException SQLe) {
        System.err.println ("Unable to close ODBC-file");
        System.err.println ("Details : " + SQLe); ;
    }

}

Ja ja, jeg ved at static er anti-objektorienteret, men det her var min første øvelse med ODBC, og ikke en øvelse i objektorientering.
Avatar billede arne_v Ekspert
10. oktober 2003 - 21:58 #25
Se det var ikke noget dårligt forslag !
Avatar billede nanders Nybegynder
22. oktober 2003 - 11:17 #26
a
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester