Wie bestehende Excel-Einträge mit neuen Vergleichen (mit Apache POI)?

SomewhereDave

Neues Mitglied
Hallo zusammen,

ich versuche Javacode zu schreiben der Einträge in einem String Array mit Zell-Einträgen eines Excel Workbooks vergleicht und fehlende Einträge hinzufügt.
Dafür nutze ich das Apache POI Framework (poi.apache.org).

Im Folgenden die Implementierung in einer Standalone Variante, die später in einen größeren Programmkontext verwendet werden soll:

Java:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import java.util.Set;
import java.util.TreeMap;

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

public class ReadAndWriteExcel {
		
	public static void main(String[] args){

		String[][] newProjects = {{"a","ProjektA","1"},{"b","ProjektB","2"},{"c","ProjektC","3"}};
		updateProjectList(newProjects);	
	}
	
	public static void updateProjectList(String[][] newProjects){
		
	File file = new File("projekte.xlsx");
	boolean oldProject = false; //is set true, if a project is already listed in the Excel sheet
		
		try{
			//Get the workbook instance for XLSX file
			FileInputStream fis = new FileInputStream(file);
			XSSFWorkbook workbook = new XSSFWorkbook(fis);
			XSSFSheet spreadsheet = workbook.getSheetAt(0);
			TreeMap<String, Object[]> data = new TreeMap<String, Object[]>();
	            
			if(file.isFile() && file.exists()){
				//Iterate through projects from newProjects String
				for(int k = 0; k < newProjects.length; k++){
					System.out.println("Stringeinträge:" + newProjects.length);
					
					//Iterate through project rows in existing worksheet
					for(int i = 0; i < spreadsheet.getLastRowNum() + 1;i++){
						XSSFRow row = spreadsheet.getRow(i);
						Cell cell = row.getCell(1);
						System.out.println("k:"+k+" i:"+i);
						
						//Check for Error Cells
						switch(cell.getCellType()){
		             		                case Cell.CELL_TYPE_ERROR:
		             			                System.out.println("ERROR CELL at" + cell.getRowIndex());
		             			                break;
		             		
		             		                case Cell.CELL_TYPE_STRING	:
		             			                if((cell.getStringCellValue()) != null){
		             				                //Check for new Projects
		             				                if(newProjects[k][1].equals(cell.getStringCellValue())){
	 	            					                oldProject = true;
		             				                 }		
		             			                 }
		             			                 break;
						}
					}
	       			        if(oldProject){
	       				        oldProject = false;
	       				        continue;
	       			         }
	       			         else{
	       				        data.put("1", new Object[]{newProjects[k][0], newProjects[k][1],newProjects[k][2]});
       				
	       				         Set<String> keyset = data.keySet();  
		       	                         int rownum = spreadsheet.getLastRowNum() + 1;  
		       	                         for (String key : keyset){  
		       	                                 XSSFRow row = spreadsheet.createRow(rownum++);  
		       	                                 Object [] objArr = data.get(key);  
		       	                                 int cellnum = 0;  
		       	                                for (Object obj : objArr){  
		       	                                        Cell cell = row.createCell(cellnum++);  
		       	                                        cell.setCellValue((String)obj);
		       	                                 }  
		       	                           }
	       			        }
				}	    	  
			}	      
			fis.close();
			
			try(FileOutputStream out = new FileOutputStream("projekte.xlsx")){
				workbook.write(out);
		                System.out.println("projekte.xlsx updated successfully");
			}catch(IOException e){
				  e.printStackTrace();
			}
	    }catch(IOException e){
			e.printStackTrace();;
            }
	}
}

Im Anhang findet sich eine entsprechende Exceldatei, die zum testen genutzt werden kann.

Ich habe zwei Fragen zu meiner Implementierung:
  1. Allgemein: Was ist generell von meiner Implementierung zu halten? Gibt es schönere Lösungen (die vor allem weniger Ressourcen brauchen)? Wenn ich das richtig beurtiele, so liegt die Komplexität bei a*b, wobei a = Einträge im String Array und b = Einträge in dem Excel Workbook. In der Praxis werde ich wohl auf 1000 x 1000 = 1.000.000 Durchläufe treffen.
  2. Speziell: Ich habe zwei unschöne Eigenschaften beim Testen entdeckt:
    • Wenn das Programm feststellt, dass ein String aus dem Array im Excel Workbook fehlt, dann wird dieser String sofort in das Workbook eingetragen. Beim prüfen des nächsten Strings aus dem Array, wird dann der soeben angehängte String mit dem aktuellen verglichen. Das würde ich gerne vermeiden, da sonst bei steigender Arraygröße immer mehr Ressourcen gebraucht werden.
    • Wenn man Einträge im Excel Workbook löscht (mit Excel oder über Code) bleiben leere Zellen zurück. Diese leeren Zellen werden auch beim Auslesen des Worksheet Inhalts übernommen, sodaß Lücken zwischen den Einträgen enstehen können. Stellt Apache POI eine einfach Funktion zur Verfügung, um leere Zeilen zu löschen?

Ich bin ein ziemlicher Java-Anfänger. Ich gehe also davon aus, dass einige meiner Implementierungs-Entscheidungen unsinnig für das geschulte Auge wirken. In dem Fall bin ich gerne für Kritik offen. Zu Apache POI habe ich für Anfänger leider kaum brauchbare Tutorials finden können. Auch hier bin ich für Hinweise dankbar.

Beste Grüße
David
 

Anhänge

  • projekte.zip
    6,4 KB · Aufrufe: 0
Ähnliche Java Themen
  Titel Forum Antworten Datum
F jar an bestehende Applikation anbauen Java Basics - Anfänger-Themen 1
D Bestehende Datei speichern Java Basics - Anfänger-Themen 3
D Warum sollte ich bestehende Funktionen "extend"en? Java Basics - Anfänger-Themen 32
G bestehende Makros aufrufen? Java Basics - Anfänger-Themen 7
N Nach einer Abfrage bestehende Klasse öffnen Java Basics - Anfänger-Themen 2
H Excel-Tabellen mit Java erstellen Java Basics - Anfänger-Themen 4
D Strings aus Excel-Datei einlesen Java Basics - Anfänger-Themen 2
A Verarbeiten einer Excel Datei durch das java-Programm Java Basics - Anfänger-Themen 3
rafi072001 Lesen aus einem Excel File Java Basics - Anfänger-Themen 10
P JSON-Array auf Excel-Spalten verteilen? Java Basics - Anfänger-Themen 5
S Verbindung von einer Excel Datei zu Java-- Java Basics - Anfänger-Themen 4
O JTable in Excel mit Farben Java Basics - Anfänger-Themen 8
Trèfle EXCEL-File Laufwerkunabhängig einbinden. Java Basics - Anfänger-Themen 1
S Java Daten in Excel speichern Java Basics - Anfänger-Themen 1
K Apache POI Excel Letzte Reihe einer bestimmten Spalte Java Basics - Anfänger-Themen 1
B Excel File einlesen und Überschrift prüfen Java Basics - Anfänger-Themen 8
S Prüfen ob Zelle in Excel leer ist funktioniert nicht (Apache POI) Java Basics - Anfänger-Themen 18
F Daten aus Excel-Tabelle in Java importieren Java Basics - Anfänger-Themen 15
P Variablen in Excel speichern Java Basics - Anfänger-Themen 6
P String zerstückeln und in Excel einfügen Java Basics - Anfänger-Themen 11
D Daten mit Apache POI in eine Excel Datei schreiben Java Basics - Anfänger-Themen 5
T printf Daten aus der Tabelle in Excel übernehmen Java Basics - Anfänger-Themen 5
S Kalenderwochen im Excel Java Basics - Anfänger-Themen 0
V Excel Datei einlesen und verarbeiten Java Basics - Anfänger-Themen 4
X Verknüpfte Excel Felder mitändern Java Basics - Anfänger-Themen 6
C Java Applet Fragen: Serialisierung, Excel import Java Basics - Anfänger-Themen 2
T Apache POI (Excel) - Probleme mit Zahlenformat Java Basics - Anfänger-Themen 2
F Excel und Poi Java Basics - Anfänger-Themen 12
T Zeilenweise Excel-Datei mit Strings befüllen Java Basics - Anfänger-Themen 28
P Excel-Tabelle erstellen Java Basics - Anfänger-Themen 4
R POI HSSF liesst in Excel Formel statt Ergebnis Java Basics - Anfänger-Themen 4
D println von excel $A$1 Java Basics - Anfänger-Themen 3
K JApplet zugriff auf Excel Datei Java Basics - Anfänger-Themen 3
D Werte aus Excel in Diagramm einfügen Java Basics - Anfänger-Themen 6
D Design-Tipps für neues Programm (Excel-Charts-...) Java Basics - Anfänger-Themen 3
K Konvertierung von einem Text in eine Zahl in Excel(JXL) Java Basics - Anfänger-Themen 2
H Ausgabe nach Excel exportieren Java Basics - Anfänger-Themen 7
T Datum aus Excel prüfen Java Basics - Anfänger-Themen 2
D Abfragen ob Excel-Dateien Makros enthalten? Java Basics - Anfänger-Themen 4
Strahlungsleck Datentypen Apache Poi & Excel Datumsformat Java Basics - Anfänger-Themen 4
A POI Einlesen Excel Workbook aus BLOB oder von URL anstatt aus Filesystem ? Java Basics - Anfänger-Themen 3
B Abfragen eines Excel-Feldes auf null Java Basics - Anfänger-Themen 17
T Datei mit Excel öffnen Java Basics - Anfänger-Themen 2
D Speichern in Excel über Filechooser Java Basics - Anfänger-Themen 21
S Excel Textfeld auslesen Java Basics - Anfänger-Themen 6
S POI Excel sortieren Java Basics - Anfänger-Themen 4
D BETAVERT aus Excel auch in Java? Java Basics - Anfänger-Themen 4
M Probleme mit Excel Datei und JSP Java Basics - Anfänger-Themen 7
T Text aus Word in Excel formatieren Java Basics - Anfänger-Themen 3
T ins Excel exportieren. Java Basics - Anfänger-Themen 23
B In Java erstellte Dateien in Excel verwenden Java Basics - Anfänger-Themen 4
D excel datei Spalten lesen? Java Basics - Anfänger-Themen 7
M Object in Excel schreiben Java Basics - Anfänger-Themen 4
M HSSF - JTable zu Excel exportieren Java Basics - Anfänger-Themen 13
M Excel in Java Java Basics - Anfänger-Themen 2
G Excel-Interface (J-Integra for COM) Java Basics - Anfänger-Themen 2
J POI: Leere Excel Zellen Java Basics - Anfänger-Themen 3
M Libraries für Arbeit mit Excel (Alternativen) Java Basics - Anfänger-Themen 2
E Schreiben in Excel -Zellen farbig darstellen Java Basics - Anfänger-Themen 4
G Excel in txt umwandeln Java Basics - Anfänger-Themen 1
G Zellen wie bei Excel? Java Basics - Anfänger-Themen 2
T Excel-Datei einlesen Java Basics - Anfänger-Themen 6
S Excel + Datenbank Java Basics - Anfänger-Themen 2
S Daten nach Excel Java Basics - Anfänger-Themen 12
M Auf Excel Datei zugreifen Java Basics - Anfänger-Themen 3
M Hashmap in Excel exportieren Java Basics - Anfänger-Themen 3
G wie funktioniert die Java Excel Api Java Basics - Anfänger-Themen 4
G Kann man Spalten in einer Excel-Tabelle mit Java löschen? Java Basics - Anfänger-Themen 3
V Excel und Java Java Basics - Anfänger-Themen 14
S Export nach Excel in Java Java Basics - Anfänger-Themen 7
D Excel einlesen Java Basics - Anfänger-Themen 3
N Excel Anbindung an webservices Java Basics - Anfänger-Themen 2
G Excel unter Java Java Basics - Anfänger-Themen 4
N ResultSet auf Einträge überprüfen Java Basics - Anfänger-Themen 5
R While-Loop der die Einträge eines Arrays in umgekehrter Reihenfolge anzeigt Java Basics - Anfänger-Themen 3
C Erste Schritte JComboBox Einträge auf Duplikat prüfen Java Basics - Anfänger-Themen 4
A Einträge aus Tupeln nach Regeln in Liste speichern Java Basics - Anfänger-Themen 8
S CSV auf doppelte Einträge überprüfen Java Basics - Anfänger-Themen 8
K Datentypen Einträge zweier Matrizen vergleichen Java Basics - Anfänger-Themen 4
I Einträge in den Konstruktor Java Basics - Anfänger-Themen 3
S Problem: Array alle Einträge gleich Java Basics - Anfänger-Themen 10
M Erste Schritte JList einträge Java Basics - Anfänger-Themen 1
P Erste Schritte Einträge aus verschachtelter Map chronoligisch ausgeben Java Basics - Anfänger-Themen 5
C JList Einträge nach Datum sortieren Java Basics - Anfänger-Themen 3
T Einträge in jComboBox aus Liste übernehmen Java Basics - Anfänger-Themen 1
E Array doppelte Einträge Java Basics - Anfänger-Themen 2
S Variablen Array in ArrayList auf doppelte Einträge überprüfen Java Basics - Anfänger-Themen 4
T Alte Einträge im Array werden von neuen überschrieben Java Basics - Anfänger-Themen 5
P Doppelte Einträge in eine List Java Basics - Anfänger-Themen 5
D Javaliste auf gleiche Einträge überprüfen Java Basics - Anfänger-Themen 2
C Doppelte Einträge aus String [] Array entfernen. Java Basics - Anfänger-Themen 5
C Datentypen Array-Einträge überhalb der Array-Länge - welcher Wert? Java Basics - Anfänger-Themen 5
L Erste Schritte Einträge in ArrayList prüfen Java Basics - Anfänger-Themen 4
M Ziffer einträge vergrößern Java Basics - Anfänger-Themen 16
H Einträge aus Array löschen Java Basics - Anfänger-Themen 8
J Markierte Einträge (Dateien) in JList sollen in einen anderen Ordner verschoben werden. Java Basics - Anfänger-Themen 12
K ArrayList.add() überschreibt vorhandene Einträge. Java Basics - Anfänger-Themen 12
M Gewisse Einträge aus einer ArrayList löschen Java Basics - Anfänger-Themen 3
M doppelte Einträge Emailempfänger... Java Basics - Anfänger-Themen 35
K ArrayList Zugreifen auf Einträge Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben