2017-10-20 257 views
0

同行,使用Python将数据从Excel导入Oracle表格

新手在这里。有没有一种方法可以从excel文件读取数据并加载到Oracle表中?一些示例python脚本会有很大的帮助。我做了几行代码来熟悉,如下所示。

P.S.编辑:我的意思是这只是我的部分代码。我不确定如何在Oracle部分中将'insert statement'或'create table'语句作为此代码的一部分。我想加载数据,因为它从excel中读取每个列的循环。 TIA!

import openpyxl 
import cx_Oracle 

#Oracle connection starts here 
connection = cx_Oracle.connect("<schema>", "<pwd>", "<hostname>/<sid/service>") 
print("Database version:", connection.version) 
print(cx_Oracle.version) 
print(connection.current_schema) 

# creating a table 
create_table = """ 
CREATE TABLE test (
col1 VARCHAR2(50) NOT NULL, 
col2 VARCHAR2(50) NOT NULL, 
col3 VARCHAR2(50) NOT NULL, 
col4 VARCHAR2(50) NOT NULL, 
col5 VARCHAR2(50) NOT NULL, 
col6 VARCHAR2(50) NOT NULL, 
col7 VARCHAR2(50) NOT NULL 
) 
""" 
from sys import modules 
cursor.execute(create_table)  

from openpyxl import Workbook 
wb = openpyxl.load_workbook('<name of the file>',data_only=True) 
ws = wb['Sheet1'] 

x=1 
m=1 

# looping through each column 
for j in range(2,ws.max_column+1): 

    ID = m 
    col1 = ws.cell(row=x,column=j).value 
    m = m+1 

    col2 = ws.cell(row=1, column=j).value 

    col3 = ws.cell(row=2, column=j).value 

    col4 = ws.cell(row=3,column=j).value 

    col5 = ws.cell(row=4, column=j).value 

    col6 = ws.cell(row=5, column=j).value 

    col7 = ws.cell(row=6, column=j).value 

    #looping through each row for each column  
    for i in range(1,ws.max_row+1): 
     Cellval= ws.cell(row=i, column=j).value 

# Inserting all the above variables for each column loop 
insert_table=""" 
INSERT INTO test (col1,col2,col3,col4,col5,col6,col7) 
VALUES ("""+col1+""", 
"""+col2+""", 
"""+col3+""", 
"""+col4+""", 
"""+col5+""", 
"""+col6+""", 
"""+col7+""")""" 

cursor.execute(insert_table) 

x=x+1 

connection.close() 

我是对的吗?

+2

有用吗?如果没有,出了什么问题? –

+0

我的意思是这只是我的部分代码。我不确定如何在Oracle部分中将'insert statement'或'create table'语句作为此代码的一部分。我想加载数据,因为它从excel中读取每个列的循环。 TIA! – Adi

+0

创建您的表格并将表格的结构添加到上面的表格中。然后,您可以在for循环中执行插入语句,并使用execute来执行预制,或将其放入数组并使用execute_many。请参阅cx_oracle文档以获取相关帮助。 –

回答

0

考虑以下变化:

  • 运行下来的行和反复指定列的值,然后追加每行反转的嵌套循环for
  • 按行逐行缩进您的execute行。
  • CREATE TABLEINSERT INTO之类的任何操作查询使用.commit()来传播更改。
  • 使用.execute(query, params)中的第二个参数来参数化您的查询,这不仅可以隔离SQL注入(如果Excel单元由聪明的用户存在恶意代码),而是避免字符串连接和引用附件以获得更简洁的代码。见Oracle+Python docs

调整代码

# looping through each row for each column  
for i in range(1, ws.max_row+1): 
    for j in range(2, ws.max_column+1):  
     col1 = ws.cell(row=i, column=j).value 
     col2 = ws.cell(row=i, column=j).value 
     col3 = ws.cell(row=i, column=j).value 
     col4 = ws.cell(row=i, column=j).value 
     col5 = ws.cell(row=i, column=j).value 
     col6 = ws.cell(row=i, column=j).value 
     col7 = ws.cell(row=i, column=j).value 

    insert_table = "INSERT INTO test (col1, col2, col3, col4, col5, col6, col7)" + \ 
        " VALUES (:1, :2, :3, :4, :5, :6, :7)" 

    cursor.execute(insert_table, (col1, col2, col3, col4, col5, col6, col7)) 
    connection.commit() 

connection.close() 
+0

太棒了,当然会保持这种想法。欣赏它。 – Adi