从excel导入到mysql

时间:2018-06-06 11:40:23

标签: python mysql excel

我正在尝试将数据从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()

5 个答案:

答案 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)

您的代码目前只存储最后一对,并将其写入数据库。您需要在循环内调用fnamelname,并将每对分别写入数据库。

您可以将此代码修改为:

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;

我在这里做了一些假设:

  1. 电子表格只有两列,它们与表格中的字段的顺序相同。
  2. 您无需在加载前清除表格。如果这样做,发出命令TRUNCATE TABLE report_table;在装载之前。
  3. 注意,我选择了制表符分隔格式,因为我更喜欢它。您可以将文件另存为.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()