Avatar billede krukken Mester
12. august 2004 - 16:13 Der er 42 kommentarer og
1 løsning

Hent værdier fra Excel regnark

Jeg skal bruge noget kode hvor jeg henter nogle værdier fra et Excel-regneark. Har nogle noget let og overskueligt kode som jeg kan bruge?
Avatar billede mikkelbm Nybegynder
12. august 2004 - 16:16 #1
Prøv at ta' et kig på:

http://jakarta.apache.org/poi/
Avatar billede mikkelbm Nybegynder
12. august 2004 - 16:21 #2
Der er også det her:

http://jexcelapi.sourceforge.net/
Avatar billede arne_v Ekspert
12. august 2004 - 16:23 #3
De klassiske 2 løsninger er:
  Jakarta POI
  JDBC (med JDBC ODBC bridge)
Avatar billede krukken Mester
12. august 2004 - 16:24 #4
Jeg leder efter kode - og ikke links. Jeg har også forsøgt at søge herinde. Giv mig noget kode som jeg kan bruge til noget. (SOM DER OGSÅ STÅR I SPØRGSMÅLET)
Avatar billede mikkelbm Nybegynder
12. august 2004 - 16:26 #5
Hvis du henter f.eks. JExcelAPI, vil du finde ud af, at det er utrolig nemt at gå til. Når/hvis du henter det, kan du vende tilbage, så skal jeg gerne komme med et eksempel!
Avatar billede mikkelbm Nybegynder
12. august 2004 - 16:29 #6
Men uden en API, ved jeg ikke hvor "let og overskueligt" det er. Det har jeg ikke prøvet! Det kan være Arne kan gi' et eksempel på noget med JDBC?
Avatar billede simonvalter Praktikant
12. august 2004 - 16:29 #7
poi har massere af kode eksempler
http://jakarta.apache.org/poi/hssf/quick-guide.html
Avatar billede arne_v Ekspert
12. august 2004 - 16:32 #8
Kommer her.

jtest.xls Sheet1:

IV    SV
1    a
2    bb
3    ccc
4    dddd

Program:

import java.sql.*;

public class ReadXLS {
    public static void main(String[] args) throws Exception {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        Connection con = DriverManager.getConnection("jdbc:odbc:;Driver={Microsoft Excel Driver (*.xls)};Dbq=C:\\jtest.xls;");
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT * FROM [Sheet1$]");
        while (rs.next()) {
            int iv = rs.getInt(1);
            String sv = rs.getString(2);
            System.out.println(iv + " " + sv);
        }
        stmt.close();
        con.close();
    }
}
Avatar billede arne_v Ekspert
12. august 2004 - 16:33 #9
POI er uden tvivl en mere avanceret løsning end JDBC ODBC, men de fleste
kender JDBC interfacet meget godt.
Avatar billede krukken Mester
12. august 2004 - 16:38 #10
:javac ReadXLS.java

:java ReadXLS
Exception in thread "main" java.sql.SQLException: [Microsoft][ODBC Excel Driver]
The Microsoft Jet database engine could not find the object 'Sheet1$'.  Make su
re the object exists and that you spell its name and the path name correctly.
        at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6958)
        at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7115)
        at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(JdbcOdbc.java:3111)
        at sun.jdbc.odbc.JdbcOdbcStatement.execute(JdbcOdbcStatement.java:338)
        at sun.jdbc.odbc.JdbcOdbcStatement.executeQuery(JdbcOdbcStatement.java:2
53)
        at ReadXLS.main(ReadXLS.java:8)

F:\Skole\Forskellige projekter\CVR-projekt>
Avatar billede arne_v Ekspert
12. august 2004 - 16:44 #11
Hvsi du bruger en dansk Excel så hedder Sheet1 nok noget andet.

Prøv lige og åvben dit regne ark og se hvad det hedder. Står i bunden.

Og ret så koden til.

$ skal tilføjes.
Avatar billede krukken Mester
12. august 2004 - 16:52 #12
det hedder Ark1 på dansk - men det hjælper ikke!
Avatar billede krukken Mester
12. august 2004 - 16:53 #13
er det noget med Dbq=C:\\jtest.xls;");? jtest ligger i samme bibliotek som programmet!
Avatar billede krukken Mester
12. august 2004 - 16:55 #14
Så er den der. Det var Dbq=jtest.xls;");
Avatar billede arne_v Ekspert
12. august 2004 - 16:55 #15
Dbq angiver stien til XLS filen.

It mit tilfælde C:\jtest.xls - den skal naturligvis rettes til så den peger
rigtigt.
Avatar billede krukken Mester
12. august 2004 - 16:56 #16
ligger du et svar?
Avatar billede arne_v Ekspert
12. august 2004 - 16:56 #17
Yes
Avatar billede arne_v Ekspert
12. august 2004 - 16:56 #18
.
Avatar billede arne_v Ekspert
12. august 2004 - 16:58 #19
Det skal understreges at POI også er en glimrende løsning.
Avatar billede krukken Mester
12. august 2004 - 17:00 #20
Okay - jeg skal bare bruge til at trække en række værdier ud som skal slåes op i en database over SOAP som det er ikke det helt vilde jeg skal have haft på!
Avatar billede arne_v Ekspert
12. august 2004 - 17:26 #21
Her er samme program i POI udgave:


import java.io.*;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.*;

public class ReadPOI {
    public static void main(String[] args) throws Exception {
        POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("C:\\jtest.xls"));
        HSSFWorkbook wb = new HSSFWorkbook(fs);
        HSSFSheet sheet = wb.getSheetAt(0);
        int rownum = 1;
        for (;;) {
            HSSFRow row = sheet.getRow(rownum);
            if(row==null) break;
            HSSFCell ivcell = row.getCell((short)0);
            int iv = (int)ivcell.getNumericCellValue();
            HSSFCell svcell = row.getCell((short)1);
            String sv = svcell.getStringCellValue();
            System.out.println(iv + " " + sv);
            rownum++;
        }
    }
}
Avatar billede krukken Mester
12. august 2004 - 17:37 #22
Hvordan bruger jeg så det? Skal jeg bare compile det med javac? Eller skal der nogle classfiler eller andet stilles op? Og skal jeg have hentet nogle .jar-filer?
Avatar billede arne_v Ekspert
12. august 2004 - 17:41 #23
Både JDBC og POI udgaven skal compiles.

JDBC udgaven kræver ikke noget særligt fordi JDBC ODBC bridgen kommer med Java.

POI udgaven kræver at du har hentet POI, udpakket og har tilføjet den rette jar fil
til classpath.

[OK - JDBC udgaven kræver at man har en ODBC driver til Excel, men det er mange
år siden at jeg har set en Windows PC hvor det ikke er tilfældet]

En stor styrke ved POI må være at det virker på andet en Windows.
Avatar billede krukken Mester
12. august 2004 - 17:43 #24
Hvor henter man POI?
Avatar billede arne_v Ekspert
12. august 2004 - 17:45 #25
Se mikkelbm's link.

Der er et download link på den side.
Avatar billede krukken Mester
12. august 2004 - 17:46 #26
hvilken skal jeg hente?
Avatar billede arne_v Ekspert
12. august 2004 - 17:47 #27
Avatar billede krukken Mester
12. august 2004 - 17:56 #28
Så har jeg hentet den og pakket den ud - hvad er det så du siger jeg skal gøre?
Avatar billede arne_v Ekspert
12. august 2004 - 18:00 #29
Du oversætter command line ikke ?

javac -classpath \hvor-nu-det-er\poi-2.5.1-final-20040804.jar ReadPOI.java
java -classpath .;\hvor-nu-det-er\poi-2.5.1-final-20040804.jar ReadPOI
Avatar billede krukken Mester
12. august 2004 - 18:07 #30
Jo - det gør jeg nemlig:-) Old school:-)
Avatar billede krukken Mester
12. august 2004 - 18:11 #31
Det er perfekt - så virker det igen. Behøver jeg at gentage den ros som du gav dig ved det andet spørgsmål? He he:-) Igen - rigtig mange tak for hjælpen
Avatar billede arne_v Ekspert
12. august 2004 - 18:17 #32
Der er ikke noget galt med at compile command line.

Det giver nemlig et godt indtryk af hvad der virkeligt foregår.
Avatar billede krukken Mester
13. august 2004 - 21:42 #33
Arne???

Du har vel ikke et eksempel på hvordan man opretter et nyt excel-dokument og gemmer det? Jeg kan godt få oprettet et nyt nemlig, men det minder mere om et link til det jeg allerede har læst værdier fra. Der bliver dannet et nyt Excel-dokument med det fylder kun 1kb, og når jeg åbner det er det det oprindelige dokument som åbnes.
Avatar billede arne_v Ekspert
13. august 2004 - 21:48 #34
JDBC:

import java.sql.*;

public class WriteXLS {
  public static void main(String[] args) throws Exception {
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
      Connection con = DriverManager.getConnection("jdbc:odbc:;Driver={Microsoft Excel Driver (*.xls)};READONLY=FALSE;Dbq=C:\\test.xls;");
      Statement stmt = con.createStatement();
      stmt.executeUpdate("CREATE TABLE t (f1 INTEGER, f2 VARCHAR(50), f3 VARCHAR(50), f4 VARCHAR(50))");
      stmt.executeUpdate("INSERT INTO t VALUES(3,'hest','ko','hund')");
      stmt.executeUpdate("INSERT INTO t VALUES(4,'hest2','ko2','hund2')");
      stmt.close();
      con.close();
  }
}
Avatar billede arne_v Ekspert
13. august 2004 - 21:48 #35
POI:

import java.io.*;

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

public class WritePOI {
  public static void main(String[] args) throws Exception {
      HSSFWorkbook book = new HSSFWorkbook();
      HSSFSheet sheet = book.createSheet("Test Sheet");
      sheet.setSelected(true);
      HSSFRow hdrrow = sheet.createRow((short)0);
      HSSFCell hdrrowcola = hdrrow.createCell((short)0);
      hdrrowcola.setCellValue("F1");
      HSSFCell hdrrowcolb = hdrrow.createCell((short)1);
      hdrrowcolb.setCellValue("F2");
      for(int i = 0; i < 10; i++) {
          HSSFRow datarow = sheet.createRow((short)(i+1));
          HSSFCell datacola = datarow.createCell((short)0);
          datacola.setCellValue(i+1);
          HSSFCell datacolb = datarow.createCell((short)1);
          datacolb.setCellValue("Dette er en test");
      }
      sheet.setColumnWidth((short)1, (short)(50*256));
      FileOutputStream f = new FileOutputStream("C:\\jjtest.xls");
      book.write(f);
      f.close();
  }
}
Avatar billede krukken Mester
13. august 2004 - 21:52 #36
Hov - jeg glemte nok lige at sige at jeg har lavet det i c# istedet. Har du et eksempel på det?
Avatar billede arne_v Ekspert
13. august 2004 - 22:16 #37
Ja det er jo ligesom en helt anden bold gade.

Jeg har ikke noget C# kode som bruger Excel liggende.

Måske kunne jeg prøve at lave noget.
Avatar billede krukken Mester
13. august 2004 - 22:17 #38
Hvis du har tid og lyst må du meget gerne - du skal selvfølgelig nok få point!
Avatar billede krukken Mester
13. august 2004 - 22:35 #39
Jeg er selv kommet så langt nu at jeg får lavet et nyt sheet. SÅ skal jeg bare have det gemt med værdier i!
Avatar billede krukken Mester
13. august 2004 - 22:35 #40
hov:
Excel.Workbooks workbooks = ExcelObj.Workbooks;
                        Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
                        Excel.Sheets sheets = workbook.Worksheets;
Avatar billede krukken Mester
13. august 2004 - 22:41 #41
Så var den der :-)
Excel.Workbooks workbooks = ExcelObj.Workbooks;
                        Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
                        Excel.Sheets sheets = workbook.Worksheets;
                        workbook.SaveAs(savedlg.FileName,
                            Excel.XlFileFormat.xlXMLSpreadsheet, Type.Missing, Type.Missing,
                            Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange,
                            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                            Type.Missing);
Avatar billede arne_v Ekspert
13. august 2004 - 23:58 #42
Godt det samme for lidt googling sagde mig at de PIA er til Office XP & 2003. Og
jeg kører stadig Office 2000.
Avatar billede krukken Mester
14. august 2004 - 00:03 #43
Puhh - det holdt også hårdt. Der er ikke meget dokumentation. Jeg faldt over en som havde lavet lidt kode - og det byggede jeg videre på. Nu har jeg simplet han fået det lavet så jeg tager alle værdier fra en regneark og ligger dem i et array. SÅ kan jeg manipulere med dem - og lave et nyt og ligge dem der i. Nu er det vist tid til noget aftensmad;-)
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