Ajuda em exercicio

Olá,

Estou fazendo um exercício para a faculdade, porém não está dando nada certo e gostaria de orientações e caso alguém tenha paciência de fazer alguma versão diferente para eu ter como base eu agradeço.

Aqui está o enunciado

Enunciado: elaborar as classes Planilha, Celula , Formula e uma classe de teste. Os elementos que compõe a planilha estão representados através de uma matriz de células.

O conteúdo de uma célula pode ser: vazia (sem conteúdo), uma string, um valor (double) ou uma fórmula (que envolve os endereços de duas células e uma operação (+,-,/,*)). Quando o conteúdo da planilha é apresentado, as células com fórmulas exibem sempre o resultado da execução da fórmula.

    fórmula: a soma de 
B2 e B4 

Exemplo de classe de teste:

 Planilha  p  = new  Planilha (30,40);   // planilha de 30 linhas e 40 colunas 
     
    p.setCel(2.3 , 1 , 4);    // coloca o valor 2.3 na célula da linha 1, coluna 4 
    p.setCel(10.0, 4 , 2);   // coloca o valor 10.0   na célula da linha 4, coluna 2 p.setCel(“Contabilidade”, 1 , 1);    
     
    p.setCel(new Formula(‘+’, 1, 4, 4, 2), 2 , 2);         // na célula linha 2, coluna 2  é inserida a fórmula 
    	 	 	 	 	 	 	 // que soma o contéudo das célula da 
    	 	 	 	 	 	 	 // linha 1, col 4  com a célula  da  linha 4,  col 2. 
     
    p.mostraPlan(1,1,4,4);           // mostra todas células da linha 1, coluna 1 até linha 4,coluna 4 
     
     	 	p.salvaPlan(“planteste.xls”);  // método de implementação opcional 
     	 	 	 	 	        // pode ser também implementado o método lePlanilha(nomePlanilha) 
     
     	 	p.limpaCels(1, 1, 3, 2);    //seta como vazias as células entre linha 1, coluna 1 até linha 3, coluna 2. 

Aqui está as classes (gambiarras) que eu fiz

package planilha;

public class Celula {
    protected Object obj;

    public Celula(Object obj) {
        this.obj = obj;
    }

    public Object getObj() {
        return obj;
    }

    public void setObj(Object obj) {
        if (obj instanceof Double) {
            this.obj = (Double)obj;
        }
        if (obj instanceof String) {
            this.obj = (String)obj;
        }
    }
    
    @Override
    public String toString() {
        return  obj + "";
    }  
}


package planilha;

public class Formula extends Planilha {

    protected char sinal;
    protected int linha1, coluna1, linha2, coluna2;

    public Formula(char sinal, int l, int c, int linha1, int coluna1, int linha2, int coluna2) {
        super(l, c);
        operacao(sinal, l, c, linha1, coluna1, linha2, coluna2);
        this.linha1 = linha1;
        this.coluna1 = coluna1;
        this.linha2 = linha2;
        this.coluna2 = coluna2;
    }

    public void operacao(char s, int l, int c, int l1, int c1, int l2, int c2) {
        for (int i = 0; i < celula.length; i++) {
            for (int j = 0; j < celula[i].length; j++) {
                if (s == '+' || s == '-' || s == '*' || s == '/') {
                    if (celula[l][c] == null) {
                        if (s == '+') {
                            celula[l][c].setObj((double) celula[l1][c2].getObj() + (double) celula[l2][c2].getObj());
                        }
                        if (s == '-') {
                            celula[l][c].setObj((double) celula[l1][c2].getObj() - (double) celula[l2][c2].getObj());
                        }
                        if (s == '*') {
                            celula[l][c].setObj((double) celula[l1][c2].getObj() * (double) celula[l2][c2].getObj());
                        }
                        if (s == '/') {
                            celula[l][c].setObj((double) celula[l1][c2].getObj() / (double) celula[l2][c2].getObj());
                        }
                    } else {
                        System.out.println("Celula já preenchida");
                    }
                } else {
                    System.out.println("Sinal inválido");
                }
            }
        }
    }

    public void setSinal(char sinal) {
        this.sinal = sinal;
    }

    public void setLinha1(int linha1) {
        this.linha1 = linha1;
    }

    public void setColuna1(int coluna1) {
        this.coluna1 = coluna1;
    }

    public void setLinha2(int linha2) {
        this.linha2 = linha2;
    }

    public void setColuna2(int coluna2) {
        this.coluna2 = coluna2;
    }

}


package planilha;

public class Planilha {

    protected int linha, coluna;
    protected Celula[][] celula;

    public Planilha(int linha, int coluna) {
        this.linha = linha;
        this.coluna = coluna;
        this.celula = new Celula[linha][coluna];

        for (int i = 0; i < celula.length; i++) {
            for (int j = 0; j < celula[i].length; j++) {
                if (celula[i][j] == null) {
                 celula[i][j] = new Celula("\t");
                }
            }

        }
    }

    public void setCell(int l, int c, Object obj) {
        if (obj instanceof Double) {
            celula[l][c] = new Celula((double) obj);
        }
        if (obj instanceof String) {
            celula[l][c] = new Celula((String) obj);
        }
    }

    public void setCell(char sinal, int l, int c, int linha1, int coluna1, int linha2, int coluna2) {
        celula[l][c].obj = new Formula(sinal, l, c, linha1, coluna1, linha2, coluna2);
    }

    public void mostraCel(int l, int c) {
        for (int i = 0; i < l; i++) {
            System.out.println();
            for (int j = 0; j < c; j++) {
                System.out.print(celula[i][j] + "\t");
            }
            System.out.println();
        }
    }
}

Agradeço muito se alguém puder me ajudar