2017-10-20 105 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

相關問題