rdpacato 2 Denunciar post Postado Setembro 30, 2014 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
rdpacato 2 Denunciar post Postado Setembro 30, 2014 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
reebr 94 Denunciar post Postado Setembro 30, 2014 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
rdpacato 2 Denunciar post Postado Outubro 1, 2014 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:0Valor: QAG00356671= linha:793 coluna:1Valor: QAG00356671= linha:793 coluna:2Valor: QAG00356671= linha:793 coluna:3Valor: QAG00356671= linha:793 coluna:4Valor: QAG00356671= linha:793 coluna:5Valor: QAG00356671= linha:794 coluna:0Valor: 24/09/2014 08:16:021= linha:794 coluna:1Valor: 24/09/2014 08:16:021= linha:794 coluna:2Valor: 24/09/2014 08:16:021= linha:794 coluna:3Valor: 24/09/2014 08:16:021= linha:794 coluna:4Valor: 24/09/2014 08:16:021= linha:794 coluna:5Valor: 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
rdpacato 2 Denunciar post Postado Outubro 1, 2014 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
rdpacato 2 Denunciar post Postado Outubro 6, 2014 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