使用 Apache POI 将 excel 文件导入 postgreSQL 表

问题描述 投票:0回答:2

我有以下 Excel。

name    qualification   address
aaa     BE              Chennai
bbb     BCA             Cbe

我的数据库表

columnName
包含与上面相同的内容。 (即姓名、资格、地址)。

我可以使用以下代码将值导入 PostgreSQL 数据库表,就像它们在 Excel 中一样:

XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(inputFile));

// Get first sheet from the workbook
XSSFSheet sheet = wb.getSheetAt(0);

Row row;
Cell cell;

// Iterate through each rows from first sheet
Iterator<Row> rowIterator = sheet.iterator();

while (rowIterator.hasNext()) 
{
    row = rowIterator.next();

    // System.out.println ("Row No.: " + row.getRowNum ());
    // For each row, iterate through each columns
    Iterator<Cell> cellIterator = row.cellIterator();

    while (cellIterator.hasNext()) 
    {
        cell = cellIterator.next();
        System.out.println(cell +"\t");

        switch (cell.getCellType()) 
        {
            case Cell.CELL_TYPE_BOOLEAN:
                 System.out.println(cell.getBooleanCellValue()  + "\t");
                 break;

            case Cell.CELL_TYPE_NUMERIC:
                 System.out.println(cell.getNumericCellValue()  + "\t");
                 break;

            case Cell.CELL_TYPE_STRING:
                 //System.out.println(cell.getStringCellValue()  + "\t");
                 list.add(cell.getStringCellValue());
                 break;

            case Cell.CELL_TYPE_BLANK:
                 System.out.println(" ");
                 break;

            default:
                 System.out.println(cell);
       }
 }

 String name = row.getCell(0).getStringCellValue();
 String add = row.getCell(1).getStringCellValue();
 String quali = row.getCell(2).getStringCellValue();

 System.out.println(name+add+quali);
 InsertRowInDB(name,add,quali);
 System.out.println("");


    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "success";

  }
    public void InsertRowInDB(String name,String add,String quali) throws SQLException, ClassNotFoundException{

        Class.forName("org.postgresql.Driver");
        System.out.println("connected");
        Connection conn=DriverManager.getConnection("jdbc:postgresql:postgres", "postgres","sridevi");
        if(!name.equals("name") && !add.equals("qualification") && !quali.equals("address")){
        String query = "Insert into excel(name,qualification,address) values(?,?,?)";
        PreparedStatement ps = conn.prepareStatement(query);



        ps.setString(1, name);
        ps.setString(2, add);
        ps.setString(3, quali);

    ps.executeUpdate();}
    System.out.println("Values Inserted Successfully");
    }

如果我的数据库包含像(姓名,地址,资格)这样的列名称,

如何将上述Excel文件导入到数据库表中?

如何将电子表格列标题映射到数据库列标题?


请帮我找到这个。

java excel postgresql
2个回答
0
投票

如果您在

INSERT
语句中显式引用列,则 PostgreSQL 数据库中定义的列顺序并不重要。

所以,这个:

 String query = "Insert into excel(name,qualification,address) values(?,?,?)";
 PreparedStatement ps=conn.prepareStatement(query);

 ps.setString(1, name);
 ps.setString(2, quali);
 ps.setString(3, add);

与此相同:

 String query = "Insert into excel(address, name, qualification) values(?,?,?)";
 PreparedStatement ps=conn.prepareStatement(query);

 ps.setString(1, add);
 ps.setString(2, name);
 ps.setString(3, qualifi);

至于映射 Excel 工作表的标题字段以用作 SQL

INSERT
语句的字段名称,您可以循环遍历工作表' s 行,并使用第一行作为列名称,然后仅插入以下行。

public String loadSheetInDatabase(String inputFile) {
    try {
        XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(inputFile));

        // Get first sheet from the workbook
        XSSFSheet sheet = wb.getSheetAt(0);

        Row row;
        Cell cell;

        // Iterate through each rows from first sheet
        Iterator < Row > rowIterator = sheet.iterator();

        Boolean parsedHeaders = false;
        List < String > headers = new ArrayList < String > ();
        List < String > rowValues = null;
        while (rowIterator.hasNext()) {
            row = rowIterator.next();
            if (parsedHeaders) {
                rowValues = new ArrayList <String> ();
            }
            // System.out.println ("Row No.: " + row.getRowNum ());
            // For each row, iterate through each columns
            Iterator < Cell > cellIterator = row.cellIterator();

            while (cellIterator.hasNext()) {
                cell = cellIterator.next();
                if (!parsedHeaders) {
                    headers.add(cell.getStringCellValue());
                } else {
                  rowValues.add(cell.getStringCellValue());
                }
            }
            if(!parsedHeaders){
              parsedHeaders = true;
            }else{
              String rowValuesString = "";
              for(String fieldValue : rowValues){
                rowValuesString += fieldValue + " ";
              }
              System.out.println(rowValuesString);
              InsertRowInDB(headers, rowValues);
              System.out.println("");
            }
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "success";
}

public void InsertRowInDB(List<String> headers, List<String> values) throws SQLException, ClassNotFoundException {

    Class.forName("org.postgresql.Driver");
    System.out.println("connected");
    Connection conn = DriverManager.getConnection("jdbc:postgresql:postgres", "postgres", "sridevi");

    String insertColumns = "";
    String preparedStatementClause = "";
    for(int i = 0; i < headers.size(); i++){
      String fieldValue = headers[i];
      insertColumns += fieldValue;
      preparedStatementClause += "?";
      if(i <= (headers.size() - 1)){
        insertColumns += ", ";
        preparedStatementClause += ", ";
      }
    }


    String query = String.format( "Insert into excel(%s) values(%s)" , insertColumns, preparedStatementClause);
    PreparedStatement ps = conn.prepareStatement(query);
    for(int i = 0; i < values.size(); i++){
      ps.setString(i, values[i]);
    }
    ps.executeUpdate();
    System.out.println("Values Inserted Successfully");
}

但是,为了清楚起见,您可以考虑使用命名参数。 它们无法通过 JDBC 中的默认值。检查此线程了解一些详细信息。

我建议具体熟悉 Apache Commons DBUtils 并总体熟悉 Apache Commons 库。


0
投票

public String loadSheetInDatabase(String inputFile) 抛出 ClassNotFoundException, SQLException { 尝试 { XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(inputFile));

        // Get first sheet from the workbook
        XSSFSheet sheet = wb.getSheetAt(0);

        Row row;
        Cell cell;

        // Iterate through each rows from first sheet
        Iterator < Row > rowIterator = sheet.iterator();

        Boolean parsedHeaders = false;
        List < String > headers = new ArrayList < String > ();
        List < String > rowValues = null;
        while (rowIterator.hasNext()) {
            row = rowIterator.next();
            if (parsedHeaders) {
                rowValues = new ArrayList <String> ();
            }
            // System.out.println ("Row No.: " + row.getRowNum ());
            // For each row, iterate through each columns
            Iterator < Cell > cellIterator = row.cellIterator();

            while (cellIterator.hasNext()) {
                cell = cellIterator.next();
                if (!parsedHeaders) {
                    headers.add(cell.getStringCellValue());
                } else {
                  rowValues.add(cell.getStringCellValue());
                }
            }
            if(!parsedHeaders){
              parsedHeaders = true;
            }else{
              String rowValuesString = "";
              for(String fieldValue : rowValues){
                rowValuesString += fieldValue + " ";
              }
              System.out.println(rowValuesString);
              InsertRowInDB(headers, rowValues);
              System.out.println("");
            }
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "success";
}

public void InsertRowInDB(List<String> headers, List<String> values) throws SQLException, ClassNotFoundException {

    Class.forName("org.postgresql.Driver");
    System.out.println("connected");
    Connection conn = DriverManager.getConnection("jdbc:postgresql:postgres", "postgres", "sridevi");

    String insertColumns = "";
    String preparedStatementClause = "";
    for(int i = 0; i < headers.size(); i++){
      String fieldValue = headers.get(i);
      insertColumns += fieldValue;
      preparedStatementClause += "?";
      if(i <= (headers.size() - 1)){
        insertColumns += ", ";
        preparedStatementClause += ", ";
      }
    }


    String query = String.format( "Insert into excel(%s) values(%s)" , insertColumns, preparedStatementClause);
    PreparedStatement ps = conn.prepareStatement(query);
    for(int i = 0; i < values.size(); i++){
      ps.setString(i, values.get(i));
    }
    ps.executeUpdate();
    System.out.println("Values Inserted Successfully");
}
© www.soinside.com 2019 - 2024. All rights reserved.