Importando para o Banco dados de um XLS

Pessoal,

Estou tentando inserir no banco dados lidos de uma planilha XLS, porém esse métdodo só está salvando a primeira linha:


package com.fozci.sicorc.service;

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.fozci.sicorc.persistence.util.HibernateUtil;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;


public class RazaoService {
	
		/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
		private Session session;
		private Transaction tx;   
		private  int i = 0;   
	    private  String cd_periodo_temp;   
	    private  String cd_ue_temp;   
	    private  String cd_ua_temp;   
	    private  String cd_reduzido_temp;   
	    private  String ds_historico_temp;   
	    private  String dt_lrazao_temp;   
	    private  String vl_debito_temp;   
	    private  String vl_credito_temp; 
	        
	
	public void validarArquivo(String name) throws Exception{
		    	  
			
			Workbook workbook = Workbook.getWorkbook(new File("c:/teste/"+name)); 
			Sheet sheet = workbook.getSheet(0);   
		       
		      //Pega a quantidade de linhas da planilha   
		      int linhas = sheet.getRows();   
		         
		         
		      for(i = 0; i < linhas; i++){   
		    	  
		      /* pega os valores das células como se numa matriz */   
		    	  
		      Cell cd_periodo = sheet.getCell(25,i);   
		      Cell cd_ue = sheet.getCell(17,i);   
		      Cell cd_ua = sheet.getCell(20,i);   
		      Cell cd_reduzido = sheet.getCell(11,i);   
		      Cell ds_historico = sheet.getCell(15,i);   
		      Cell dt_lrazao = sheet.getCell(14,i);   
		      Cell vl_debito = sheet.getCell(22,i);   
		      Cell vl_credito = sheet.getCell(23,i);   
		  
			  String cd_periodo_temp = cd_periodo.getContents();  
			  String cd_ue_temp = cd_ue.getContents();  
			  String cd_ua_temp = cd_ua.getContents();   
			  String cd_reduzido_temp = cd_reduzido.getContents();   
			  String ds_historico_temp = ds_historico.getContents();   
			  String dt_lrazao_temp = dt_lrazao.getContents();   
			  String vl_debito_temp = vl_debito.getContents();
			  String vl_credito_temp = vl_credito.getContents(); 
			  
				this.session = HibernateUtil.getSessionFactory().openSession();
				
				this.tx = this.session.beginTransaction();
				
				Query q = session.createSQLQuery("insert into razao_temp (cd_periodo_temp, cd_ue_temp, cd_ua_temp, cd_reduzido_temp, ds_historico_temp, dt_lrazao_temp, vl_debito_temp, vl_credito_temp)" +
						  "VALUES('"+cd_periodo_temp+"','"+cd_ue_temp+"','"+cd_ua_temp+"','"+cd_reduzido_temp+"','"+ds_historico_temp+"','"+dt_lrazao_temp+"','"+vl_debito_temp+"','"+vl_credito_temp+"')");
				
				q.executeUpdate();
		        session.getTransaction().commit();
		        session.close();

				}
		      workbook.close();  
			  }			
		}
	

Cara nesta linha:

int linhas = sheet.getRows(); 

Ele ta conseguindo pegar o numero total de linhas do arquivo ?

Eu fiz esta mesma coisa uma vez usando o rowIterator(), ficou mais ou menos assim:


HSSFSheet sheet = wb.getSheetAt(0);
            
try {
   for (Iterator rit = (Iterator) sheet.rowIterator(); rit.hasNext();) {
     row = (HSSFRow) rit.next();
     for (Iterator cit = (Iterator) row.cellIterator(); cit.hasNext();) {
     }
   }
} cath(...){}

Tenta aplicar desta forma no seu código.
Abs…

int linhas = sheet.getRows();  

Está pegando sim tanto se eu remover o PreparedStatement e mandar somente printar alguma celula, por exemplo

System.out.println("cd_periodo_temp")

É impresso todos os registros da coluna.

Eu teria que modificar alguma coisa para usar esse iterator?

Obs:Na verdade minha primeira inteção era fazer uma lista com esse valores e persistir no banco, porém acho que não tem como fazer.

Não mudaria muita coisa não, segue o exemplo completo:

           HSSFSheet sheet = wb.getSheetAt(0);
            
            try {

            	for (Iterator rit = (Iterator) sheet.rowIterator(); rit.hasNext();) {

                    row = (HSSFRow) rit.next();

                    for (Iterator cit = (Iterator) row.cellIterator(); cit.hasNext();) {

                        cell = (HSSFCell) cit.next();

                        CellReference cellRef = new CellReference(row.getRowNum(), cell.getCellNum());
                        
                        switch (cell.getCellType()) {
                               case HSSFCell.CELL_TYPE_STRING:
                                  System.out.println(cell.getRichStringCellValue().getString());
                                  break;
                                case HSSFCell.CELL_TYPE_NUMERIC:
        	                    System.out.println(cell.getNumericCellValue());
        	                    break;
        	                default: System.out.println();
                        }
                    }

                }
            } catch(NumberFormatException ex) {
            	ex.printStackTrace();
            } catch(Exception ex) {
            	ex.printStackTrace();
            }

Qualquer duvida posta ae!

Eu continuaria pegando o valor das celulas da mesma forma?

Você pegaria assim:

cell.getRichStringCellValue().getString()

Do geito que esta dentro dos “case” do switch.

Acho que estes exemplo esta mais claro:

switch(cell.getColumnIndex()) {
		            				//Obtém o código (Coluna 0)
		            				case 0:
		            					if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
		            						int codigo = (int) cell.getNumericCellValue();
		            						this.objDTO.setCodigoMatMed(codigo);
		            					}
		            				break;
		            				// Obtém a descrição (Coluna 1)
		            				case 1:
		            					if(cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
		            						if(isValid(cell.getStringCellValue())) {
		            							this.objDTO.setNomeMedicamento(cell.getStringCellValue());
		            						}
		            					}
		            				break;
		            				// Obtém a unidade de medida (Coluna 3)
		            				case 3:
		            					if(cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
		            						if(isValid(cell.getStringCellValue())) {
		            							this.objDTO.setUnidadeMedicamento(cell.getStringCellValue());
		            						}
		            					}
		            				break;
		            				// Obtém a classificação (Coluna 5)
		            				case 5:
		            					if(cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
		            						if(isValid(cell.getStringCellValue())) {
		            							this.objDTO.setClassificacao(cell.getStringCellValue());
		            						}
		            					}
		            				break;
		            				// Obtém o valor (Coluna 7)
		            				case 7:
		            					if(cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
		            						if(isValid(cell.getStringCellValue())) {
		            							break;
		            						}
		            					} else {
		            						this.objDTO.setPrecoMedicamento(cell.getNumericCellValue());
		            					}
		            				break;
		            				// Obtém a data de vigência (Coluna 8)
		            				case 8:
		            					if(cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
		            						if(isValid(cell.getStringCellValue())) {
		            							break;
		            						}
		            					} else {
		            						java.util.Date auxDate = cell.getDateCellValue();
		            						if(auxDate != null) {
		            							this.objDTO.setDataIniVigencia(new java.sql.Date(auxDate.getTime()));
		            						}
		            					}
		            				break;
		            			}

Qual a lib que tenho que importar (HSSFSheet )?

Isso!

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.util.CellReference;

Você tem esse exemplo completo?

Acho que voumudar quase tudo…

BLZ!!!

Fiz da forma que você me indicou e funcionou:

Só estou com uma dúvida: Quando ele encontra uma celula sem valor ele repete o último valor encontrrado para o resto da coluna até acha uma outra celula com valor.
Você já passou por isso?

package com.fozci.sicorc.service;

import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Iterator;
import org.apache.poi.hssf.usermodel.HSSFCell;   
import org.apache.poi.hssf.usermodel.HSSFRow;   
import org.apache.poi.hssf.usermodel.HSSFSheet;   
import org.apache.poi.hssf.usermodel.HSSFWorkbook;   
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.util.CellReference; 
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.fozci.sicorc.persistence.util.HibernateUtil;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;


public class RazaoService {
	
		/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
		private Session session;
		private Transaction tx;   
		private  int i = 0;   
	    private  int cd_periodo_temp;   
	    private  int cd_ue_temp;   
	    private  int cd_ua_temp;   
	    private  int cd_reduzido_temp;   
	    private  String ds_historico_temp;   
	    private  String dt_lrazao_temp;   
	    private  double vl_debito_temp;   
	    private  double vl_credito_temp; 
	        
	
	public void validarArquivo(String name) throws Exception{
		    	  		
		POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("c:/teste/"+name));

		HSSFWorkbook wb    = new HSSFWorkbook(fs);
	
		HSSFSheet sheet = wb.getSheetAt(0);   
			    	  
		    	  try {   
		    	    
		    	      for (Iterator rit = (Iterator) sheet.rowIterator(); rit.hasNext();) {   
		    	    
		    	    	  HSSFRow row = (HSSFRow) rit.next();   
		    	    
		    	           for (Iterator cit = (Iterator) row.cellIterator(); cit.hasNext();) {   
		    	    
		    	        	   HSSFCell cell = (HSSFCell) cit.next();   
		    	    	    	                 
		    	               switch(cell.getColumnIndex()) {   

                               case 25:   
                                   if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {   
                                       cd_periodo_temp =  (int)cell.getNumericCellValue();     
                                   }   
                               break;   
 
                               case 17:   
                                   if(cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {   
                                	   cd_ue_temp = 5718;             
                                   }   
                               break; 
       
                               case 20:   
                                   if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {   
                                	   cd_ua_temp =  (int)cell.getNumericCellValue();                   
                                   }   
                               break;    
     
                               case 11:   
                                   if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {   
                                	   cd_reduzido_temp =  (int)cell.getNumericCellValue();                   
                                   }   
                               break;   
 
                               case 15:   
                                   if(cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {   
                                	   ds_historico_temp =  cell.getStringCellValue();                  
                                   }   
                               break;  

                               case 14:   
                                   if(cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {   
                                	   dt_lrazao_temp =  cell.getStringCellValue();                  
                                   }   
                               break; 
                               
                               case 22:   
                                   if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {   
                                	   vl_debito_temp =  cell.getNumericCellValue();               
                                   }   
                               break; 
                               
                               case 23:   
                                   if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {   
                                	   vl_credito_temp =  cell.getNumericCellValue();                   
                                   }   
                               break; 
                           }
		    	          }
		    	           
		    	           Class.forName("net.sourceforge.jtds.jdbc.Driver");  
		    	           Connection conn = DriverManager.getConnection("jdbc:jtds:sqlserver://XXX/XXX",   
                                   "XX",   
                                   "XXXXXXXX");   
          
		    	           PreparedStatement ps = conn.prepareStatement("insert into razao_temp (cd_periodo_temp, cd_ue_temp, cd_ua_temp, cd_reduzido_temp, ds_historico_temp, dt_lrazao_temp, vl_debito_temp, vl_credito_temp)" +   
		                             "VALUES("+cd_periodo_temp+","+cd_ue_temp+","+cd_ua_temp+","+cd_reduzido_temp+",'"+ds_historico_temp+"','"+dt_lrazao_temp+"',"+vl_debito_temp+","+vl_credito_temp+")");   
		                      
		                   ps.executeUpdate();
		                   ps.close();   
 
		    	      }
		    	      
		    	  }catch (Exception e) {
					e.printStackTrace();
				}
	}
}
		    	  


	


Wender,

Outro problema que está ocrrendo é que ele está salvando a última linha duas vezes!

Segue a tabela inserida com o erro: Quando ele encontra uma celula sem valor repete o último valor encontrado para o resto da coluna até achar uma outra celula com algum valor diferente de " ".

Segue o erro:

vl_debito		                                                       vl_credito	
8,71		                                                       0	
8,71 Essa celula tem que estar vazia ou = 0	                    89,77	
9,16		                                                       89,77	Essa celula tem que estar vazia ou = 0
12,02		                                                       89,77	Essa celula tem que estar vazia ou = 0
14,6		                                                       89,77	Essa celula tem que estar vazia ou = 0
15		                                                        89,77	Essa celula tem que estar vazia ou = 0
16,25		                                                       89,77	Essa celula tem que estar vazia ou = 0
16,46		                                                       89,77	Essa celula tem que estar vazia ou = 0
80,31		                                                       26,03	
89,77		                                                       26,03	Essa celula tem que estar vazia ou = 0
89,77 Essa celula tem que estar vazia ou = 0	                   7,18	
102,37		                                                       7,18	Essa celula tem que estar vazia ou = 0
209,22		                                                       7,18	Essa celula tem que estar vazia ou = 0
219,4		                                                       7,18	Essa celula tem que estar vazia ou = 0
248,52		                                                       7,18	Essa celula tem que estar vazia ou = 0