支持单元格转换成图片

场景: 每行都需要一个图片的excel需要导入到seatable中来。

我理解通过csv导入图片对象进seatable肯定是不现实的。所以我就尝试放了图片地址 url进来, 通过csv上传之后, 再想着把url字段转换成 图片类型的字段。 可是发现没有办法这么转换。

但是已经在seatable中通过连接添加的图片却可以被正确的导出成excel,对应图片的一列就是图片地址 + 换行. 所以是不是反过来应该也非常好支持?

只要是正确的图片url,就直接转换成图片类型,如果不符合要求抛弃没结果就好了 。

还有顺便提另外一个问题, 图片列通过连接加的是不是也可以在浏览的时候展示一下连接?这样也可以直接跳到来源处去。

多谢.

这个可以通过一个 Python 脚本来实现。下周可以给你写一个例子。

你原始的图片是能公开下载的吗?

是的。 都可以公开下载,不是内部机密。如果是内部机密也就没有这个需求了。

行,我们写一个脚本吧。

你可以用这个 Python 脚本来自动处理图片。TABLE_NAME , IMG_URL_COL, IMG_COL 根据你的实际情况修改下。

from seatable_api import Base, context
import requests
import time
import os

"""
该脚本用于从图片链接下载图片到图片列。你可以在一个文本列中记录图片的地址,然后用这个
脚本自动下载图片并上传到图片列中。
"""

###################---基本信息配置---###################
SERVER_URL      = context.server_url or 'https://cloud.seatable.cn/'
API_TOKEN       = context.api_token  or 'cacc42497886e4d0aa8ac0531bdcccb1c93bd0f5'
TABLE_NAME      = 'Table1'
IMAGE_FILE_TYPE = ['jpg', 'png', 'jpeg', 'bmp', 'gif']      # 图片的格式

IMG_URL_COL     = '图片链接'                                 # 包含图片链接的列名,需要是 URL 或者文本类型 
IMG_COL         = 'img'                                     # 用于存储图片的列名,需要是图片类型

IMG_NAME_PRE    = 'image'                                   # 图片上传后使用的文件名称前缀
###################---基本信息配置---###################

def get_time_stamp():
    return str(int(time.time()*100000))
    
def img_transfer():
    # 1. 创建 base 对象并且认证
    base = Base(API_TOKEN, SERVER_URL)
    base.auth()    

    # 2. 获取行信息, 数据结构--列表嵌套字典
    """
    数据结构例子:其中'img', '图片链接是用户自定义的列名'
    [{
        '_id': 'RNn2isDfRnSPWq5HIwRT0w',
        '_mtime': '2020-11-10T03:02:55.549+00:00',
        'Name': '冉继伟0',
        'img': [{
            'name': 'cut.png',
            'size': 2778797,
            'type': 'file',
            'url': 'https://dev.seafile.com/dtable-web/workspace/104/asset/1d50c674-ca45-4acf-85b8-19d6e10ca5f0/files/2020-11/cut.png'
        }],
        '图片链接': 'https://timgsa.baidu.com/timg?image&quality=80xxx.jpg'
    }, {
        '_id': 'b2lrBxnDSGm1LsZDQTVGhw',
        '_mtime': '2020-11-04T08:47:51.562+00:00',
        'Name': '冉继伟1'
    }, {
        '_id': 'RBUZ_g6qS_KER0EjaSclFA',
        '_mtime': '2020-11-04T09:26:45.961+00:00',
        'Name': '冉继伟2',
        'img': None
    }, ......]
    """
    rows  = base.list_rows(TABLE_NAME)
    count = 0
    #3. 遍历每一行,获取‘图片链接‘列的信息
    for row in rows:
        time_stamp = get_time_stamp()
        img_url    = row.get(IMG_URL_COL, None)
        img        = row.get(IMG_COL, None)
        try:
            #若无图片链接或者img列有数据的话跳过,防止重复添加
            if (not img_url) or img:
                continue
            #通过url链接获取文件扩展名
            img_name_extend = img_url.strip().split('.')[-1]
            img_name_extend = img_name_extend in IMAGE_FILE_TYPE and img_name_extend or 'jpg'
            #通过uuid对下载的文件进行重命名 IMG_NAME_PRE + 时间戳 + 扩展名
            img_name     = "/tmp/image-%s.%s"%(time_stamp, img_name_extend)
            #下载文件
            response = requests.get(img_url)
            if response.status_code != 200:
                raise Exception('download file error')
            with open(img_name, 'wb') as f:
                f.write(response.content)
            #文件上传
            info_dict    = base.upload_local_file(img_name, name=None, relative_path=None, file_type='image', replace=True)
            row[IMG_COL] = [info_dict.get('url')]
            base.update_row('Table1', row['_id'], row)
            #上传完成之后删除
            os.remove(img_name)

        except Exception as err_msg:
            print('count%s-%s-%s-message: %s' % (count, row['_id'], img_url, err_msg))      #发现异常打印行数等信息方便回查
            continue
        count += 1
        
if __name__ == "__main__":
    img_transfer()

原始文件链接: https://github.com/seatable/seatable-scripts-cn/blob/master/examples/python/image_transfer.py