# Excel-Datei einlesen



## TheDestroyer (21. Nov 2006)

Hi,

habe folgende Aufgabe:

In einem kleinen Unternehmen sind Kundendaten in Excel gespeichert. Da das Unternehmen seine Daten aber gerne in einer XML-Datenbank speichern will, müssen die Daten aus Excel mithilfe eines Programms in XML konvertiert werden. Bei XML handelt es sich um einen Standard zur Erstellung von strukturierten Dokumenten. Aus Excel wurde bereits eine CSV-Datei erstellt. In ihr befinden sich die Kundendaten, die mit Semikolon getrennt sind (siehe benötigte Dateien). Eurer Programm soll diese nun, so wie in der Beispieldatei, konvertieren können. Der Tabellenkopf der Daten aus Excel sieht so aus: Kundennummer;Nachname;Vorname;Telefon;Email.

Entwickelt eine GUI, die die CSV-Datei auswählen und die XML-Datei in einem angegebenden Ort speichern kann. 
Entwickelt eine oder mehrere Funktionen zur Konvertierung von CSV in XML. 
Erstellt eine Javadoc über eure Lösung. 



Wie mache ich das denn jetzt. Hab sowas noch ne gemacht. Soll jetzt also die Daten einlesen, aber wie. Kann mir vielleicht jemand von euch helfen. Vielleicht hat es aja auch schonmal gmeahct und kann mir nen Tip geben. Danke!!

Die Excel Datei sieht so aus: 


1              Meier	Robert	5456	robert.meier@telefirma.de
2	Kurz	Anika	12321	anika.kurz@sdh.de
3	Otto	Alexander	4575	ottolein@gmx.de
4	Kaiser	Karl	2345	karl_kaiser@autohaus-md.de
5	Schwarze	Nicole	7534	nicole@schwarze.de
6	Bauer	Paula	64534	paulaaa@web.de


----------



## meez (21. Nov 2006)

1.) Lesen


2.) http://jakarta.apache.org/poi/


----------



## DocRandom (21. Nov 2006)

Moin!

..einen großen Teil Deiner Fragen findest Du hier  schon beantwortet!

mfg
DOcRandom


----------



## TheDestroyer (22. Nov 2006)

Hab das jetz mal so gemacht:


```
package Tut3;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;
import java.util.prefs.*;
import java.io.*;

import javax.swing.*;

public class PrefDemoFrame extends JFrame {
	JFileChooser fileC = new JFileChooser();
	Preferences node = Preferences.userNodeForPackage(this.getClass());
	
	public PrefDemoFrame(){
		this.setTitle("Preferences Demo");
		JMenuBar menubar = new JMenuBar();
		this.setJMenuBar (menubar);
		JMenu func = new JMenu ("Einstellungen");
		menubar.add(func);
		JMenuItem importMenuItem = new JMenuItem("Einstellungen importieren");
		importMenuItem.addActionListener(new ImportActionListener());
		JMenuItem exportMenuItem = new JMenuItem("Einstellungen exportieren");
		exportMenuItem.addActionListener(new ExportActionListener());
		func.add(importMenuItem);
		func.add(exportMenuItem);
		JLabel label = new JLabel ("Preferences Demo");
		label.setHorizontalAlignment(SwingConstants.CENTER);
		this.getContentPane().add(label, BorderLayout.CENTER);
		adjustByPreferences();
			
	}
	
	private void adjustByPreferences(){
		int left	= node.getInt("left",0);
		int top		= node.getInt("top",0);
		int width	= node.getInt("width",400);
		int height	= node.getInt("height",300);
		this.setBounds(left, top, width, height);
		
	}
	
	private void saveSettings(){
		node.putInt("left",		this.getX());
		node.putInt("top",		this.getY());
		node.putInt("width",	this.getWidth());
		node.putInt("height",	this.getHeight());
		try{
			node.flush();
		   }catch (Exception e){}
	}
	
	private static void dateiInhaltLesen() { 
	      BufferedReader csv_file = null; 
	       
	      try { 
	         String csv; 
	            csv_file = new BufferedReader(new FileReader("C:/kundendaten.csv")); 
	            while ((csv = csv_file.readLine()) != null) 
	            { 
	            
	            List daten = new ArrayList(); 
	            int maxFelder = 0; 
	            String[] zeile = csv.split(";"); 
	            if (zeile.length > maxFelder){ 
	            maxFelder = zeile.length; 
	            } 
	            daten.add(zeile); 
	            
	            } 
	                  
	      } catch (IOException e) { 
	          System.out.println("Fehler beim einlesen der Datei."); 
	          
	       }
		}
	
	protected void processWindowEvent(WindowEvent e){
		super.processWindowEvent (e);
		if (e.getID()== WindowEvent.WINDOW_CLOSING){
			saveSettings();
			System.exit(0);
		}
	}
private class ImportActionListener implements ActionListener{
		
		public void actionPerformed(ActionEvent e){
			if (fileC.showOpenDialog(PrefDemoFrame.this) == fileC.APPROVE_OPTION){
				try{
					InputStream in = new FileInputStream(fileC.getSelectedFile());
					node .importPreferences(in);
					in.close();
					dateiInhaltLesen();
				} catch (Exception exc){
					exc.printStackTrace();
				}
			}
		}
	}
	
	private class ExportActionListener implements ActionListener {

		public void actionPerformed(ActionEvent e) {
			if (fileC.showSaveDialog(PrefDemoFrame.this) == fileC.APPROVE_OPTION){
				try {
					saveSettings();
					OutputStream out = new FileOutputStream(fileC.getSelectedFile());
					node.exportNode(out);
					out.close();
					
				} catch (Exception exc){
					exc.printStackTrace();
				}
			}
		}
	}
	
	
	
	
}
```

code zum starten:

```
package Tut3;

public class PreferencesDemo {
	public static void main(String[]args){
		PrefDemoFrame frame = new PrefDemoFrame();
		frame.setVisible(true);
	}
}
```
private void adjustByPreferences() , sowie saveSettings dient dabei eerstmal nur u Testzwecken. Doch wie kann ich dateiInhaltLesen jetzt richtig einfügen, sodass das Prog auch mit den eingelesenen Daten arbeitet. Er muss mir doch anschliessend meine eingelesenen Daten erstml speichern, oder und dann halt so bearbeiten dassie so ausgegebn werden:

 <?xml version="1.0" encoding="UTF-8" ?> 
  <!DOCTYPE preferences (View Source for full doctype...)> 
- <preferences EXTERNAL_XML_VERSION="1.0">
- <root type="user">
  <map /> 
- <node name="Tut3">
- <map>
  <entry key="left" value="693" /> 
  <entry key="top" value="102" /> 
  <entry key="width" value="400" /> 
  <entry key="height" value="300" /> 
  </map>
  </node>
  </root>
  </preferences>

MAcht das min Java jetzt automatisch oder muss ich etwas beachten. Muss doch sicherlich irgendie die eingelesen Daten irgendwie splitten und dann halt wieder so ausgeben wie oben zu sehen ist.

Kann mir jemand nen Tip geben?
THX!!!!


----------



## Guest (22. Nov 2006)

genau wie du geschrieben hast, zuerst spitten  (es gibt eine splitt methode) und wieder zusammenbauen. da kannst du jenachdem aber auch mal in XML reinschauen. Mit nem passend definierten Schema geht das dann automatisch. Wobei ich behaupten würde, "zu Fuss machen" sollte für deine Zwecke erstmal ausreichen und auch etwas schneller zu implemetieren sein.


----------



## TheDestroyer (23. Nov 2006)

Hab das jetzt mal so gemacht:

```
package Tut3;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import java.util.prefs.*;
import java.io.*;

import javax.swing.*;

public class Tut3 extends JFrame {
	JFileChooser fileC = new JFileChooser();
	Preferences node = Preferences.userNodeForPackage(this.getClass());
	Vector vec = new Vector();
    String s;
	
	public Tut3(){
		this.setTitle("Tutorium 3");
		setSize(300,300);
        setLocation(300,300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JMenuBar menubar = new JMenuBar();
		this.setJMenuBar (menubar);
		JMenu func = new JMenu ("Auswahl");
		menubar.add(func);
		JMenuItem importMenuItem = new JMenuItem("Daten importieren");
		importMenuItem.addActionListener(new ImportActionListener());
		JMenuItem exportMenuItem = new JMenuItem("Daten exportieren");
		exportMenuItem.addActionListener(new ExportActionListener());
		func.add(importMenuItem);
		func.add(exportMenuItem);
		JLabel label = new JLabel ("Tutorium 3");
		label.setHorizontalAlignment(SwingConstants.CENTER);
		this.getContentPane().add(label, BorderLayout.CENTER);
		
			
	}
		
	private class ImportActionListener implements ActionListener{
	
		public void actionPerformed(ActionEvent e){
			if (fileC.showOpenDialog(Tut3.this) == fileC.APPROVE_OPTION){
				
				//neu zu testzwecken
				try{
					InputStream in = new FileInputStream(fileC.getSelectedFile());
					node .importPreferences(in);
					in.close();
					
				} catch (Exception exc){
					exc.printStackTrace();
				}
				// ende von neu
				
			}
		}
	}	

	private class ExportActionListener implements ActionListener {

		public void actionPerformed(ActionEvent e) {
			
			if (fileC.showSaveDialog(Tut3.this) == fileC.APPROVE_OPTION){
			 
				//neu zu testzwecken
				try {
					//saveSettings();
					OutputStream out = new FileOutputStream(fileC.getSelectedFile());
					node.exportNode(out);
					out.close();
					
				} catch (Exception exc){
					exc.printStackTrace();
				}
			}
		}
	}
}
```

Müsste ja jetzt klappen die Daten einzulesen. Aber wie übergbe ich sie dann an eine ander Methode, z.b. Split. Anschliessend müssen sie dann ja gespeichert werden und so ausgegeben werden wie ich e soben gepostet hab, aber wie mcht man das? Kann mir das jemand sagen? Oder wie speichere ich denn die jetzt eingelesenen Werte sinvoll ab, sodass sie in der nächsten Methode(split) verwendet werden können?


----------



## Guest (23. Nov 2006)

Wenn du die Datei geöffnet hast, liest du sie in einer while Schleife solange ein, bis du das Dateiende erreich hast. Während dieses zeilenweisen Einlesens, hast du in jedem Durchlauf einen String mit der aktuellen Zeile. Diesen String splittes du dann. Da bekommst du ein String array raus, welches du durchlaufen und in double Werte casten musst. Diese in double gecasteten Teilstrings (jetzt richtige Zahlen) speicherst du in ein neu anzulegendes Array. Hast du alle Zahlen der Zeile so gecastet und in dein Array gesteckt, fügst du es einer Liste hinzu. Dann kommt die nächste Zeile und das Spiel geht von vorne los. Schon hast du deine Zahlen eingelesen und in brauchbarer Form im "Speicher".


----------

