我正在尝试将数据从excel导入到MySQl下面是我的代码,这里的问题是它只将我的Excel工作表中的最后一行写入MySQl数据库,我希望它从我的Excel工作表中导入所有行。 / p>
import pymysql
import xlrd
book = xlrd.open_workbook('C:\SqlExcel\Backup.xlsx')
sheet = book.sheet_by_index(0)
# Connect to the database
connection = pymysql.connect(host='localhost',
user='root',
password='',
db='test')
cursor = connection.cursor()
query = """INSERT INTO report_table (FirstName, LastName) VALUES (%s, %s)"""
for r in range(1, sheet.nrows):
fname = sheet.cell(r,1).value
lname = sheet.cell(r,2).value
values = (fname, lname)
cursor.execute(query, values)
connection.commit()
cursor.close()
connection.close()
答案 0 :(得分:0)
您的变量值必须在for指令中,如下所示:
import pymysql
import xlrd
book = xlrd.open_workbook('C:\SqlExcel\Backup.xlsx')
sheet = book.sheet_by_index(0)
# Connect to the database
connection = pymysql.connect(host='localhost',
user='root',
password='',
db='test')
cursor = connection.cursor()
query = """INSERT INTO report_table (FirstName, LastName) VALUES (%s, %s)"""
for r in range(1, sheet.nrows):
fname = sheet.cell(r,1).value
lname = sheet.cell(r,2).value
values = (fname, lname)
cursor.execute(query, values)
connection.commit()
cursor.close()
connection.close()
答案 1 :(得分:0)
抱歉,我对数据库知之甚少,所以也不了解pymysql。但假设所有其余的都是正确的我猜测它可以像:
FooKernel
答案 2 :(得分:0)
您的代码目前只存储最后一对,并将其写入数据库。您需要在循环内调用fname
和lname
,并将每对分别写入数据库。
您可以将此代码修改为:
import pymysql
import xlrd
book = xlrd.open_workbook('C:\SqlExcel\Backup.xlsx')
sheet = book.sheet_by_index(0)
# Connect to the database
connection = pymysql.connect(host='localhost',
user='root',
password='',
db='test',
autocommit=True)
cursor = connection.cursor()
query = """INSERT INTO report_table (FirstName, LastName) VALUES (%s, %s)"""
# loop over each row
for r in range(1, sheet.nrows):
# extract each cell
fname = sheet.cell(r,1).value
lname = sheet.cell(r,2).value
# extract cells into pair
values = fname, lname
# write pair to db
cursor.execute(query, values)
# close everything
cursor.close()
connection.close()
注意:您可以在连接阶段设置autocommit=True
。 PyMySQL默认禁用自动提交。这意味着您无需在查询后致电cursor.commit()
。
答案 3 :(得分:0)
这是你定期做的吗?我看到你正在编写的脚本,但我不确定这是否是你需要反复运行的东西,或者你只是将数据导入MySQL一次。
如果这是一次性拍卖,你可以尝试一下。
打开电子表格并选择SELECT ALL然后复制所有数据。将其粘贴到文本文档中并保存文本文档(假设文本文档位于c:\ temp \ exceldata.txt中)。然后,您可以使用一个命令将其全部加载到表中:
LOAD DATA INFILE 'c:/temp/exceldata.txt'
INTO TABLE report_table
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
我在这里做了一些假设:
注意,我选择了制表符分隔格式,因为我更喜欢它。您可以将文件另存为.CSV文件,并按如下方式调整命令:
LOAD DATA INFILE 'c:/temp/exceldata.txt'
INTO TABLE report_table
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
"可选择包含在"是因为Excel会在文本数据中加上引号括起来。
如果您需要定期执行此操作,您仍然可以通过编写excel脚本来使用CSV方法,该脚本会在保存电子表格时将文件保存为.CSV副本。我也是这样做的。
我从未编写过python,但这就是我在PHP中的用法。
HTH
答案 4 :(得分:0)
这段代码在我从上述建议中获得帮助之后起作用,现在它的工作是错误的缩进:)
import pymysql
import xlrd
book = xlrd.open_workbook('C:\SqlExcel\Backup.xlsx')
sheet = book.sheet_by_index(0)
# Connect to the database
connection = pymysql.connect(host='localhost',
user='root',
password='',
db='test',
autocommit=True)
cursor = connection.cursor()
query = """INSERT INTO report_table (FirstName, LastName) VALUES (%s, %s)"""
for r in range(1, sheet.nrows):
fname = sheet.cell(r,1).value
lname = sheet.cell(r,2).value
values = (fname, lname)
cursor.execute(query, values)
cursor.close()
connection.close()