benötigte Excelformeln in die letzte Spalte

Morinho

Aktives Mitglied
Hallo zusammen,

ich habe durch langes suchen und ausprobieren leider nicht das gewünschte Ergebnis zu meinem derzeitigen Hindernis gefunden. Deshalb hoffe ich, dass ihr mir weiterhelfen könnt.

Folgende Schwierigkeit liegt vor:

Ich habe mithilfe von Java ein Excelfile erstellt und übertrage Daten eines csv-Files in das erstellte xlsx-File. Nun möchte ich die letzte Spalte dieses Excelfile herausfinden und dort Formeln bezogen auf die übertragenen Daten eintragen. Doch ich bekomme es nicht hin das ich meinen Zeiger auf diese Stelle bekomme und etwas eintragen kann.

Hier also meine Fragen:

Wie findet man mithilfe von Java die letzte Spalte in einem Excelfile?
Wie fügt man Formeln ein damit sie auch gleich berechnet werden und nicht nur wie ein String dann drinstehen?


Dann hätte ich noch kurz eine Bitte um einen Tipp:
Und zwar sollte ich das Einfügen der Formeln in der gleichen Methode unterbringen oder sollte ich eine neue dafür schreiben?

Code:

Java:
package testconvert;


//alle benötigten imports
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


public class CSVToExcelConverter{

	public void CsvToXlsx(String fileName) throws IOException //diese Methode erstellt ein xlsx-File und schreibt die benötigten Daten zuerst einmal hinein, um sie danach mit bestimmten Formeln zu unterziehen, und Diagramme dazu zu erstellen
	{

// Hier werden alle benötigten Variablen initialisiert
	ArrayList arList=null; //arList wird auf null gesetzt
	ArrayList al=null; //al wird auf null gesetzt
	String fName = /*inDirectory als Variable einfügen*/"D:\\test.csv"; //Später ist dies die Variable zur Auswahl der Dokumente die ausgewertet werden sollen
	String thisLine; //thisLine wird als String festgelegt
	int count=0; //count wird als integer initialisiert und auf 0 gesetzt
	FileInputStream fis = new FileInputStream(fName); //fis erhält die Werte die im String fName stehen
	DataInputStream myInput = new DataInputStream(fis); //myInput erhält die Werte die in fis stehen
	int i=0; //i wird als integer initalisiert und auf 0 gesetzt
	arList = new ArrayList(); //eine neue ArrayList vom Typ arList wird erstellt

//Hier werden die Daten bei ; gesplittet
	while ((thisLine = myInput.readLine()) != null) //es wird solange gelesen bis die letzte Zeile erreicht ist
	{
	al = new ArrayList(); //eine neue ArrayList vom Typ al wird erstellt
	String strar[] = thisLine.split(";"); //die eingelesenen Zeilen werden bei ";" gesplittet und im String-Array strar gespeichert
	for(int j=0;j<strar.length;j++)
	{
	al.add(strar[j]); //die einzelnen Werte des String-Arrays strar werden zur ArrayList al hinzugefügt
	} //die for-Schleife endet hier
	arList.add(al); //die Werte der ArrayList al werden der ArrayList arList hinzugefügt
	System.out.println();
	i++;
	} //die while-Schleife endet hier

// Hier wird versucht die Zeilen einzulesen
	try
	{
	XSSFWorkbook wb = new XSSFWorkbook(); //ein XSSFWorkbook mit dem Namen wb wird erstellt
	XSSFSheet dsheet = wb.createSheet("Diagramm"); //eine Tabelle im XSSFWorkbook wb mit dem Namen Diagramm wird erstellt
	XSSFSheet msheet = wb.createSheet("Metadaten"); //eine Tabelle im XSSFWorkbook wb mit dem Namen Metadaten wird erstellt
	for(int k=0;k<arList.size();k++)
	{
	ArrayList ardata = (ArrayList)arList.get(k); //es wird eine ArrayList mit dem Namen ardata erstellt und es wird ein getter zur ArrayList arList erstellt
	XSSFRow row = msheet.createRow((short) 0+k); //hier werden die Spalten für die Tabelle msheet gebildet
	for(int p=0;p<ardata.size();p++) //die for-Schleife wird benutzt um den Spalten die genau Anzahl von Zeilen zuzuordnen
	{
	XSSFCell cell = row.createCell((short) p); //hier werden die Zeilen für die Tabelle msheet gebildet
	
	System.out.println(cell.getColumnIndex()); //gibt aus in welcher Zeile der Zeiger steht
	
	String data = ardata.get(p).toString(); //String data wird erstellt um die einzelnen Werte der ArrayList ardata zu schreiben
	if(data.startsWith("=")) //if-Bedingung erfüllt wenn data mit einem "=" beginnt
	{
	cell.setCellType(Cell.CELL_TYPE_STRING); //Cell-Typ wird auf String gesetzt
	data=data.replaceAll("\"", ""); // \ wird mit einer Leertaste ersetzt
	data=data.replaceAll("=", ""); // = wird mit einer Leertaste ersetzt
	cell.setCellValue(data); //die Werte der Variablen data werden nach und nach in die Zeilen geschrieben
	} //if-Bedingung endet
	
	else if(data.startsWith("\""))//else-if-Bedingung erfüllt wenn data mit "\"" beginnt
	{
	data=data.replaceAll("\"", ""); // \" wird mit einer Leertaste ersetzt
	cell.setCellType(Cell.CELL_TYPE_STRING); //Cell-Typ wird auf String gesetzt
	cell.setCellValue(data); //die Werte der Variablen(vom Typ String) data werden nach und nach in die Zeilen geschrieben
	} //else-if-Bedingung endet
	
	else{ //für sonstige Bedingungen
	data=data.replaceAll("\"", "");
	cell.setCellType(Cell.CELL_TYPE_NUMERIC); //Cell-Typ wird auf Numeric gesetzt
	cell.setCellValue(data); //die Werte der Variablen(vom Typ Numeric) data werden nach und nach in die Zeilen geschrieben
	
	} //else-Bedingung endet
	
	} //for-Schleife endet
	
	} //for-Schleife endet

	FileOutputStream fileOut = new FileOutputStream(/*outDirectory als Variable einfügen*/"D:\\" + fileName + ".xlsx");
	wb.write(fileOut); //das geschriebene XSSFWorkbook wb wird unter dem Dateiname fileName.xlsx gespeichert
	fileOut.close(); //zuletzt wird das File geschlossen
	System.out.println("Your excel file has been generated"); //Dies ist die Meldung falls das File erfolgreich erstellt und geschrieben wurde
    
	} //try-Schleife endet
	//zum fangen von auftretenden Fehlern
	catch ( Exception ex ) {
	ex.printStackTrace();
	} //catch-Bedingung endet
	} //CsvToXlsx method wird geschlossen
} //Converter class wird geschlossen
 
Zuletzt bearbeitet von einem Moderator:

buggy84

Bekanntes Mitglied
Ich mag das eigentlich nicht, mache es aber trotzdem:

Dein Code ist unformatiert und nur sehr schwer lesbar. Deine Fragestellung ist klar, aber damit das jemals jemand beantworten kann, muss man sich in deinen "Spaghetticode" erstmal reinfinden. Das lange suchen und ausprobieren sieht man deinem Code an, das ist nicht böse gemeint, ich finde es gut dass man sich mit einem Problem intensiv beschäftigt bevor man jemanden fragt. So sollte es sein.

Ich empfehle Dir diese API und das dazugehörige Tutorial und Beispielsheets. Ich benutze diese API seit langem und bin mit der Bedienung und den Ergebnissen mehr als zufrieden. Auch gibt es mehrere weitere Tutorials im Netz zu dieser API, scheint also nicht nur bei mir beliebt zu sein:

Java Excel API Tutorial
 

Joose

Top Contributor
Wie findet man mithilfe von Java die letzte Spalte in einem Excelfile?
Wie fügt man Formeln ein damit sie auch gleich berechnet werden und nicht nur wie ein String dann drinstehen?

Zähle doch einfach mit wieviele Spalten du in dein File einträgst und +1 ist dann die Letzte ;)
Wie man Formeln richtig ins Excel einträgt steht eigentlich in der API :)

Java:
public class CSVToExcelConverter{
	ArrayList arList=null; //arList wird auf null gesetzt
	ArrayList al=null; //al wird auf null gesetzt
	String fName = /*inDirectory als Variable einfügen*/"D:\\test.csv"; //Später ist dies die Variable zur Auswahl der Dokumente die ausgewertet werden sollen
	String thisLine; //thisLine wird als String festgelegt
.....
	arList = new ArrayList(); //eine neue ArrayList vom Typ arList wird erstellt
.....
	XSSFWorkbook wb = new XSSFWorkbook(); //ein XSSFWorkbook mit dem Namen wb wird erstellt
	XSSFSheet dsheet = wb.createSheet("Diagramm"); //eine Tabelle im XSSFWorkbook wb mit dem Namen Diagramm wird erstellt
	XSSFSheet msheet = wb.createSheet("Metadaten"); //eine Tabelle im XSSFWorkbook wb mit dem Namen Metadaten wird erstellt
.....
	cell.setCellType(Cell.CELL_TYPE_STRING); //Cell-Typ wird auf String gesetzt
	data=data.replaceAll("\"", ""); // \ wird mit einer Leertaste ersetzt
	data=data.replaceAll("=", ""); // = wird mit einer Leertaste ersetzt
.....

Hinweis: Überdenke nochmals deine Kommentare. Kommentare sollten einen Mehrwert geben, sprich Informationen geben die ich aus der Codezeile selbst nicht rauslesen kann.
Das du Variable X auf "null" setzt kann ich aus dem Code rauslesen dazu braucht es kein Kommentar.
Eine neue ArrayList wird erstellt, ist ebenfalls aus dem Code ableitbar. Das Kommentar ist sogar falsch das keine ArrayList vom Typ arList erstellt wird. Diesen Typ gibt es gar nicht.

Bei
Java:
	data=data.replaceAll("\"", ""); // \ wird mit einer Leertaste ersetzt
	data=data.replaceAll("=", ""); // = wird mit einer Leertaste ersetzt
ist es vom Code her sichtbar das du alle " durch ein Leerzeichen ersetzt.
Ein besseres Kommentar wäre hier: "Ersetze alle '=' weil sonst Fehler ....."
 
Zuletzt bearbeitet:

Morinho

Aktives Mitglied
Ich bedanke mich schonmal für alles Kommentare und entschuldige mich für die Formatierung nur jeder hat so seine Eigenarten und meine ist das ich es so besser finde. :D

Ich bedanke mich für den guten Tipp und werde versuchen mich im Tutorial zurecht zu finden.

Das mit den Kommentar versteh ich ned ganz was du da meinst aber diesen Teil habe ich aus dem Internet und ist nicht von mir :)
 

Joose

Top Contributor
entschuldige mich für die Formatierung nur jeder hat so seine Eigenarten und meine ist das ich es so besser finde. :D

Brauchst dich nicht entschuldigen, wie du schon sagst jeder hier und welche.

Das mit den Kommentar versteh ich ned ganz was du da meinst

Naja die Kommentare die neben jeder Codezeile stehen, sind einfach überflüssig.
Da die Kommentare genau das gleiche wiedergeben was der Code schon aussagt, der einzige Unterschied jeder (auch nicht Programmierer) kann so verstehen was die Zeile macht.
Wenn du ein Kommentar für einen Code schreibst, dann sollte dieses Kommentar auch einen wirklichen Mehrwert haben -> zusätzliche Informationen bieten die nicht aus dem Code ersichtlich sind.
Beispiele: Warum wird so oder so gerechnet, woher hast du Informationen das es so gemacht werden muss usw.
 

Morinho

Aktives Mitglied
Ok jetzt weis ich was du meinst ja das habe ich nur so für mich bis jetzt hingeschrieben da das mein Testprogramm ist.

Ich weis was die Zeile tut doch es ist für mich schöner zulesen als Programmiersprache.

Mein Hauptprogramm sozusagen später das fertige wird anderster kommentiert.
 

Joose

Top Contributor
Bitte doch mit Code (wenn notwendig) und einer konkreten Frage.

Wie man die letzte Spalte findet habe ich oben schon erwähnt:
Zähle mit wieviele du einträgst + 1 = letzte Spalte

Wie man Formeln in einer Zelle einträgt:
Steht in der Dokumentation
 

Morinho

Aktives Mitglied
Also ich bedanke mich gleich einmal für alle Antworten die ich schon bekommen habe und es hat mir schon weitergeholfen.

Ich habe es soweit das ich das Excelfile erstelle, die jeweiligen Werte der csv übernehme und wieder schließe, sobald dies erfolgt ist.

Nun möchte ich mit einer zweiten Methode das Excelfile wieder öffnen und Formeln reinschreiben.

Nun bin ich aber auf ein paar Schwierigkeiten gestoßen.

Denn meine Fragen lauten:
Wie kann ich fileout in der neuen Methode wieder öffnen um in das erstellte Excelfile die Formeln zu schreiben?
Wie kann ich auf das Objekt msheet der Methode CSVToXlsx mit meiner Methode ExcelFormel zugreifen?

Ich hoffe daher das ihr mir einige Tipps dazu geben könnt.

Java:
package testconvert;


//alle benötigten imports
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


public class CSVToExcelConverter{

	public void CsvToXlsx(String fileName) throws IOException //diese Methode erstellt ein xlsx-File und schreibt die benötigten Daten zuerst einmal hinein, um sie danach mit bestimmten Formeln zu unterziehen, und Diagramme dazu zu erstellen
	{

// Hier werden alle benötigten Variablen initialisiert
	ArrayList arList=null; //arList wird auf null gesetzt
	ArrayList al=null; //al wird auf null gesetzt
	String fName = /*inDirectory als Variable einfügen*/"D:\\test.csv"; //Später ist dies die Variable zur Auswahl der Dokumente die ausgewertet werden sollen
	String thisLine; //thisLine wird als String festgelegt
	int count=0; //count wird als integer initialisiert und auf 0 gesetzt
	FileInputStream fis = new FileInputStream(fName); //fis erhält die Datei die im String fName steht
	DataInputStream myInput = new DataInputStream(fis); //myInput erhält die Werte die in fis stehen
	int i=0; //i wird als integer initalisiert und auf 0 gesetzt
	arList = new ArrayList(); //eine neue ArrayList vom Typ arList wird erstellt

//Hier werden die Daten bei ; gesplittet
	while ((thisLine = myInput.readLine()) != null) //es wird solange gelesen bis die letzte Zeile erreicht ist
	{
	al = new ArrayList(); //eine neue ArrayList vom Typ al wird erstellt
	String strar[] = thisLine.split(";"); //die eingelesenen Zeilen werden bei ";" gesplittet und im String-Array strar gespeichert
	for(int j=0;j<strar.length;j++)
	{
	al.add(strar[j]); //die einzelnen Werte des String-Arrays strar werden zur ArrayList al hinzugefügt
	} //die for-Schleife endet hier
	arList.add(al); //die Werte der ArrayList al werden der ArrayList arList hinzugefügt
	System.out.println();
	i++;
	} //die while-Schleife endet hier

// Hier wird versucht die Zeilen einzulesen
	try
	{
	XSSFWorkbook wb = new XSSFWorkbook(); //ein XSSFWorkbook mit dem Namen wb wird erstellt
	XSSFSheet dsheet = wb.createSheet("Diagramm"); //eine Tabelle im XSSFWorkbook wb mit dem Namen Diagramm wird erstellt
	XSSFSheet msheet = wb.createSheet("Metadaten"); //eine Tabelle im XSSFWorkbook wb mit dem Namen Metadaten wird erstellt
	for(int k=0;k<arList.size();k++)
	{
	ArrayList ardata = (ArrayList)arList.get(k); //es wird eine ArrayList mit dem Namen ardata erstellt und es wird ein getter zur ArrayList arList erstellt
	XSSFRow row = msheet.createRow((short) 0+k); //hier werden die Spalten für die Tabelle msheet gebildet
	
	for(int p=0;p<ardata.size();p++) //die for-Schleife wird benutzt um den Spalten die genau Anzahl von Zeilen zuzuordnen
	{
	XSSFCell cell = row.createCell((short) p); //hier werden die Zeilen für die Tabelle msheet gebildet
	
	System.out.println(cell.getColumnIndex()); //gibt aus in welcher Zeile der Zeiger steht
	
	String data = ardata.get(p).toString(); //String data wird erstellt um die einzelnen Werte der ArrayList ardata zu schreiben
	if(data.startsWith("=")) //if-Bedingung erfüllt wenn data mit einem "=" beginnt
	{
	cell.setCellType(Cell.CELL_TYPE_STRING); //Cell-Typ wird auf String gesetzt
	data=data.replaceAll("\"", ""); // \ wird mit einer Leertaste ersetzt
	data=data.replaceAll("=", ""); // = wird mit einer Leertaste ersetzt
	cell.setCellValue(data); //die Werte der Variablen data werden nach und nach in die Zeilen geschrieben
	} //if-Bedingung endet
	
	else if(data.startsWith("\""))//else-if-Bedingung erfüllt wenn data mit "\"" beginnt
	{
	data=data.replaceAll("\"", ""); // \" wird mit einer Leertaste ersetzt
	cell.setCellType(Cell.CELL_TYPE_STRING); //Cell-Typ wird auf String gesetzt
	cell.setCellValue(data); //die Werte der Variablen(vom Typ String) data werden nach und nach in die Zeilen geschrieben
	} //else-if-Bedingung endet
	
	else{ //für sonstige Bedingungen
	data=data.replaceAll("\"", "");
	cell.setCellType(Cell.CELL_TYPE_NUMERIC); //Cell-Typ wird auf Numeric gesetzt
	cell.setCellValue(data); //die Werte der Variablen(vom Typ Numeric) data werden nach und nach in die Zeilen geschrieben
	
	} //else-Bedingung endet
	
	} //for-Schleife endet
	
	} //for-Schleife endet
	
		
	/*for (int z=0; z<arList.size();z++){
	ArrayList ardata = (ArrayList)arList.get(z);
	XSSFRow formelrow = msheet.createRow(z);
	
	for (int y=300; y<ardata.size();y++){
	XSSFCell formelcell = formelrow.createCell(y);
	
	for (int x=35; x<arList.size();x++){
	formelcell.setCellType(Cell.CELL_TYPE_FORMULA);
	formelcell.setCellFormula("A" + x + "B" + x);
	System.out.println(formelcell);
	}
	
	}
	
	}*/
	
	

	FileOutputStream fileOut = new FileOutputStream(/*outDirectory als Variable einfügen*/"D:\\" + fileName + ".xlsx");
	wb.write(fileOut); //das geschriebene XSSFWorkbook wb wird unter dem Dateiname fileName.xlsx gespeichert
	fileOut.close(); //zuletzt wird das File geschlossen
	System.out.println("Auswertung erfolgreich durchgeführt!"); //Dies ist die Meldung falls das File erfolgreich erstellt und geschrieben wurde
    
	} //try-Schleife endet
	//zum fangen von auftretenden Fehlern
	catch ( Exception ex ) {
	ex.printStackTrace();
	} //catch-Bedingung endet
	} //CsvToXlsx method wird geschlossen
	
	
	
	public void ExcelFormel()throws FileNotFoundException{ //Diese Methode wird verwendet um die benötigten Formeln in das erstellte xlsx-File zu schreiben
		String filen = /*outDirectory*/ ; //Hier soll die xlsx-Datei übergeben werden
		FileInputStream fileinst = new FileInputStream(filen); //Durch den FileInputStream soll das File geöffnet werden
	try
	{
		for(int i = 0; i < AnzahlZeilen; i++){ //Die Anzahl der Zeilen muss analysiert werden
			XSSFRow row = msheet.createRow((short) 0+i); //Hier werden die benötigten Zeilen erstellt
			
			for(int j = AnzahlSpalten+2; j < AnzahlSpalten; j++){ //Die Anzahl der Spalten muss analysiert werden und dann muss man um 2 plus rechnen um die richtige Anfangsspalte zu ermitteln
				XSSFCell cell = row.createCell((short) j); //Hier werden die benötigten Spalten erstellt 
				
				for(z = 35/*Platzhalter für Formeln*/; z < AnzahlZeilen; z++){
					//Formeln in Zellen schreiben
				}

			}
		}
	}
	catch(Exception fnfe){ //Hier werden die jeweiligen Fehlermeldungen behandelt
		fnfe.printStackTrace();
	}
	}
	
	
	
} //Converter class wird geschlossen
 
Zuletzt bearbeitet von einem Moderator:

Joose

Top Contributor
Nun möchte ich mit einer zweiten Methode das Excelfile wieder öffnen und Formeln reinschreiben.

Lass es doch gleich offen und verwende es weiter? Dann sparst du dir das erneute einlesen.

Denn meine Fragen lauten:
Wie kann ich fileout in der neuen Methode wieder öffnen um in das erstellte Excelfile die Formeln zu schreiben?
Wie kann ich auf das Objekt msheet der Methode CSVToXlsx mit meiner Methode ExcelFormel zugreifen?

Um die Exceldatei weiterzubearbeitn musst diese einfach wieder einlesen.
Siehe Beispiele in der Dokumentation: Habe da mal eins rausgepickt -> https://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/hssf/usermodel/examples/ReadWriteWorkbook.java

In diesem Beispiel siehst du wie du ein Excel Datei einlesen kannst und wieder zu dem XSSFSheet Objekt kommst.
 

Ähnliche Java Themen

Neue Themen


Oben