csv in xlsx umwandeln

Morinho

Aktives Mitglied
Hallo zusammen,
ich bräuchte Hilfe bei meinem Projekt.
Ich habe nämlich eine csv Datei mit ungefähr 15 Spalten und 38000 Zeilen und ich möchte gern diese Daten der csv-Datei sozusagen kopieren und in eine Exceltabelle schreiben also möchte ich eine csv-Datei in eine xlsx-Datei konvertieren.

Mein Code sieht bis jetzt folgender Maßen aus:

Java:
package testconvert;


//alle benötigten imports
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


public class exelim_test {
 
 public void createExcelfile(String fileName) throws IOException{
 
	 String currentLine = null; //die Variable currentLine wird auf null gesetzt
	 Workbook wb = new XSSFWorkbook(); //Ein Excelworkbook wird gebildet
	 FileOutputStream fos = new FileOutputStream(/*outDirectory*/"D:\\" + fileName +".xlsx"); //Dies ist der Pfad mit Dateiname wo die ausgewerteten xlsx-Dateien hingespeichert werden sollen
	 wb.createSheet("Diagramm"); //Hier wird eine Tabelle im Excelfile erzeugt und benannt
	 wb.createSheet("Metadaten"); //Hier wird eine Tabelle im Excelfile erzeugt und benannt
	 File myFile = new File(/*inDirectory*/"D:\\test.csv"); //Hier wird/ werden die ausgewählte/n.csv-Datei/en angegeben
	 Scanner reader = new Scanner (myFile); //Scanner wird erzeugt mit der Varibalen myFile
 while (reader.hasNextLine() == true){ //Scanner liest solange Zeilen vorhanden sind
	 currentLine = reader.nextLine();
	 String[] getrennteDaten = currentLine.split(";");//Daten werden bei ";" gesplittet und in das Array getrennteDaten geschrieben
	 FileWriter writer = new FileWriter(); //Hier sollen die gesplitteten  Daten des Arrays "getrennteDaten" in das Excelfile geschrieben werden
	 
	 writer.write("Go!");
	 writer.close();
 }
 reader.close(); //schließen von Scanner
 wb.write(fos); //schließen von FileWriter
 fos.close(); //schließen von FileOutputStream
 System.out.println("Done!"); //Ausgabe um das Programmende zu zeigen
 }
}

Ich bedanke mich gleich im Voraus für alle Bemühungen.

Mit freundlichen Grüßen
Morinho
 
Zuletzt bearbeitet von einem Moderator:
Also habe inzwischen meinen Code umgeschrieben so dass es fast funktioniert nur ich bekomme die Fehlermeldung ArrayIndexOutOfBounceException doch ich weis nicht wo das Problem liegt denn die Fehlermeldung kommt sogar wenn die csv-Datei leer ist.

Also hier die spezifische Frage:
Wieso ArrayIndextOutOfBounce? Wo liegt mein Fehler kann mir da jemand bitte helfen?

Java:
package excel;


//alle benötigten imports
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import au.com.bytecode.opencsv.CSVReader;


public class exelim {
 
 public void createExcelfile(String fileName) throws IOException{
 
	 Workbook wb = new XSSFWorkbook(); //Ein Excelworkbook wird gebildet
	 FileOutputStream fos = new FileOutputStream(/*outDirectory*/"D:\\" + fileName +".xlsx"); //Dies ist der Pfad mit Dateiname wo die ausgewerteten xlsx-Dateien hingespeichert werden sollen
	 wb.createSheet("Diagramm"); //Hier wird eine Tabelle im Excelfile erzeugt und benannt
	 Sheet sheet = wb.createSheet("Metadaten"); //Hier wird eine Tabelle im Excelfile erzeugt und benannt
     String inputCSVFile = "D:\\hallo.csv"; //Hier wird/ werden die ausgewählte/n.csv-Datei/en angegeben
     CSVReader reader = new CSVReader(new FileReader(inputCSVFile));
     String [] nextLine;
     int lnNum = 0;
     Map<String, Object[]> excel_data = new HashMap<String, Object[]>();
     while ((nextLine = reader.readNext()) != null) {
		lnNum++;                        
         excel_data.put(Integer.toString(lnNum), new Object[] {nextLine[0],nextLine[1]});                        
 }
 /* Step -5: Create Excel Data from the map using POI */
 Set<String> keyset = excel_data.keySet();
 int rownum = 0;
 for (String key : keyset) { //loop through the data and add them to the cell
         Row row = sheet.createRow(rownum++);
         Object [] objArr = excel_data.get(key);
         int cellnum = 0;
         for (Object obj : objArr) {
                 Cell cell = row.createCell(cellnum++);
                 if(obj instanceof Double)
                         cell.setCellValue((Double)obj);
                 else
                         cell.setCellValue((String)obj);
                 }
 }
 reader.close(); //schließen von Scanner
 wb.write(fos); //schließen von FileWriter
 fos.close(); //schließen von FileOutputStream
 System.out.println("Done!"); //Ausgabe um das Programmende zu zeigen
 }
}
 
Zuletzt bearbeitet von einem Moderator:
Normalerweise kommt eine Exception immer mit einem StackTrace! Dieser verrät dir genau die Zeile in der die Exception geworfen wird.

ArrayIndexOutOfBound wird dann geworfen wenn auf einen Index zugegriffen werden soll den es nicht gibt.
Beispiel:
Java:
int[] ziffern = new int[10];
// das array hat zwar eine größe von 10, aber da arrays 0-index basiert sind ist der höchste verfügbare index => größe des arrays - 1!
int zifferA = ziffern[0]; // funktioniert
int zifferB = ziffern[9]; // funktioniert
int zifferC = ziffern[10]; // wird dir eine entsprechende Exception werfen
 
Der StackTrace ist diese Zeile:

Code:
excel_data.put(Integer.toString(lnNum), new Object[] {nextLine[0],nextLine[1]});

Doch meine Frage ist wie groß muss ich das Array denn machen wenn ich eine Datei mit 100 Spalten und 56000 Zeilen größtenfalls einlesen und in eine xlsx-Datei schreiben will?
 
Was ich nicht ganz kapiere ist warum du dafür überhaupt ein Programm schreiben willst. Warum öffnest du die CSV nicht direkt mit Excel oder einem derivat?
 
Weil ich diese Daten dann bestimmten Formeln unterziehen muss und zu den ausgerechneten Werten muss ein Diagramm erstellt werden.
 
Naja du liest deine CSV Datei zeilenweise ein und willst dann im Object[] die einzelnen Werte der Spalten speichern.
Sprich das Object[] muss eine größe von 100 haben. Natürlich musst du bei jeder Zeile die du liest auch kontrollieren ob diese wirklich richtig gesplittet wurde und du ein Array mit 100 Elementen hast.
 

Zurück
Oben