【问题标题】:import excel file to postgreSQL table using Apache POI使用 Apache POI 将 excel 文件导入到 postgreSQL 表
【发布时间】:2014-11-03 07:54:03
【问题描述】:

我有以下 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


    【解决方案1】:

    如果您在 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 中的默认值。详情请查看this thread

    我建议您特别熟悉 Apache Commons DBUtils 和一般的 Apache Commons 库。

    【讨论】:

    • 感谢这将完美地工作。但是如果我想在客户端显示 excel 值怎么做?
    • 我尝试了上面的代码,但它在 headers[i],values[i] 中显示以下错误“表达式的类型必须是数组类型,但它解析为 List”。
    • 我想通过使用映射概念将我的 excel 表显示到客户端。如何做到这一点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 2011-02-20
    相关资源
    最近更新 更多