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?
Annonceindlæg fra Deloitte
12. august 2004 - 16:16
#1
12. august 2004 - 16:21
#2
12. august 2004 - 16:23
#3
De klassiske 2 løsninger er: Jakarta POI JDBC (med JDBC ODBC bridge)
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)
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!
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?
12. august 2004 - 16:29
#7
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(); } }
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.
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>
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.
12. august 2004 - 16:52
#12
det hedder Ark1 på dansk - men det hjælper ikke!
12. august 2004 - 16:53
#13
er det noget med Dbq=C:\\jtest.xls;");? jtest ligger i samme bibliotek som programmet!
12. august 2004 - 16:55
#14
Så er den der. Det var Dbq=jtest.xls;");
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.
12. august 2004 - 16:56
#16
ligger du et svar?
12. august 2004 - 16:56
#17
Yes
12. august 2004 - 16:56
#18
.
12. august 2004 - 16:58
#19
Det skal understreges at POI også er en glimrende løsning.
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å!
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++; } } }
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?
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.
12. august 2004 - 17:43
#24
Hvor henter man POI?
12. august 2004 - 17:45
#25
Se mikkelbm's link. Der er et download link på den side.
12. august 2004 - 17:46
#26
hvilken skal jeg hente?
12. august 2004 - 17:47
#27
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?
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
12. august 2004 - 18:07
#30
Jo - det gør jeg nemlig:-) Old school:-)
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
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.
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.
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(); } }
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(); } }
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?
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.
13. august 2004 - 22:17
#38
Hvis du har tid og lyst må du meget gerne - du skal selvfølgelig nok få point!
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!
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;
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);
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.
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;-)
Kurser inden for grundlæggende programmering