gpt4 book ai didi

excel - 将带有单元格锚定图像的电子表格导入 SQLite 数据库

转载 作者:行者123 更新时间:2023-12-02 08:36:46 28 4
gpt4 key购买 nike

简而言之:如何将 Google Sheets 电子表格导出到 SQLite 数据库而不丢失单元格锚定图像?

长话短说: Google Sheets、Excel 和 SQLite 都允许使用单元格锚定图像。此外,Sheets 支持导出到 Excel,而不会丢失此类图像;以及配套程序,例如“DB Browser for SQLite”, LibreOffice 还支持单元格锚定图像。但是,我无法导出工作表(或 Excel 电子表格) 到 SQLite,尽管我已经尝试了所有明显的可能性,以及一些不太明显的可能性。在后者中 类别中,有两次尝试值得注意:

a) Python 包 openpyxl 明确表示 “不会复制所有其他工作簿/工作表属性 - 例如图像、图表。”

b) 由于 read_exceldtype 参数,Python 的 pandas 更有前途。据说, 将其指定为 object 应该允许保留对象,例如细胞锚定图像。

这是我使用 pandas 来实现所需结果的(失败的)尝试之一:

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()

任何解决方案,无论是否基于 Python,都会很乐意接受。

澄清

我知道有几种将所有图像提取到单独文件中的技术,但我正在寻找一种完全自动化的技术(大概是某种脚本)来执行转换。这种技术是否提取图像作为中间步骤并不重要。

我还尝试在对 to_sql 的调用中添加 dtype 规范,但无济于事。

附录

@Stef 的原始程序要求要复制的图像全部位于命名列中,并且这些名称要么是已知的,要么是可以确定的。第一个假设是可以接受的,第二个假设可以通过简单地编写来放宽:

dtype = object

在对 read_excel 的调用中。

最佳答案

没有直接的方法,但可以使用openpyxl version 2.5.5或稍后读取图像并手动将它们放入数据框中。

在下面的最小示例中,我使用 pandas read_excel 首先获取除图像之外的所有数据。关键点是将图像列导入为 object 类型,以便以后能够分配图像。否则,此空列将获取所有 NaN 和 float 据类型。
然后我们使用 openpyxl 从 Excel 读取图像并将其导入到数据框中。图像的 ref 属性保存一个 _io.BytesIO 流。加载工作簿后,它的指针指向末尾 (EOF),因此我们必须先倒回它 (img.ref.seek(0))。 (顺便说一句,openpyxl 中的 img.path 名称似乎有一个错误:我得到相同的路径 /xl/media/image1.png 对于所有三个图像来说是 image{1,2,3}.png 在 xlsx 中)。
anchor 行/列值从零开始 (img.anchor.idx_base == 0),因此我们在计算数据帧中的 iat 位置时必须考虑标题行(以及可能的索引列,如果有的话)。最后,我们使用 to_sql 将数据帧导出到 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)

Excel file (图片取自Wikipedia):

enter image description here

在 SQLite 的数据库浏览器中查看 SQLite 数据库:

enter image description here

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

关于excel - 将带有单元格锚定图像的电子表格导入 SQLite 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58068593/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com