2013-04-23 1 views
0

여기 내 문제가 있습니다. 필자는 Excel 파일의 데이터를 읽고 데이터베이스의 테이블에로드하는 프로그램을 만들어야합니다. 테이블은 Excel 파일의 이름을 가지며 테이블의 필드는 Excel 파일의 첫 번째 행에있는 데이터입니다. Excel 파일을 읽고 원하는 이름으로 테이블을 만드는 코드를 만들었습니다. 이제 테이블에 값을 삽입해야하지만 여기에 오류가 있습니다.자바를 사용하여 mysql db 테이블에 여러 값을 삽입 할 때 오류가 발생했습니다

아래 코드는 제가 작성한 전체 프로그램입니다.

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 
    at readexcel.fillTable(readexcel.java:183) 
    at readexcel.main(readexcel.java:68) 

이 사람이 내가 그것을 해결하는 데 도움 수 :

import java.io.FileInputStream; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Iterator; 
import java.util.List; 

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.commons.lang3.StringUtils; 
import org.apache.poi.ss.usermodel.Cell; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class readexcel { 


    public static void main (String[] args) throws Exception { 

     Class.forName("com.mysql.jdbc.Driver"); 
     Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/kainourgia","root", "root"); 
     Statement stmt = con.createStatement(); 
     //String filename = "C:\\Users\\myfiles\\Documents\\test6.xls"; 
     String fullPath = "C:\\Users\\myfiles\\Documents\\test7.xls"; 
     String Path = "C:\\Users\\myfiles\\Documents\\"; 
     String filename = "test7.xml"; 
     String[] parts = filename.split("\\."); 
     String tablename = parts[0]; 


     List sheetData = new ArrayList(); 
     FileInputStream fis = null; 
     try { 
      fis = new FileInputStream(fullPath); 
      HSSFWorkbook workbook = new HSSFWorkbook(fis); 
      HSSFSheet sheet = workbook.getSheetAt(0); 

      Iterator rows = sheet.rowIterator(); 
      while (rows.hasNext()) { 
       HSSFRow row = (HSSFRow) rows.next(); 
       Iterator cells = row.cellIterator(); 

       List data = new ArrayList(); 
        while (cells.hasNext()) { 
        HSSFCell cell = (HSSFCell) cells.next(); 
        data.add(cell); 
        } 
        sheetData.add(data); 
      } 

        } catch (IOException e) { 
        e.printStackTrace(); 
        } finally { 
        if (fis != null) { 
        fis.close(); 
        } 
        } 

    showExcelData(sheetData); 
    HashMap<String,Integer> tFields = new HashMap(); 
    tFields = parseExcelData(sheetData); 
    String str = getCreateTable(con, tablename, tFields); 
    str = fillTable (con, tablename, tFields); 
    } 

    private static void showExcelData(List sheetData) { 
//  HashMap<String, String> tableFields = new HashMap(); 
     for (int i=0; i<sheetData.size();i++){ 
      List list = (List) sheetData.get(i); 
      for (int j=0; j<list.size(); j++){ 
       Cell cell = (Cell) list.get(j); 
       if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) 
       { 
        System.out.print(cell.getNumericCellValue()); 
       } 
       else if(cell.getCellType()==Cell.CELL_TYPE_STRING) 
       { 
        System.out.print(cell.getRichStringCellValue()); 
       } 
       else if(cell.getCellType()==Cell.CELL_TYPE_BOOLEAN) { 
        System.out.print(cell.getBooleanCellValue()); 
       } 
       if (j < list.size() - 1) 
       { 
        System.out.print(", "); 
       } 
      } 
      System.out.println(""); 
     } 
    } 


    @SuppressWarnings({ "unchecked", "unused" }) 
    private static HashMap parseExcelData (List sheetData){ 

      HashMap<String,Integer> tableFields = new HashMap(); 
      List list = (List) sheetData.get(0); 
      for (int j=0; j<list.size(); j++){ 
       Cell cell=(Cell) list.get(j); 
       tableFields.put(cell.getStringCellValue(),cell.getCellType()); 
     } 

      return tableFields; 

     } 

    private static String getCreateTable(Connection con, String tablename, HashMap<String, Integer> tableFields){ 
     Iterator iter = tableFields.keySet().iterator(); 
     Iterator cells = tableFields.keySet().iterator(); 
     String str=""; 
     String[] allFields = new String[tableFields.size()]; 
     int i = 0; 
     while (iter.hasNext()){ 
      String fieldName = (String) iter.next(); 
      Integer fieldType=(Integer)tableFields.get(fieldName); 

      switch (fieldType){ 
       case Cell.CELL_TYPE_NUMERIC: 
        str=fieldName + " INTEGER"; 
        break; 
       case Cell.CELL_TYPE_STRING: 
        str= fieldName + " VARCHAR(255)"; 
        break; 
       case Cell.CELL_TYPE_BOOLEAN: 
        str=fieldName + " INTEGER"; 
        break; 
      } 
      allFields[i++]= str; 
     } 
     try 
     { 
      Statement stmt = con.createStatement(); 
//   try 
//   { 
//    System.out.println("Use the database..."); 
//    stmt.executeUpdate("USE kainourgia;"); 
//   } 
//   catch(SQLException e) 
//   { 
//    System.out.println("SQLException: " + e.getMessage()); 
//    System.out.println("SQLState:  " + e.getSQLState()); 
//    System.out.println("VendorError: " + e.getErrorCode()); 
//   } 
      try 
      { 
       String all = org.apache.commons.lang3.StringUtils.join(allFields, ","); 
       String createTableStr = "CREATE TABLE " + tablename + " (" + all + ")"; 

       System.out.println("Create a new table in the database"); 
       stmt.executeUpdate(createTableStr); 
      } 
      catch(SQLException e) 
      { 
       System.out.println("SQLException: " + e.getMessage()); 
       System.out.println("SQLState:  " + e.getSQLState()); 
       System.out.println("VendorError: " + e.getErrorCode()); 
      } 
     } 
     catch(Exception e) 
     { 
     } 
     return str; 
    } 

    private static String fillTable(Connection con, String fieldname, HashMap<String, Integer> tableFields){ 
     Iterator iter = tableFields.keySet().iterator(); 
     Iterator cells = tableFields.keySet().iterator(); 
     String str=""; 
     String[] tousFields = new String[tableFields.size()]; 
     int i = 1; 
     while (iter.hasNext()){ 
      String fieldName = (String) iter.next(); 
      Integer fieldType=(Integer)tableFields.get(fieldname); 
      while (cells.hasNext()){ 
       String fieldName1 = (String) cells.next(); 
       Integer fieldType1=(Integer)tableFields.get(fieldName1); 
       } 
       tousFields[i++]= str; 
     } 
     try 
     { 
      Statement stmt = con.createStatement(); 
      System.out.println ("Use the table"); 
      String all = org.apache.commons.lang3.StringUtils.join(tousFields, ","); 
      String sql= "INSERT INTO" + fieldname + "VALUES (" +all +")"; 
      stmt.executeUpdate (sql); 
     } 
     catch(SQLException e) 
     { 
      System.out.println("SQLException: " + e.getMessage()); 
      System.out.println("SQLState: " + e.getSQLState()); 
      System.out.println("VendorError: " + e.getErrorCode()); 
     } 

     return str; 
    } 
    private Statement createStatement() { 
     return null; 
    }   


} 

은 내가 오류이 무엇입니까? 각 셀에 값을 삽입하려면 어떻게해야합니까? 삽입 값의 명령이 맞습니까?

답변

0

tousFields의 기존 색인에 액세스하려고 시도했습니다.

당신은로 선언해야합니다

String[] tousFields = new String[tableFields.size() + 1]; 
+0

이 아니 내가 INT에서 시작 = 1 때문에 첫 번째 행에서 테이블을 것이다 필드가 아닌 값이다. – dedmar

+1

그래서 마지막 요소 앞에 멈추거나 String [] tousFields = new String [tableFields.size() + 1]을 선언해야합니다. – BobTheBuilder

+0

그래, 고마워! :)하지만 지금 내가 이것을 실행하면 : SQLException : 당신은 SQL 구문에 오류가 있습니다; 올바른 구문을 보려면 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, – dedmar

관련 문제