AMB Posted February 5, 2014 at 03:09 PM Report #544071 Posted February 5, 2014 at 03:09 PM (edited) Boa Tarde É o seguinte, estou a tentar introduzir dados de um ficheiro xls para uma base dados sql server Mas surge sempre o erro: Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 8428, Size: 8428 at java.util.ArrayList.rangeCheck(Unknown Source) at java.util.ArrayList.get(Unknown Source) Sei que para a coluna em concreto embora tenha 10.000 linhas só 8428 estão preenchidas. Mas não sei como "fugir" a este problema já tentei com if(list11 == null), isEmpty, mas o erro ocorre sempre... na list11....fica o código: package a; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.GregorianCalendar; import java.io.*;import jxl.*; import jxl.read.biff.BiffException; public class l2 { public static void lerficheiroh() throws SQLException, ClassNotFoundException, ParseException, InstantiationException, IllegalAccessException, BiffException, IOException{ ArrayList<String> list1=new ArrayList<String>(); ArrayList<String> list2=new ArrayList<String>(); ArrayList<String> list3=new ArrayList<String>(); ArrayList<String> list4=new ArrayList<String>(); ArrayList<String> list5=new ArrayList<String>(); ArrayList<String> list6=new ArrayList<String>(); ArrayList<String> list7=new ArrayList<String>(); ArrayList<String> list8=new ArrayList<String>(); ArrayList<String> list9=new ArrayList<String>(); ArrayList<String> list10=new ArrayList<String>(); ArrayList<String> list11=new ArrayList<String>(); ArrayList<String> list12=new ArrayList<String>(); ArrayList<String> list13=new ArrayList<String>(); ArrayList<String> list14=new ArrayList<String>(); ArrayList<String> list15=new ArrayList<String>(); ArrayList<String> list16=new ArrayList<String>(); ArrayList<String> list17=new ArrayList<String>(); ArrayList<String> list18=new ArrayList<String>(); ArrayList<String> list19=new ArrayList<String>(); ArrayList<String> list20=new ArrayList<String>(); ArrayList<String> list21=new ArrayList<String>(); ArrayList<String> list22=new ArrayList<String>(); ArrayList<String> list23=new ArrayList<String>(); // ArrayList<String> list24=new ArrayList<String>(); Cell rowData[] = null; int rowCount = 0; int columnCount = 0; WorkbookSettings ws = new WorkbookSettings(); Workbook workbook = Workbook.getWorkbook(new File("C:\\1\\M3.xls"), ws); Sheet s = workbook.getSheet(0); rowCount = s.getRows(); System.out.println(rowCount); columnCount = s.getColumns(); System.out.println(columnCount); for(int i = 1; i < rowCount; i++){ rowData = s.getRow(i); // if(rowData[0].getContents().length() != 0){ for(int j = 0; j < columnCount ;j++){ switch(j){ case 0: System.out.println("A: "+rowData[j].getContents()); list1.add(rowData[j].getContents()); break; case 1: System.out.println("B: "+rowData[j].getContents()); list2.add(rowData[j].getContents()); break; case 2: System.out.println("C: "+rowData[j].getContents()); list3.add(rowData[j].getContents()); break; case 3: System.out.println("D: "+rowData[j].getContents()); list4.add(rowData[j].getContents()); break; case 4: System.out.println("E: "+rowData[j].getContents()); list5.add(rowData[j].getContents()); break; case 5: System.out.println("F: "+rowData[j].getContents()); list6.add(rowData[j].getContents()); break; case 6: System.out.println("G: "+rowData[j].getContents()); list7.add(rowData[j].getContents()); break; case 7: System.out.println("H: "+rowData[j].getContents()); list8.add(rowData[j].getContents()); break; case 8: System.out.println("I: "+rowData[j].getContents()); list9.add(rowData[j].getContents()); break; case 9: System.out.println("DataN: "+rowData[j].getContents()); String pattern = "dd-MM-yyyy HH:mm:ss"; if(rowData[j] instanceof DateCell) { DateCell dc = (DateCell) rowData[j]; Date d = dc.getDate(); SimpleDateFormat sdf = new SimpleDateFormat(); sdf.applyPattern(pattern); sdf.format(d); System.out.println("date cell222"+ sdf.format(d)); list10.add(sdf.format(d)); } break; case 10: System.out.println("DataR: "+rowData[j].getContents()); String pattern1 = "dd-MM-yyyy HH:mm:ss"; if(rowData[j] instanceof DateCell) { DateCell dc = (DateCell) rowData[j]; Date d = dc.getDate(); SimpleDateFormat sdf = new SimpleDateFormat(); sdf.applyPattern(pattern1); sdf.format(d); System.out.println("date cell222"+ sdf.format(d)); list11.add(sdf.format(d)); } break; }} } workbook.close(); Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance(); Connection conn = DriverManager.getConnection("jdbc:sqlserver://192.9.204.20:1433;databaseName=M;user=sa;password=password1234"); Statement st=conn.createStatement(); String fimd1 = null; String fimd2 = null; String fimd3 = null; String fimd4 = null; String fimd5 = null; String fimd6 = null; for(int i=0;i<list1.size();i++){ /*lista4*/ String ut=list4.get(i).toString(); if (ut.contains("'")){ ut = ut.replace("'", ""); }else{ System.out.println(ut); } /*lista8*/ String acc=list8.get(i).toString(); if (list11 == null){ System.out.println("0"); }else{ /*lista11*/ String datar=list11.get(i).toString(); System.out.println("11:"+datar); if (!(datar.equals(""))){ fimd2 = datar; System.out.println(datar); }else{ fimd2=""; System.out.println("data resultados nulo"); } } String sqlre = "UPDATE A SET DataR='"+fimd2+"' where Acordo ='"+acc+"' and utilizador='"+ut+"'"; st.executeUpdate(sqlre); } } public static void main(String[] args) throws ClassNotFoundException, SQLException, ParseException, InstantiationException, IllegalAccessException, BiffException, IOException { System.out.println("h"); lerficheiroh();}} Edited February 5, 2014 at 03:45 PM by Baderous geshi
HappyHippyHippo Posted February 5, 2014 at 04:31 PM Report #544081 Posted February 5, 2014 at 04:31 PM este código é ilegível outra coisa que deverias apresentar é o local concreto da excepção IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
AMB Posted February 5, 2014 at 04:47 PM Author Report #544084 Posted February 5, 2014 at 04:47 PM eliminei do código tudo o que não era necessario para a questão em causa: public static void lerficheiroh() throws SQLException, ClassNotFoundException, ParseException, InstantiationException, IllegalAccessException, BiffException, IOException{ ArrayList<String> list1=new ArrayList<String>(); ArrayList<String> list4=new ArrayList<String>(); ArrayList<String> list8=new ArrayList<String>(); ArrayList<String> list11=new ArrayList<String>(); Cell rowData[] = null; int rowCount = 0; int columnCount = 0; WorkbookSettings ws = new WorkbookSettings(); Workbook workbook = Workbook.getWorkbook(new File("C:\\1\\M3.xls"), ws); Sheet s = workbook.getSheet(0); rowCount = s.getRows(); System.out.println(rowCount); columnCount = s.getColumns(); System.out.println(columnCount); for(int i = 1; i < rowCount; i++){ rowData = s.getRow(i); for(int j = 0; j < columnCount ;j++){ switch(j){ case 0: System.out.println("A: "+rowData[j].getContents()); list1.add(rowData[j].getContents()); break; case 3: System.out.println("D: "+rowData[j].getContents()); list4.add(rowData[j].getContents()); break; case 7: System.out.println("H: "+rowData[j].getContents()); list8.add(rowData[j].getContents()); break; case 10: System.out.println("DataR: "+rowData[j].getContents()); String pattern1 = "dd-MM-yyyy HH:mm:ss"; if(rowData[j] instanceof DateCell) { DateCell dc = (DateCell) rowData[j]; Date d = dc.getDate(); SimpleDateFormat sdf = new SimpleDateFormat(); sdf.applyPattern(pattern1); sdf.format(d); System.out.println("date cell222"+ sdf.format(d)); list11.add(sdf.format(d)); } break; }} } workbook.close(); Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance(); Connection conn = DriverManager.getConnection("jdbc:sqlserver://192.9.204.20:1433;databaseName=M;user=sa;password=password1234"); Statement st=conn.createStatement(); String fimd2 = null; for(int i=0;i<list1.size();i++){ /*lista4*/ String ut=list4.get(i).toString(); /*lista8*/ String acc=list8.get(i).toString(); /*lista11*/ String datar=list11.get(i).toString(); System.out.println("11:"+datar); String sqlre = "UPDATE A SET DataR='"+fimd2+"' where Acordo ='"+acc+"' and utilizador='"+ut+"'"; st.executeUpdate(sqlre); } } public static void main(String[] args) throws ClassNotFoundException, SQLException, ParseException, InstantiationException, IllegalAccessException, BiffException, IOException { System.out.println("h"); lerficheiroh(); }} a linha de erro é a seguinte: String datar=list11.get(i).toString();
HappyHippyHippo Posted February 5, 2014 at 04:53 PM Report #544088 Posted February 5, 2014 at 04:53 PM o que garante que todas as listas possuem o mesmo tamanho ? for(int i=0;i<list1.size();i++){ String ut = list4.size() >= i ? list4.get(i).toString() : ""; String acc = list8.size() >= i ? list8.get(i).toString() : ""; String datar = list11.size() >= i ? list11.get(i).toString() : "";[/Code] IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
AMB Posted February 6, 2014 at 08:10 AM Author Report #544143 Posted February 6, 2014 at 08:10 AM O ficheiro excel tem o mesmo numero de linhas em todas as colunas por isso todas as listas tem o mesmo tamanho a diferença é que há colunas que tem todas as linhas preenchidas e outras não, que é o casa da datar. Esta coluna tem quase linha sim linha não preenchida, mas quando eu faço inserir a lista11 na base dados ele junta a informação nas primeiras 8428linhas e não preenche mais nada, nem liga se o acc é aquele ou não...
HappyHippyHippo Posted February 6, 2014 at 09:55 AM Report #544150 Posted February 6, 2014 at 09:55 AM (edited) O ficheiro excel tem o mesmo numero de linhas em todas as colunas por isso todas as listas tem o mesmo tamanho errado, lá porque tens no excel a apresentar as células, não quer dizer que no ficheiro tens informação dessas linhas. por outras palavras : não existe a coluna X na linha Y se nessa linha não existir dados nessa coluna e seguintes edit : correção Edited February 6, 2014 at 10:34 AM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
AMB Posted February 6, 2014 at 10:23 AM Author Report #544159 Posted February 6, 2014 at 10:23 AM Já consegui resolver apenas retirei do código a seguinte parte if(rowData[j] instanceof DateCell) { DateCell dc = (DateCell) rowData[j]; Date d = dc.getDate(); SimpleDateFormat sdf = new SimpleDateFormat(); sdf.applyPattern(pattern1); sdf.format(d); System.out.println("date cell222"+ sdf.format(d)); list11.add(sdf.format(d)); } break; passei o campo sql a nvarchar em vez de datetime... como é só para visualização não tem muita importancia e assim ele preenche os nulos. Desde já agreço pela atenção HappyHippyHippo
AMB Posted February 6, 2014 at 02:05 PM Author Report #544201 Posted February 6, 2014 at 02:05 PM Afinal resolvi um problema arranjei outro 😕 É que ao tirar o bocado de codigo que referi, a data sai : "10/05/2013" "08:48: " em vez de 10/05/2013 20:48, com o codigo que tirei resolvo este problema mas surge o problema inicial 😞
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now