pea*_*eak 5 sqlite excel blob google-sheets pandas
简而言之:如何在不丢失单元格固定图像的情况下将Google表格电子表格导出到SQLite数据库?
确切地说:Google表格,Excel和SQLite都允许使用单元格锚定的图像。此外,Sheets支持导出到Excel,而不会丢失此类图像;以及诸如“ SQLite的数据库浏览器”之类的配套程序以及LibreOffice也支持单元锚定的图像。但是,尽管我已经尝试了所有明显的可能性以及一些不太明显的可能性,但仍无法将工作表(或Excel电子表格)导出到SQLite。在后一种类别中,有两个值得注意的尝试:
a)Python包openpyxl明确表示“未复制所有其他工作簿/工作表属性-例如图像,图表”。
b)pandas由于的dtype参数,Python 更有前景read_excel。假设将其指定为object应该保留诸如单元格固定图像之类的对象。
然后,这是我(使用失败)尝试使用熊猫来获得所需结果的尝试之一:
import sqlite3
import pandas as pd
filename="Test"
con=sqlite3.connect(filename+".db")
wb = pd.read_excel('Test.xlsx',sheet_name = None, header = None, dtype = object)
for sheet in wb:
print(sheet) # Sheet1
# print( wb[sheet].columns )
wb[sheet].to_sql(sheet, con, index=False)
con.commit()
con.close()
Run Code Online (Sandbox Code Playgroud)
任何解决方案,无论是否基于Python,都将很高兴被接受。
我知道几种将所有图像提取到单独文件中的技术,但是我正在寻找一种全自动技术(大概是某种脚本)来执行转换。这种技术是否作为中间步骤提取图像并不重要。
我也曾尝试dtype在的呼叫中加入规格to_sql,但无济于事。
@Stef的原始程序要求要复制的图像都在命名列中,并且这些名称是已知的或可以确定的。第一个假设是可以接受的,而第二个假设可以通过简单地写:
dtype = object
Run Code Online (Sandbox Code Playgroud)
在致电中read_excel。
没有直接的方法,但您可以使用2.5.5或更高版本来读取图像并手动将其放入数据帧中。 openpyxl
在下面的最小示例中,我使用 pandasread_excel首先获取除图像之外的所有数据。关键点是将图像列导入为object类型,以便以后能够分配图像。否则这个空列将获取所有NaNs 和浮点数据类型。
然后我们使用 Excel 读取图像openpyxl并将其导入到数据框中。ref图像的属性保存着一个流_io.BytesIO。加载工作簿后,它的指针指向末尾 (EOF),因此我们必须先倒回它 ( img.ref.seek(0))。img.path(顺便说一句,其中的名称似乎有一个错误:我为所有三个图像openpyxl提供了相同的路径,而它在 xlsx 中)。
锚行/列值是从零开始的 ( ),因此在计算数据帧中的位置(以及可能的索引列,如果有)时,我们必须考虑标题行。最后,我们使用 .sql 将数据帧导出到 SQL 。/xl/media/image1.pngimage{1,2,3}.pngimg.anchor.idx_base == 0iatto_sql
import pandas as pd
import openpyxl
import sqlite3
file_name = 'so58068593.xlsx'
sheet_name = 'Tabelle1'
# read data into dataframe
df = pd.read_excel(file_name, sheet_name=sheet_name, dtype=object)
# read images and add them to dataframe
wb = openpyxl.load_workbook(file_name)
ws = wb[sheet_name]
for img in ws._images:
img.ref.seek(0)
df.iat[img.anchor.to.row-1, img.anchor.to.col] = img.ref.read()
# export to sqlite
with sqlite3.connect(file_name + ".db") as con:
df.to_sql(sheet_name, con=con)
Run Code Online (Sandbox Code Playgroud)
在 DB Browser for SQLite 中查看 SQLite 数据库:
这只是一个最小的例子。如果您事先不知道图像在xlsx文件中的位置,您可以首先迭代images工作表的集合并检查数据框中的图像需要哪些列/行,然后将它们附加到数据框(如果没有)已经在那里),然后才分配图像。但请注意,xlsx您可以在单元格中包含数据,同时将图像锚定到该单元格,这当然不能映射到数据库表或 pandas 数据框。原因是图像不是单元格的内容,而只是锚定到该单元格(您甚至可以将多个图像锚定到同一个单元格)。