Dúvida de Lógica envolvendo JExcel [RESOLVIDO]

13 respostas
P

Pessoal,

Tem um método que cria uma planilha excel...

Quero verificar se ele ja possui 60000 registros (linhas) se sim ele criar uma sheet nova e começar de novo... só que do jeito que está, ele le até o limite, depois ele cria um registro por Sheet.

// SE O ARQUIVO NÃO EXISTIR NO DIRETORIO, CRIA UM COM OS TITULOS DAS COLUNAS

if (!filename2.exists()){
	    	
    		
	    	//Instanciando a classe q gera o novo arquivo do Excel   
	        WritableWorkbook workbook = Workbook.createWorkbook(new File(filename.toString()));   
	           
	        //Criando uma nova planilha   
	        WritableSheet sheet = workbook.createSheet("Resultado", 0);
	        
	        
        	//col, lin
	        Label labelTitulo0 = new Label(0, 0, "Dispositivo", arial10font);   
	        sheet.addCell(labelTitulo0);
	        
	        Label labelTitulo1 = new Label(1, 0, "SIMCard", arial10font);   
	        sheet.addCell(labelTitulo1);


// E PREENCHE A PRIMEIRA LINHA

int i = sheet.getRows();
	        
        	//col, lin
	        Label label = new Label(0, i, dispositivo, arial10fontResult);   
	        sheet.addCell(label);
	        
	        Label label1 = new Label(1, i, simCard, arial10fontResult);   
	        sheet.addCell(label1);


	    	} else {
	    		// SE O ARQUIVO JÁ EXISTIR ELE PEGA O JA CRIADO E CONTINUA A COPIAR PELA LINHA QUE PAROU 

	    		Workbook rw = Workbook.getWorkbook (new File (filename2.toString())); 
	    		WritableWorkbook wwb = Workbook.createWorkbook (new File (filename2.toString()), rw);    
		        
	    		WritableSheet sheet = wwb.getSheet (0);
	    		
	    		int i = sheet.getRows();
	    		
	    		int a = wwb.getNumberOfSheets();

// AQUI ELE ENTRA, SÓ QUE DEPOIS QUE EU ADICIONO O VALOR NO a+1, ELE FICA PULANDO DE SHEET, CRIANDO UMA LINHA POR SHEET	    		

	    		if (i <= 60000){
		    		
	    		sheet = wwb.getSheet (0); 
	    		
	    		} else {
	    			sheet = wwb.createSheet("Resultado", a+1);
	    			sheet = wwb.getSheet(a);
	    			
	    		}
		        
	        	//col, lin
		        Label label = new Label(0, i, dispositivo, arial10fontResult);
		        sheet.addCell(label);
		        
		        Label label1 = new Label(1, i, simCard, arial10fontResult);
		        sheet.addCell(label1);

13 Respostas

I

Cadê o(s) looping(s) ?

P

Não tem looping… pois eu vou pegando valores de lugares distintos… então eu tenho que entrar no método preencher algumas linhas do Excel de acordo com o resultado do BD, e fico editando o arquivo criado, não tem looping… entendeu?

Essa validação eu quero para quando chegar na quantidade de 60.000 mil linhas criar outra SHEET (Plan) para continuar a gravação, sem o limite do EXCEL de 65355 linhas.

F

Cara, pelo q vi o problema está neste ponto:

Workbook rw = Workbook.getWorkbook (new File (filename2.toString()));   
WritableWorkbook wwb = Workbook.createWorkbook (new File (filename2.toString()), rw);      

// Aqui vc está pegando a primeira "Sheet" e não a última criada, que seria o correto
WritableSheet sheet = wwb.getSheet (0);  

// Como vc pegou a primeira sheet acima, o número d linhas vai ser sempre 60.000
int i = sheet.getRows();  
                  
int a = wwb.getNumberOfSheets();

No caso acima, acredito q vc tenha q pegar a última página criada e verificar a linha dela, desse jeito vc terá o número correto d linhas da última folha.

P

É Fabio é isso mesmo… só que não sei como iniciar o parâmetro pela atual SHEET, pois quando tento iniciar o WritableSheet sheet sem o “= wwb.getSheet (0);” ele da erro,
não sei como fazer

F

Eu nunca trabalhei com exportação no excel no Java, mas tente substituir o “0” ao pegar a folha por “wwb.getNumberOfSheets() -1”

// Código antigo  
WritableSheet sheet = wwb.getSheet (0);  
      
// Código novo  
WritableSheet sheet = wwb.getSheet (wwb.getNumberOfSheets() -1);

Acredito q dessa forma ele consiga pegar a última folha da planilha.
Obs.: se não estou enganado vc tem q colocar o “-1” para funcionar pois pelo q vi o índice das planilhas inicia no “0”.

P

Oi Fabio, deixando assim ele passa para a outra SHEET, só que assim, ele está pegando a linha anterior, e grava na outra SHEET aonde parou o número de linhas da anterior, ai ele fica pulando para outras SHEET gravando um registro em cada uma

WritableSheet sheet = wwb.getSheet (wwb.getNumberOfSheets() -1);
	    		
	    		int i = sheet.getRows();
	    		
	    		int a = wwb.getNumberOfSheets();
	    		
	    		if (i <= 3){
		    		
	    		sheet = wwb.getSheet (wwb.getNumberOfSheets() -1); 
	    		
	    		} else {
	    			sheet = wwb.createSheet("Resultado", a+1);
	    			sheet = wwb.getSheet(a);
	    			
	    		}
R

Pacato:
É Fabio é isso mesmo… só que não sei como iniciar o parâmetro pela atual SHEET, pois quando tento iniciar o WritableSheet sheet sem o “= wwb.getSheet (0);” ele da erro,
não sei como fazer

Qual o erro ?

P

oi rof… não é erro de exception, e sim de lógica, pois não grava anda no Excel, fica em branco, como se o sheet criado, estivesse referenciano nada…

R

a ta, foi mal ‘-’

F

Acho q o problema é q vc não está zerando a variável "i" qdo vc cria uma nova folha, tenta iniciar o "i" novamente da seguinte forma:

if (i &lt;= 60000) {
    sheet = wwb.getSheet (0);   
} else {
    sheet = wwb.createSheet("Resultado", a+1);
    sheet = wwb.getSheet(a);

    // Nesse ponto vc coloca o número da primeira linha da nova folha
    i = 1;
}

Outra observação, enquanto o número d linhas não atinge o limite, vc está setando novamente a variável "sheet", isso não é necessário, vc pode alterar o código acima para ficar assim:

if (i &gt; 60000) {
    sheet = wwb.createSheet("Resultado", a+1);
    sheet = wwb.getSheet(a);
    i = 1;
}
P

Funcionou Fabio, valeu mesmo…

Só que agora ele quando pede para salvar o arquivo apareve a mensagem:

“O Excel encontrou conteúdo ilegível em “nomeDoArquivo.xls”. Deseja recuperar o conteúdo desta pasta de trabalho? Se você confia na origem desta pasta de trabalho, clique em Sim.”

F

é, agora complicou!
Tem alguma acentuação ou caracter especial neste teste q vc está fazendo? Pode ser algum problema de codificação, faça o teste com textos simples, talvez apenas uma palavra sem acento e sem caracter especial.
A partir daí já não posso t ajudar muito pq uso linux, mas se eu encontrar algo a respeito volto a postar blz.

Flw.

P

Consegui arrumar, era por causa que ele estava gravando o mesmo nome na SHEET, agora já arrumei adicionando o parâmetro de número da SHEET junto a String "Resultado "

int a = wwb.getNumberOfSheets();
	    		
sheet = wwb.createSheet("Resultado " + a, a+1);

Valeu a todos, principalmente ao fabio pelo resultado correto.

Abs a todos

Criado 28 de fevereiro de 2013
Ultima resposta 1 de mar. de 2013
Respostas 13
Participantes 4