Collections Vector füllen in for-Schleife

peter420

Mitglied
Hallo Java-Experten,

Ich habe vor eine Excel Tabelle in ein TableModel einzulesen (siehe Screenshot excel.jpg)

Java:
package excelReader;

import java.awt.BorderLayout;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import com.sun.xml.internal.bind.v2.schemagen.xmlschema.List;
import jxl.Cell;
import jxl.Workbook;
import jxl.read.biff.BiffException;

public class ExcelReader extends JFrame {
	// Every class implementing Serializable or extending a class that
	// implements Serializable
	// has a class version number generated by the compiler unless you specify
	// the version number using serialVersionUID
	private static final long serialVersionUID = 1L;
	private static JTable table;

	public static void main(String[] args) {
        new ExcelReader();
  }
	
	public ExcelReader() {
		table = new JTable();
		add(new JScrollPane(table), BorderLayout.CENTER);
		File file = ExcelReader.XLSFileChooser();
		TableModel model = parseXLSAndCreateTableModel(file);
		table.setModel(model);
		pack();
		setVisible(true);
	}

	public static File XLSFileChooser() {
		File xlsfile = new File("C:/testerl.xls");
		return xlsfile;
	}


	private static TableModel parseXLSAndCreateTableModel(File file) {
		Vector<Serializable> v = new Vector<Serializable>();
		Vector<String> header = new Vector<String>();

		try {
			Workbook wb = Workbook.getWorkbook(file);
			Cell[] cellNames;
			Cell[] cells;
			cellNames = wb.getSheet(0).getRow(0);
			cells = wb.getSheet(0).getRow(0);
			ArrayList<String> list = new ArrayList<String>();

			for (int i = 0; i < wb.getSheet(0).getRows(); i++) {
				cells = wb.getSheet(0).getRow(i);
				for (int j = 0; j < wb.getSheet(0).getColumns(); j++) {
					String values = cells[j].getContents().toString();
					list.add(values);
				}
				v.addAll(new Vector<Serializable>(list));
				list.clear();
			}
			
			DefaultTableModel model = new DefaultTableModel(v, header);
			wb.close();
			return model;
		}
		catch (BiffException e1) {
			e1.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		return null;
	}
}

Mein Problem taucht auf in Zeile 70: Da übergebe ich dem Vektor, den ich dann ins TableModel schreibe, die Liste mit den Werten aus einer Zeile von EXCEL.
Das funktioniert soweit, aber wenn dann die 2. Zeile von EXCEL eingelesen wird, so hängt es die Zeile einfach in den Vector dazu (siehe Screenshot debug.jpg).

Wie mache ich das, dass mir da eine neue Vectorzeile bzw. ein neuer Vector erstellt wird?
Irgendwie blicke ich da nicht mehr durch. Muss ich da bei den verschachtelten For-Schleifen was ändern?

Bitte um Hilfe, bin um jeden Ratschlag froh!

Schöne Grüsse,
Peter
 

Anhänge

  • excel.jpg
    excel.jpg
    35,4 KB · Aufrufe: 53
  • debug.jpg
    debug.jpg
    82,8 KB · Aufrufe: 71
n Vector hält seine Daten in einem Object-Array und wandelt in deinem fall deine Vectordaten die du hinzufügst in ein array bevor es diese Elemente dem Object-Array hinzufügt:

Java:
public synchronized boolean addAll(Collection<? extends E> c) {
    modCount++;
    Object[] a = c.toArray();
    int numNew = a.length;
    ensureCapacityHelper(elementCount + numNew);
    System.arraycopy(a, 0, elementData, elementCount, numNew);
    elementCount += numNew;
    return numNew != 0;
}

somit hast du intern kein Array von Vectoren sondern ein Array mit den jeweiligen Daten aus den einzelnen Vectoren die du hinzufügst, also fortgeschrieben

um ein Array von Vectoren zu erhalten müsstest du statt addAll .. add(E e) verwenden. dann wird dein Vector direkt abgelegt und nicht aufgedröselt
 
Zuletzt bearbeitet:
Hallo Final_Striker und diggaa1984,

Vielen Dank für eure beiden Hinweise.
Mit
Java:
v.add(new Vector<Serializable>(list));
in Zeile 70 funktioniert das Coding nun.

An der Ausgabe muss ich noch etwas feilen, aber das sollte ich auch ohne Hilfe schaffen.

Beste Grüsse,
Peter
 

Neue Themen


Zurück
Oben