Bezüglich Design meines Codes

disconnectus

Aktives Mitglied
Hallo Zusammen,

ich habe eine Frage bezüglich design meines Kodes.

Ich lese aus einer MySQL Datenbank verarbeite die Daten danach gebe ich sie in Excel-format aus. Dafür benutze ich Apache POI-XSSF.
Poi hat eine Workbook Objekt:
XSSFWorkbook workBook = new XSSFWorkbook();
Diese XSSFWorkbook Classe hat static methoden. Wenn ich einen neuen Excell tabelle erstellen muss soll ich wie folgt vorgehen:
XSSFSheet sheetwrite = workBook.createSheet("time");
Ich habe mehr als 25 Tabs in meinem Excel-Output und jede excel-sheet ist sehr komplex. Wie soll ich meinen Programm strukturieren.
Ich habe wie folgt vorgegangen:
Java:
public XSSFWorkbook workBook = new XSSFWorkbook(); 
	public ExcelOutput(ArrayList<Plant> carList, ArrayList<OptionPlant> carOptionsList) {		
		TimeTabs timeTabs = new TimeTabs(workBook);
		Hierarchy hierarchy = new Hierarchy(carList, carOptionsList, workBook);

		Usw. mehrere Objects für jede gettrennte tabelle Und 

		String outputFile = "C:/***/filename.xlsx"; 
		try {
			InputOutput.writeExcel(workBook, outputFile);
		} catch (IOException e) {
    	        JFrame IOframe = new JFrame();
    		JOptionPane.showMessageDialog(IOframe, "Input, Output Error"); 
			e.printStackTrace();
		}
Java:
public class TimeTabs {
	public TimeTabs(XSSFWorkbook workBook) {
		
		XSSFRow rowwrite; 
		XSSFCell cellwrite;	 	
		XSSFSheet sheetwrite = workBook.createSheet("time");

	    for (int i = 0; i < TimeGen.nameoftimeslots.size(); i++) {       						
	       	rowwrite = sheetwrite.createRow(i);
			cellwrite = rowwrite.createCell(0);
			//arraytime[i] = "TIME_"; 
			//arraytime[i] += Integer.toString(i+1); 
			cellwrite.setCellValue(TimeGen.nameoftimeslots.get(i));
	    }
	Usw.

Das finde ich jetzt aber unlogisch weil ich die Objekte erstelle und danach sie nicht mehr benutze. Eclipse sagt mir sogar dass ich die Objecte löschen soll weil ich sie nirgendswo benutze.
Wie könnte mann alles besser strukturieren?

Wenn ich für jede Tabelle eine andere Methode implementiere, wird meine Klasse zu lang und zu komplex. Soll ich trotzdem für jede Tab eine getrennte methode implementieren?

Oder

Ich kann wie folgt neue Classen jeweils mit einer statik Method erstellen.
Java:
public XSSFWorkbook workBook = new XSSFWorkbook(); 
	public ExcelOutput(ArrayList<Plant> carList, ArrayList<OptionPlant> carOptionsList) {		
		TimeTabs.generateTimeTabs (workBook);
		Hierarchy.generateHierarchy (carList, carOptionsList, workBook);

		Usw. mehrere Static Methoden für jede getrennte tabelle Und 

		String outputFile = "C:/***/filename.xlsx"; 
		try {
			InputOutput.writeExcel(workBook, outputFile);
		} catch (IOException e) {
    	        JFrame IOframe = new JFrame();
    		JOptionPane.showMessageDialog(IOframe, "Input, Output Error"); 
			e.printStackTrace();
		}

Java:
public class TimeTabs {
	public static void generateTimeTabs (XSSFWorkbook workbook)
		
		XSSFRow rowwrite; 
		XSSFCell cellwrite;	 	
		XSSFSheet sheetwrite = workBook.createSheet("time");

	    for (int i = 0; i < TimeGen.nameoftimeslots.size(); i++) {       						
	       	rowwrite = sheetwrite.createRow(i);
			cellwrite = rowwrite.createCell(0);
			//arraytime[i] = "TIME_"; 
			//arraytime[i] += Integer.toString(i+1); 
			cellwrite.setCellValue(TimeGen.nameoftimeslots.get(i));
	    }
	Usw.

Was wäre eine bessere Struktur? Könntet ihr mir was besseres Vorschlagen?

Danke im Voraus
 
Zuletzt bearbeitet von einem Moderator:
Ich würde für jedes einzelne Blatt der Excel Datei eine eigene Klasse ableiten.
Alle diese Klassen können natürlich von gleichen/ähnlichen Interfaces oder Basisklasse ableiten. (Dadurch kannst du auch alle diese Objekte in eine Liste geben)

Von Klassen mit statischen Methoden würde ich abraten: Solltest du mal Threading einbauen wollen kann es passieren das du dir damit selber ein Bein stellst 😉

Dann kannst du einfach für jedes Blatt welches du erstellen willst, die entsprechende Klasse erstellen und dir die Seite generieren lassen.

Vorteil: Es ist einfacher Blätter auszulassen, es erhöht die Übersicht da du pro Klasse nur die Generierung von max einem Blatt hast
Nachteil: Es können dadurch natürlich sehr viele Klassen entstehen, aber das sollte das geringere Problem sein als eine Klasse mit X Methoden


Java:
public abstract class BaseSheetGenerator {
    ....

    public abstract void generateSheet(XSSFWorkbook workbook);
}

public class TimeSheetGenerator extends BaseSheetGenerator {

    public void generateSheet(XSSFWorkbook workbook) {
        // dein Code für die TimeSheet(s)
    }
}

-----------

public void static main(String[] args) {
    // Workbook erstellen, usw.
    
    ArrayList<BaseSheetGenerator> generators = new ArrayList<>();
    // hier könntest du noch eine Konfiguration einbauen um per config File zu steuern welche Sheets generiert werden sollen
    generators.add( ......);
    generators.add( ......);
    generators.add( ......);
    generators.add( ......);

    for(BaseSheetGenerator generator : generators) {
        generator.generateSheet(workbook);
    }
}
 
Zuletzt bearbeitet:

Zurück
Oben