Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rdpacato

List<Object> e PrepareStatement

Recommended Posts

Pessoal,

 

Estou com um problema... estou com uma lista de objetos com dados para ler e gerar um arquivo excel...

 

Mas meu problema está na List<Object> que não consigo pegar o valor, vindo somente a posição da memória (Lang242...)

 

 

Não sei como tratar os objeto...

Carrego assim o retorno do banco, pq é dinâmico a consulta, pode ser 1 ou 10 campos que vem... então faço dinamicamente, por isso o valor tem que vir assim:

 

 

   while (rs.next()) {
     Object[] obj = new Object[selecionado.size()+3]; // +3 por causa do campo mensagem, dispositivo e data que são fixos na consulta
     for(int i=0;i<selecionado.size();i++){
      obj[i] = rs.getObject(new Integer(i+1))+"";
      obj[i+1] = rs.getObject("id_ult_mensagem")+""; // obj[i+1] para pegar a coluna última mensagem
      obj[i+2] = rs.getObject("cod_dispositivo")+""; // obj[i+2] para pegar a coluna cod do dispositivo
      obj[i+3] = rs.getObject("dt_hora_dispositivo")+""; // obj[i+3] para pegar a coluna data do dispositivo
     }
    
     listaRes.add(obj);
     criarExcel.criarPlanilhaGeraRelatorioTeste(titulos, listaRes, grama, login, null); // CHAMO A CLASSE PARA CRIAR O ARQUIVO
    
   }

 

Só vem a posição da memória, não consigo converter em string....

Tentei ler assim também e nada:

 

            int rows = sheet.getRows();
           
         
             for (int j = 0; j < titulos.size(); j++) {
              for (int i = 0; i < listaRes.size(); i++) {
               Label label = new Label(j, rows, listaRes.get(i).toString(), format.cellResult()); //.toString não funciona aqui
               sheet.addCell(label);
               
               System.out.println("1= linha:"+rows + " coluna:" + j);
               
              }
              rows = rows +1;
              System.out.println("2= linha:"+rows + " coluna:" + j);
             }

 

 

 

 

Aqui está todo o método da leitura do BD, ainda vou separar algumas coisas em outros métodos, mas por enquanto está assim:

 

 

public boolean geraArquivoExcelTeste(List<String> selecionado, String dataIni, String dataFin, String horaIni, String horaFin, String grama, String login) {
boolean existe = false;
List<Object[]> listaRes = new ArrayList<Object[]>();
List<String> titulos = new ArrayList<String>();
 
CriarExcel criarExcel = new CriarExcel();
 
Connection conn = null;
PreparedStatement ps = null;
 
 
// SELECIONADO SÃO OS CHECKBOX SELECIONADOS NA TELA, APARTIR DELES QUE SERÃO CONSULTADOS NO BD
if (!selecionado.isEmpty()) {
Iterator<String> it = selecionado.iterator();
while (it.hasNext()) {
String valor = it.next();
sql.append(valor);
if (it.hasNext()) {
sql.append(", ");
}
}
}
 
try {
 
conn = ConnectionManager.obterConexao();
ps = conn.prepareStatement(SQL_SELECT_MED_GRAF + sql + SQL_WHERE_MED_GRAF);
ps.setString(1, grama);
ps.setString(2, login);
ps.setString(3, dataIni);
ps.setString(4, dataFin);
ps.setString(5, horaIni);
ps.setString(6, horaFin);
System.out.println("SQL: " + SQL_SELECT_MED_GRAF + sql + SQL_WHERE_MED_GRAF);
ResultSet rs = ps.executeQuery();
 
ResultSetMetaData rsmd=rs.getMetaData(); 
int numColumns = rsmd.getColumnCount(); 
 
// DEFINI OS TITULOS DAS COLUNAS
for (int i=0; i<numColumns; i++) { 
if ("instantanea".equals(rsmd.getColumnName (i + 1)) ){
titulos.add("Instantânea");
}
else if ("engine".equals(rsmd.getColumnName (i + 1)) ){
titulos.add("Motor");
}
else if ("level".equals(rsmd.getColumnName (i + 1)) ){
titulos.add("Nvl");
}
//titulos.add(rsmd.getColumnName (i + 1));
System.out.println("COLUNAS: " + rsmd.getColumnName (i + 1));
}
titulos.add("Última Mensagem"); // Add no antipenúltima a coluna id_ult_mensagem
titulos.add("Dispositivo"); // Add no penúltima a coluna cod dispositivo
titulos.add("Data Dispositivo"); // Add no final a coluna data
 
while (rs.next()) {
Object[] obj = new Object[selecionado.size()+3]; // +3 por causa do campo mensagem, dispositivo e data
for(int i=0;i<selecionado.size();i++){
obj[i] = rs.getObject(new Integer(i+1))+"";
obj[i+1] = rs.getObject("id_ult_mensagem")+""; // obj[i+1] para pegar a coluna última mensagem
obj[i+2] = rs.getObject("cod_dispositivo")+""; // obj[i+2] para pegar a coluna cod do dispositivo
obj[i+3] = rs.getObject("dt_hora_dispositivo")+""; // obj[i+3] para pegar a coluna data do dispositivo
}
 
listaRes.add(obj);
criarExcel.criarPlanilhaGeraRelatorioTeste(titulos, listaRes, grama, login, null);
 
}
 
} catch (Exception e) {
e.printStackTrace();
} finally {
ConnectionManager.fecharConexao(conn, null, ps);
}
 
return existe;
}

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se esta é a maneira certa, está dando java.lang.ArrayIndexOutOfBoundsException: 6

 

      int rows = sheet.getRows();
           
         
            
              for (int i = 0; i < listaRes.size(); i++) {
               for (int j = 0; j < titulos.size(); j++) {
                System.out.println("Valor: " + listaRes.get(i)[i]); 
                
                Label label = new Label(j, rows, (String) listaRes.get(i)[i], format.cellResult()); //AQUI
                sheet.addCell(label);
               
                System.out.println("1= linha:"+rows + " coluna:" + j);
              
               
              }
               rows = rows +1;
   
             }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você vai tratar todos os dados como string, por que está armazenando em um arraylist de Object?

Crie um ArrayList<String> e vá inserindo os valores retornados do banco de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mudei o jeito de pegar no BD para lista de String (List<String> ) :

 while (rs.next()) {
    String obj = null;
     for(int i=0;i<selecionado.size();i++){
      obj = rs.getString(new Integer(i+1))+"";
      listaRes.add(obj);
     }
    obj = rs.getString("id_ult_mensagem")+""; // obj[i+1] para pegar a coluna última mensagem
    listaRes.add(obj);    
    obj = rs.getString("cod_dispositivo")+""; // obj[i+2] para pegar a coluna cod do dispositivo
    listaRes.add(obj);
    obj = rs.getString("dt_hora_dispositivo")+""; // obj[i+3] para pegar a coluna data do dispositivo
    listaRes.add(obj);
    
    
   }
   criarExcel.criarPlanilhaGeraRelatorioTeste(titulos, listaRes, grama, login, null);  

Pois o outro jeito estava se perdendo quando tentava imprimir o vetor...

Mas o resultado agora está vindo, porem ainda estou vendo como ordenar corretamente, o resultado do retorno é:


1= linha:793 coluna:0
Valor: QAG0035667
1= linha:793 coluna:1
Valor: QAG0035667
1= linha:793 coluna:2
Valor: QAG0035667
1= linha:793 coluna:3
Valor: QAG0035667
1= linha:793 coluna:4
Valor: QAG0035667
1= linha:793 coluna:5
Valor: QAG0035667
1= linha:794 coluna:0
Valor: 24/09/2014 08:16:02
1= linha:794 coluna:1
Valor: 24/09/2014 08:16:02
1= linha:794 coluna:2
Valor: 24/09/2014 08:16:02
1= linha:794 coluna:3
Valor: 24/09/2014 08:16:02
1= linha:794 coluna:4
Valor: 24/09/2014 08:16:02
1= linha:794 coluna:5
Valor: 24/09/2014 08:16:02

 

ele repete nas 6 linhas das 6 colunas o valor que deveria ser em uma linha...

      int rows = sheet.getRows();
           
         
            
              for (int i = 0; i < listaRes.size(); i++) { // LINHAS
               for (int j = 0; j < titulos.size(); j++) { // COLUNAS
                System.out.println("Valor: " + listaRes.get(i)); 
                
j = Coluna e Rows = Linha
                Label label = new Label(j, rows, (String) listaRes.get(i), format.cellResult()); //AQUI
                sheet.addCell(label);
               
                System.out.println("1= linha:"+rows + " coluna:" + j);
              
               
              }
               rows = rows +1;
   
             }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui ordenar... mas agora ele não termina todos os registros... :(

 

 

            int z = 0;
            int j = 0;
            for (int i = 0; i < listaRes.size(); i++) {
          System.out.println("Size: " + listaRes.size());
    System.out.println("1= linha:"+rows + " coluna:" + j);
    System.out.println("Valor: " + listaRes.get(z));
             if (j < titulos.size()){
        Label label = new Label(j, rows, listaRes.get(z), format.cellResult());
        sheet.addCell(label);
        z++;
        j++;
       } else {
        j = 0;
        rows = rows +1;
       }
            }

Para no registro 679, e no size tem 792... não sei pq sai do for

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui:

Ainad vou dar mais algumas simplificadas, mas já ficou 100% perto do que estava.. a parte que eu estava com dificuldade fiz essa lógica:

  // CRIA LINHAS DE RESULTADOS
            int rows = sheet.getRows(); // Número da linha no Excel      
            int z = 0; // Posição da lista de resultado
            for (int i = 0; i < listaRes.size(); i++) { // Varrer a lista de resultado por tamanho
             
             for (int j=0; j < titulos.size(); j++){ // varrear a lista de títulos para pegar valor da coluna
             
              sheet.addCell(new Label(j, rows, listaRes.get(z), format.cellResult())); // add linha no excel
           z++; // soma uma posição da lista
       }
             i = z-1; // add no índice da lista o valor anterior porque o z foi somado uma posição a mais;
             rows = rows +1; // pula uma linha no arquivo excel
            }

Código completo:

public void criarPlanilhaGeraRelatorioTeste(List<String> titulos, List<String> listaRes, String grama, String login, HttpServletResponse response) throws Exception,
   IOException, BiffException, ClassNotFoundException, SQLException {
  
  NomeArquivoExcel arquivoExcelRelatorio = new NomeArquivoExcel();
  File filename = arquivoExcelRelatorio.NomeExcelRelatorio(login);
  File filename2 = new File(filename.toString());
  if (!filename2.exists()) {
   
   FormatCell format = new FormatCell();
   // 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", 0);
      
   // MERGE col - lin to col - lin PARA O TÍTULO PRINCIPAL grama
   sheet.mergeCells(0, 0, 2, 0);
   
   // col, lin PARA O TÍTULO PRINCIPAL grama
   sheet.addCell(new Label(0, 0, "grama: " + grama, format.cellVeic()));
   
            // CRIA TÍTULOS
            for (int i = 0; i < titulos.size(); i++) {
             sheet.addCell(new Label(i, 2, titulos.get(i), format.cellTitle()));
                sheet.setColumnView(i, 19); // seta largura da coluna i
            }
            // CRIA LINHAS DE RESULTADOS
            int rows = sheet.getRows(); // Número da linha no Excel      
            int z = 0; // Posição da lista de resultado
            for (int i = 0; i < listaRes.size(); i++) { // Varrer a lista de resultado por tamanho
             
             for (int j=0; j < titulos.size(); j++){ // varrear a lista de títulos para pegar valor da coluna
             
              sheet.addCell(new Label(j, rows, listaRes.get(z), format.cellResult())); // add linha no excel
           z++; // soma uma posição da lista
       }
             i = z-1; // add no índice da lista o valor anterior porque o z foi somado uma posição a mais;
             rows = rows +1; // pula uma linha no arquivo excel
            }
         
           
   // Escrevedo o arquivo em disco
   workbook.write();
   // Fechando a IO
   workbook.close();
  } else {
   filename2.delete();
   filename2.deleteOnExit();
  }
 }

No Servlet crir lista de string como me recomendou..:

 

 

 
while (rs.next()) {
 
for(int i=0;i<selecionado.size();i++){
listaRes.add(rs.getString(new Integer(i+1))+"");
 
}
listaRes.add(rs.getString("id_ult_mensagem")+""); // para pegar a coluna última mensagem
listaRes.add(rs.getString("cod_dispositivo")+""); // para pegar a coluna cod do dispositivo
listaRes.add(rs.getString("dt_hora_dispositivo")+""); // para pegar a coluna data do dispositivo
 
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.