rfogo
Agosto 5, 2011, 3:04pm
#1
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…
rfogo
Agosto 5, 2011, 3:50pm
#3
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!
rfogo
Agosto 5, 2011, 4:02pm
#5
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;
}
rfogo
Agosto 5, 2011, 4:09pm
#7
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;
rfogo
Agosto 5, 2011, 4:20pm
#9
Você tem esse exemplo completo?
Acho que voumudar quase tudo…
rfogo
Agosto 5, 2011, 5:37pm
#10
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();
}
}
}
rfogo
Agosto 8, 2011, 8:04am
#11
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