【Python】Excel表格操作:ISBN转条形码

一、效果

原始文件:

输出文件:

二、代码

python 复制代码
import os
import logging
from openpyxl import load_workbook
from openpyxl.drawing.image import Image as ExcelImage
from barcode import EAN13
from barcode.writer import ImageWriter

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')


def delete_files(directory):
    file_list = os.listdir(directory)
    for file in file_list:
        file_path = os.path.join(directory, file)
        if os.path.isfile(file_path):
            os.remove(file_path)


def generate_barcode_image_with_text(barcode_str, output_path_without_ext):
    # Generate barcode image without text
    ean = EAN13(barcode_str, writer=ImageWriter())
    saved_path = ean.save(output_path_without_ext)

    return saved_path


def insert_barcodes_to_excel(excel_file, ISBNCol, imgCol):
    logging.info("开始处理")

    if not os.path.exists('barcode_temp'):
        os.makedirs('barcode_temp')

    wb = load_workbook(excel_file)
    ws = wb.active
    logging.info(f"加载工作表: {ws.title}")

    img_height_in_points = 45  # 你设置的图片高度,单位是磅,1磅约等于1.33像素

    for row in range(2, ws.max_row + 1):
        barcode_cell = ws.cell(row=row, column=ISBNCol)
        barcode_str = str(barcode_cell.value).strip()
        if not barcode_str or len(barcode_str) != 13 or not barcode_str.isdigit():
            logging.warning(f"第{row}行条码格式不正确,跳过: {barcode_str}")
            continue

        img_path_no_ext = os.path.join('barcode_temp', f'barcode_{barcode_str}')
        try:
            img_path = generate_barcode_image_with_text(barcode_str, img_path_no_ext)
        except Exception as e:
            logging.error(f"生成条码失败,行{row},条码{barcode_str},错误: {e}")
            continue

        img_for_excel = ExcelImage(img_path)
        img_for_excel.width = 180
        img_for_excel.height = 60

        img_cell = f'{imgCol}{row}'

        # # 设置列宽
        ws.column_dimensions[imgCol].width = img_for_excel.width * 0.15
        # # 设置行高
        ws.row_dimensions[row].height = img_for_excel.height

        ws.add_image(img_for_excel, img_cell)

        # 调整当前行高,避免图片重叠
        current_height = ws.row_dimensions[row].height
        if current_height is None or current_height < img_height_in_points:
            ws.row_dimensions[row].height = img_height_in_points

        # logging.info(f"插入条码图片到 {img_cell} 并调整行高")

    new_file = os.path.splitext(excel_file)[0] + '_with_barcodes.xlsx'
    try:
        wb.save(new_file)
        logging.info(f"保存新文件: {new_file}")
    except PermissionError:
        logging.error(f"保存文件失败,可能文件被打开: {new_file}")

    if os.path.exists('barcode_temp'):
        logging.info("删除临时文件")
        delete_files('barcode_temp')

    logging.info("完成处理!")


if __name__ == "__main__":
    excel_path = 'D:\\temp\\图书清单.xlsx'
    insert_barcodes_to_excel(excel_path, 1, "B")

三、说明

1、insert_barcodes_to_excel参数1:原始Excel表格文件绝对路径。

2、insert_barcodes_to_excel参数2:ISBN所在列,数字格式。例如:ISBN在A列则输入1,在B列则输入2。

3、insert_barcodes_to_excel参数3:生成的条形码需要放在第几列,大写字母格式。例如:需要放在第二列则输入B,第三列则输入C。

相关推荐
Polar__Star37 分钟前
如何结合计划任务实现自动定时备份任务配置_全自动化运维管理
jvm·数据库·python
weixin_580614006 小时前
如何提取SQL日期中的年份_使用YEAR或EXTRACT函数
jvm·数据库·python
2301_813599556 小时前
SQL生产环境规范_数据库使用最佳实践
jvm·数据库·python
李可以量化6 小时前
QMT 量化实战:用 Python 实现线性回归通道,精准识别趋势中的支撑与压力(下)
python·qmt·量化 qmt ptrade
a9511416426 小时前
Go 中通过 channel 传递切片时的数据竞争与深拷贝解决方案
jvm·数据库·python
Dxy12393102166 小时前
Python 使用正则表达式将多个空格替换为一个空格
开发语言·python·正则表达式
qq_189807036 小时前
如何修改RAC数据库名_NID工具在集群环境下的改名步骤
jvm·数据库·python
zhangchaoxies6 小时前
如何检测SQL注入风险_利用模糊测试技术发现漏洞
jvm·数据库·python
Luca_kill7 小时前
MCP数据采集革命:从传统爬虫到智能代理的技术进化
爬虫·python·ai·数据采集·mcp·webscraping·集蜂云
zhangchaoxies7 小时前
CSS如何实现响应式弹性网格布局_配合media query修改flex-wrap属性
jvm·数据库·python