如何使用Python的XlsxWriter将数据从SQLite导入Excel?

3
import sqlite3
from xlsxwriter.workbook import Workbook
workbook = Workbook('output2.xlsx')
worksheet = workbook.add_worksheet()

conn=sqlite3.connect('test.sqlite')
c=conn.cursor()
c.execute("select * from abc")
mysel=c.execute("select * from abc ")
for row in mysel:
 print row
 worksheet.write(0, 0, row[0])
workbook.close()

这是 SQLITE 数据库表的布局。
id  sno
1   100
2   200
3   300
4   400

使用worksheet.write(0,0,row[0]),在Excel文件的第一个单元格中输出4

使用worksheet.write(0,0,row[1]),在Excel文件的第一个单元格中输出400

我无法解决FOR LOOP问题,请帮忙。

3个回答

4
您的循环没有问题,除了您将每一行数据都写入同一个单元格。我不了解xlswriter,但我猜第一个和第二个参数是行和列。如果您想将所有数据都写成表格,您需要在每次写操作时更改这些参数。
类似这样(未经测试):
import sqlite3
from xlsxwriter.workbook import Workbook
workbook = Workbook('output2.xlsx')
worksheet = workbook.add_worksheet()

conn=sqlite3.connect('test.sqlite')
c=conn.cursor()
c.execute("select * from abc")
mysel=c.execute("select * from abc ")
for i, row in enumerate(mysel):
    print row
    worksheet.write(i, 0, row[0])
    worksheet.write(i, 1, row[1])
workbook.close()

要处理多个列,可以这样做:
import sqlite3
from xlsxwriter.workbook import Workbook
workbook = Workbook('output2.xlsx')
worksheet = workbook.add_worksheet()

conn=sqlite3.connect('test.sqlite')
c=conn.cursor()
c.execute("select * from abc")
mysel=c.execute("select * from abc ")
for i, row in enumerate(mysel):
    for j, value in enumerate(row):
        worksheet.write(i, j, value)
workbook.close()

谢谢,它有效。请建议我如何调整此for循环以处理n行和列的数量。例如,我有成千上万行和15列要从sqlite转储到表中,而不是4行。 - ashir nasir
好的回答。只是要注意,作为另一种选择,内部for循环可以写成write_row(i, 0, row) - jmcnamara
如果你想写入一整行,应该使用worksheet.write_row(i, 0, row)。如果你喜欢这个答案,请点赞;-) - Graeme Stuart
哈哈,是的,您说得对先生,worksheet.write_row(i, 0, row) 是正确的事情。 - ashir nasir
正确使用 worksheet.write_row()。我已经点赞了 :-). @ashir_nasir 应该接受,因为这是一个好答案。 - jmcnamara
@ashirnasir,该问题仍被标记为没有被接受的答案。请接受我的答案作为正确答案。 - Graeme Stuart

4
import sqlite3
from xlsxwriter.workbook import Workbook
workbook = Workbook('output2.xlsx')
worksheet = workbook.add_worksheet()

conn=sqlite3.connect('test.sqlite')
c=conn.cursor()
c.execute("select * from abc")
mysel=c.execute("select * from abc ")
for i, row in enumerate(mysel):
    for j, value in enumerate(row):
        worksheet.write(i, j, row[j])
workbook.close()

2

不需要在同一个文件中创建多个CSV表格,您可以创建一个包含多个表格的XLSX文件。根据您的需求,这可能是一个很好的解决方案。以下是我得到的内容。

import sqlite3
import xlsxwriter
from tkinter import filedialog # Used to get a path where to save the new excel file
from datetime import datetime # Used to name the file with today's date

DB_Path = filedialog.askdirectory() # OPTIONAL: Asks to select folder path
workbook = xlsxwriter.Workbook(DB_Path+"/"+"MyDatabaseInExcel  "+datetime.now().strftime("%Y %m %d")+'.xlsx') # Create file
conn = sqlite3.connect('MyDatabaseInSQLite3.db') # Connect to your database
cursor = conn.cursor() # Create the cursor
tables = list(cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")) # Get all table names
tables = list(map(lambda x: x[0], tables)) # convert the list of tuple to list of str
for table in tables:
    try: worksheet = workbook.add_worksheet(name=table[0:31]) # Sheet names in excel can have up to 31 chars
    except:pass
    for row_number, row in enumerate(cursor.execute('SELECT * FROM '+table)): # row is a tuple here
        for column_number, item in enumerate(row):
            try: worksheet.write(row_number, column_number, item) # Write the cell in the current sheet
            except:pass
workbook.close() # Saves the new document

我使用了一些尝试来防止程序因任何原因破解,并且不写入其他表格。对于我来说,这在我的项目中是很有意思的一件事。如果您愿意,可以不使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接