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
Annonceindlæg tema
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); }
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 !?
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 ?
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.
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]
09. oktober 2003 - 19:58
#6
Hej Arne, Compileren kan ikke tage: 1,=a1/a$4 heller ikke 1,=a1/a$4;
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.
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
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 ?
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.
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.
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
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 ?
09. oktober 2003 - 20:16
#14
Nu er det vel Excel som er mest relevant at åbne CSV filen med !?
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();
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 ?
09. oktober 2003 - 20:35
#17
import java.io.*;
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
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 !
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
09. oktober 2003 - 22:29
#21
File not found på en output fil ?
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
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) { }
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.
10. oktober 2003 - 21:58
#25
Se det var ikke noget dårligt forslag !
22. oktober 2003 - 11:17
#26
a
Kurser inden for grundlæggende programmering