Python+SeaTable | 從數字、文字列生成條形碼圖片並寫入表格

SeaTable開發者版發表於2022-11-24

不管是錄入資訊時需要用掃碼器掃碼錄入、核對資訊時用於掃碼識別,還是有別的生成條形碼的需要,那我們如何把表格中的數字、文字列快速生成條形碼圖片呢?這在 SeaTable 表格中用 Python 指令碼就可以輕鬆實現,即把表格中的某一個欄位,如身份證號、電話號轉換成相應的條形碼,並儲存到圖片列中。例如,你有如下一張表格,裡面有電話號碼和條碼圖片兩列,需要把每一行的電話號碼轉換成條碼,並傳到條碼圖片(BarcodeImage)列中去。怎麼實現呢?

在 SeaTable 中用 Python 生成條形碼

新建 Python 指令碼

首先需要在表格中,點選“指令碼”功能,新建一個 Python 指令碼。

寫入程式碼

然後在指令碼中寫入如下程式碼(如果需要線下執行,需要安裝Python-barcode 依賴包)

import os
import time
import barcode
from barcode.writer import ImageWriter
from seatable_api import Base, context

api_token = context.api_token or "859ad340d9a2b11b067c11f43078992e14853af5"
server_url = context.server_url or "https://cloud.seatable.cn"

TEXT_COL = "PhoneNum"  # 需要轉換成條碼的列
BARCODE_IMAGE_COL = "BarcodeImage" # 圖片列, 儲存條碼
TABLE_NAME = 'Table1'
BARCODE_TYPE = 'code128'

CUSTOM_OPTIONS = {
    "module_width": 0.2,       # 單個條紋的最小寬度, mm
    "module_height": 15.0,     # 條紋帶的高度, mm
    "quiet_zone": 6.5,         # 圖片兩邊與首尾兩條紋之間的距離, mm
    "font_size": 10,           # 條紋底部文字的大小,pt
    "text_distance": 5.0,      # 條紋底部與條紋之間的距離, mm
}


CODE = barcode.get_barcode_class(BARCODE_TYPE)
base = Base(api_token, server_url)
base.auth()

def get_time_stamp():
    return str(int(time.time()*100000))

for row in base.list_rows(TABLE_NAME):
    # 如果圖片列中已有內容, 則跳過
    if row.get(BARCODE_IMAGE_COL):
        continue
    # 如果電話號碼列為空,則跳過
    if not row.get(TEXT_COL):
        continue

    try:
        row_id = row.get('_id')
        msg = str(row.get(TEXT_COL))

        # 生成條碼物件
        code_img = CODE(msg, writer=ImageWriter())
        save_name = "%s_%s" % (row_id, get_time_stamp())

        # 儲存為圖片並暫存
        file_name = code_img.save("/tmp/%s" % save_name, options=CUSTOM_OPTIONS)

        # 將圖片上傳至 Base 表格
        info_dict = base.upload_local_file(file_name, name=None, file_type='image', replace=True)
        img_url = info_dict.get('url')
        row[BARCODE_IMAGE_COL] = [img_url]
        base.update_row('Table1', row_id, row)

        # 移除暫存檔案
        os.remove(file_name)
    except Exception as error:
        print("error occured during barcode generate", error)
        continue

執行指令碼

一鍵點選執行按鈕,指令碼執行完成後,表格中的電話號就會自動生成相應的條形碼,並儲存到條形碼圖片列。方便快捷。

設定條碼參考

此外,如果你還需要設定條碼、條紋的長度,以及文字的長度等,可以透過調節指令碼中的 CUSTOM_OPTIONS中的引數來實現,以下是一些例子:

預設模式

module_width 1mm

module_height 5mm

quiet_zone 0.5mm

font_size 6pt

text_distance 2

應用場景

在前面完成了把文字列的值轉換成條形碼,例如,把一長串准考證號轉換成條形碼圖片,下面來看如何應用。

列印條形碼用於貼上答題卡

當把每個學生的准考證號轉換成條形碼圖片後,考務工作人員點選條形碼圖片列,可以下載全部並能使用 {列名} 引用欄位內容給所有條形碼自動命名,方便後續工作。

設計准考證頁面用於識別資訊

把學生姓名、照片、准考證條形碼等資訊設計成准考證頁面,用於掃碼讀取、核對、錄入資訊等需要,是比較常見的考務工作和使用場景。這種資料的記錄、處理、應用等工作在 SeaTable 表格上就可以快速完成。

在表格上新增頁面設計外掛,就可以自定義設計多個頁面模板。頁面可以拖入行記錄中的文字、數字、圖片等欄位資訊。設計完並儲存後,可以一鍵列印當前行記錄頁面或列印所有頁面,也可以設定使用 {欄位名} 引用欄位的內容,並一鍵下載為PDF。

總結

透過以上的例子,是不是又發現了 SeaTable 在使用上的更多靈活性和場景呢,但是條碼的生成和轉換還需要注意一個問題,一維條碼天生是不支援漢字轉換的,只支援基本的數字、字母和一些字元的轉換,不過這對於日常業務已經基本足夠了。總之,基於 SeaTable 豐富的功能,再結合 Python 指令碼來使用,能幫助我們實現很多意想不到的效果,高效率低成本落地應用,真的是一款值得擁有和分享的寶藏軟體工具。


案例參考

Python + SeaTable | 計算兩個日期間的工作日天數

Python + SeaTable | 從啟信寶網站獲取公司融資等資訊至 SeaTable 表格

Python + SeaTable | 用 Python 從維基百科抓取冬奧會城市資訊並製作地圖

相關文章