将带有单元格固定图像的电子表格导入到SQLite数据库中

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

Ste*_*tef 3

没有直接的方法,但您可以使用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}.png
img.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)

Excel 文件(图片取自维基百科):

在此输入图像描述

在 DB Browser for SQLite 中查看 SQLite 数据库:

在此输入图像描述

这只是一个最小的例子。如果您事先不知道图像在xlsx文件中的位置,您可以首先迭代images工作表的集合并检查数据框中的图像需要哪些列/行,然后将它们附加到数据框(如果没有)已经在那里),然后才分配图像。但请注意,xlsx您可以在单元格中包含数据,同时将图像锚定到该单元格,这当然不能映射到数据库表或 pandas 数据框。原因是图像不是单元格的内容,而只是锚定到该单元格(您甚至可以将多个图像锚定到同一个单元格)。