1.编写xlsx文件,必须是xlsx后缀的即07版之后的excel
2.xlsx文件,需要三个Sheet页
3.第一个Sheet页为公共变量, 这些变量名称 最终用在第三个Sheet页中,已{{变量名}}的方式取值
4.第二个Sheet页为生成图片多少的列表信息,第一行为头信息,从第二行开始为具体数据信息,最终也用在第三Sheet页中,已{{表头列名}}的方式取值
5.第三个Sheet页需要设置页面背景,页面背景在页面布局选项中,然后在背景上放置需要输出的变量,已{{变量}}的方式去第一和第二Sheet页中的变量
6.编辑好xlsx文件,跟主程序《贴地飞行图片批量生成.exe》放在同一目录下,然后执行exe文件,即下当前目录生成相应的图片
7生成的图片命名规则为第二sheet页中的前两列字段拼接名
8.在第三Sheet页中变量名可以设置字体大小和颜色,但字体是宋体还是雅黑这个xlsx取不到,需要在config.ini中设置字体路径,Windows字体文件在C:\Windows\Fonts中,文件名具体看文件属性,例如宋体simsun.ttc,Linux下需要写全路径/usr/share/fonts/msyh.ttf
附:config.ini配置项说明
font = msyh.ttf  配置字体文件路径
#6.88*(4/3.0)
x = 9.173333     这个变量放在图片上位置x的比例像素,默认即可,正常不需要动
#(4/3.0)
y = 1.3333333   这个变量放在图片上位置y的比例像素,默认即可,正常不需要动

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
from openpyxl import load_workbook
import re
from PIL import Image, ImageDraw, ImageFont
import os
import zipfile
try:import configparser as configparser
except Exception:import ConfigParser as configparser
from collections import OrderedDict
logging.basicConfig(level=logging.DEBUG,#控制台打印的日志级别filename='newlog.log',filemode='a',##模式,有w和a,w就是写模式,每次都会重新写日志,覆盖之前的日志#a是追加模式,默认如果不写的话,就是追加模式format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'#日志格式)# 判断是否是文件和判断文件是否存在
def isfile_exist(file_path):if not os.path.isfile(file_path):print("It's not a file or no such file exist ! %s" % file_path)return Falseelse:return True# 修改指定目录下的文件类型名,将excel后缀名修改为.zip
def change_file_name(file_path, new_type='1.zip'):if not isfile_exist(file_path):return ''extend = os.path.splitext(file_path)[1]  # 获取文件拓展名if extend != '.xlsx' and extend != '.xls':print("It's not a excel file! %s" % file_path)return Falsefile_name = os.path.basename(file_path)  # 获取文件名new_name = str(file_name.split('.')[0]) + new_type  # 新的文件名,命名为:xxx.zipdir_path = os.path.dirname(file_path)  # 获取文件所在目录new_path = os.path.join(dir_path, new_name)  # 新的文件路径if os.path.exists(new_path):os.remove(new_path)os.rename(file_path, new_path)  # 保存新文件,旧文件会替换掉return new_path  # 返回新的文件路径,压缩包# 解压文件
def unzip_file(zipfile_path):if not isfile_exist(zipfile_path):return Falseif os.path.splitext(zipfile_path)[1] != '.xlsx':print("It's not a zip file! %s" % zipfile_path)return Falsefile_zip = zipfile.ZipFile(zipfile_path, 'r')file_name = os.path.basename(zipfile_path)  # 获取文件名zipdir = os.path.join(os.path.dirname(zipfile_path), str(file_name.split('.')[0]))  # 获取文件所在目录# if not os.path.exists(zipdir):#     os.makedirs(zipdir)pic_dir = 'xl' + os.sep + 'media'for files in file_zip.namelist():if files.find(pic_dir)>=0:file_zip.extract(files, os.path.join(zipdir))  # 解压到指定文件目录file_zip.close()return True# 读取解压后的文件夹,打印图片路径
def read_img(zipfile_path):if not isfile_exist(zipfile_path):return Falsedir_path = os.path.dirname(zipfile_path)  # 获取文件所在目录file_name = os.path.basename(zipfile_path)  # 获取文件名pic_dir = 'xl' + os.sep + 'media'  # excel变成压缩包后,再解压,图片在media目录pic_path = os.path.join(dir_path, str(file_name.split('.')[0]), pic_dir)file_list = os.listdir(pic_path)for file in file_list:filepath = os.path.join(pic_path, file)fsize = os.path.getsize(filepath)fsize = fsize / float(1024 * 1024)if fsize>0.05:print(filepath)return filepathreturn ''# 组合各个函数
def compenent(excel_file_path):zip_file_path = excel_file_path#change_file_name(excel_file_path)if zip_file_path != '':if unzip_file(zip_file_path):return read_img(zip_file_path)return ''
def getsheet2(booksheet):defaultRowHeight = booksheet.sheet_format.defaultRowHeightdefaultColWidth = booksheet.sheet_format.defaultColWidthprint (defaultRowHeight)print (defaultColWidth)rows = booksheet.rowsx=0dict=OrderedDict()for i,row in enumerate(rows):y=0for j,col in enumerate(row):# print(col.value,i,j)if col.value!=None and  len(col.value)>0 and  col.value.startswith("{{") and col.value.endswith("}}"):text = re.findall(r'\{{(.*?)\}}', col.value)[0]dict[text]=[i,j,x,y,col.font,col.fill]if booksheet.column_dimensions[col.coordinate].width == None:y=y+defaultColWidthelse:y = y + booksheet.column_dimensions[col.coordinate].widthif booksheet.row_dimensions[i].height==None:x=x+defaultRowHeightelse:x=x+booksheet.row_dimensions[i].height# print (dict)return dictdef getsheet0(booksheet):dict=OrderedDict()rows = booksheet.rowstry:for row in rows:dict[row[0].value]=row[1].valueexcept Exception as e:logging.debug(e)# print(dict)return dict
def getsheet1(booksheet,dictcomm):list=[]rows = booksheet.rowslista=[]try:for i,row in enumerate(rows):dict = OrderedDict()for j,col in enumerate(row):if i == 0:lista.append(col.value)continue# print (col.value)dict[lista[j]]=col.valueif i != 0:dict.update(dictcomm)list.append(dict)except Exception as e:logging.debug(e)# print(list)return list# main
if __name__ == '__main__':try:file_list = os.listdir(os.getcwd())conf = configparser.SafeConfigParser()conf.read("config.ini")fontpath= conf.get("config", "font")#msyh.ttfxxx = float(conf.get("config", "x"))#9.173333yyy = float(conf.get("config", "y"))#1.3333333for file in file_list:if not os.path.splitext(file)[0].startswith('.') and os.path.splitext(file)[1] == '.xlsx':name=fileimgpath=compenent(name)if imgpath=='':logging.debug('未获取到xlsx中的图片')else:workbook = load_workbook(name)sheets = workbook.sheetnames         #从名称获取sheetbooksheet = workbook[sheets[2]]lists=getsheet1(workbook[sheets[1]],getsheet0(workbook[sheets[0]]))dicts=getsheet2(workbook[sheets[2]])#往图片写入for index,li in enumerate(lists):base = Image.open(imgpath)d = ImageDraw.Draw(base)for key in dicts:fill=(0, 0, 0)fnt = ImageFont.truetype(fontpath, int(dicts[key][4].sz))if dicts[key][4].color==None:fill='#'+dicts[key][5].fgColor.value[2:]else:fill = '#' +dicts[key][4].color.value[2:]d.text(( dicts[key][3]*xxx,dicts[key][2]*yyy), unicode(str(li[key]),'UTF-8'),font=fnt ,fill=fill)filename =''if len(li)>1:filename=str(li.items()[0][1])+'_'+str(li.items()[1][1])else:filename =str(li.items()[0][1])print(filename)logging.debug(filename)base.save(filename+str(index)+os.path.splitext(imgpath)[1])# breakexcept Exception as e:logging.debug(e)

最终批量生成图片效果图:

转载于:https://my.oschina.net/djsoft/blog/2885388

读取xlsx,根据模板图片批量添加文字生成相关图片,如证书,奖状,名片等相关推荐

  1. html图片加文字批量处理,图片批量加水印工具,图片批量添加文字|图片同时添加文字或图片水印...

    一般在网上下载的图片都会自动带有相应网站的文字或是图片水印,虽然可能在使用图片素材的时候,图片上的水印会在一定程度上影响美观,但是水印是对于版权或者是原创的一个保护,图片水印不仅是可以保护别人的原创图 ...

  2. 利用Python脚本给图片批量添加文字水印

    引言:本人从小白自学python,为了测试基础学习效果,增加一定的促进,想通过参加全国计算机等级考试二级python来检验基础学习情况.在学习过程中,会将该过程编写的python小程序题目在此发表,希 ...

  3. 视频剪辑工具,图片批量添加背景,支持图片、视频背景

    最近有很多朋友在问,如何批量给图片添加背景呢?而且是加图片或者视频的那种呢?不知道如何操作的宝贝们,下面请随小编一起来试试吧. 需要哪些工具? 视频素材若干 怎么快速剪辑? 运行[媒体梦工厂],在&q ...

  4. html5图片中加入文字,HTML肿么在图片上添加文字,也就是图片作为背景,代码和图像显示如下...

    单纯的html要实现你说的效果很难,必须html和css配合才可以,首先用css为需要设置背景的元素设置背景,然后用html写文字等内容.附加一个简单例子,希望帮到你.(其中1.jpg跟这个页面在一个 ...

  5. PHP合成推广微信推广海报 PHP合成图片 PHP在图片上添加文字 PHP制作图片

    代码演示: <?php header("content-type: image/png");//如果要看报什么错,可以先注释调这个header$nickname = &quo ...

  6. 主图批量添加文字水印

    众多平台商家都在用的主图水印工具,可批量添加和修改主图水印的快捷智能工具,简单操作3秒出图,销量超10W+的商家都推荐使用. 无论是文字还是图片水印都可以快速批量添加,让你的商品品牌露出更系统化,减少 ...

  7. 不用PS,如何给多图片批量加文字水印?

    给图片加上文字水印是我们在工作中经常遇到的事情,比如将图片上传到网站上,为了防止别人盗用自己的图片,我们都习惯在图片上加上水印,文字水印或者图片水印,我就经常在工作中需要给图片加水印. 一个图片加上文 ...

  8. java生成二维码(在图片上生成二维码(二维码带logo)并且在图片上添加文字标签)

    1pom.xml <!--生成二维码--> <dependency><groupId>cn.hutool</groupId><artifactId ...

  9. php加图片源码_PHP添加文字水印或图片水印的水印类完整源代码与使用示例

    PHP实现的给图片添加水印功能,可添加文字水印或图片水印,使用文字水印时需要提供字体文件,使用图片水印时需要提供水印图片,水印图片不能比要添加水印的图片大,请使用背景透明的水印图片. 该水印类支持自定 ...

  10. java在图片下方写文字_Java画图给图片底部添加文字标题

    Java画图 给图片底部添加文字标题 需求给图片底部添加文字编号 import java.awt.Color; import java.awt.Font; import java.awt.Graphi ...

最新文章

  1. oracle server process,KI视角下的ORACLE SERVER PROCESS进程的活动
  2. troch3d open3d例子
  3. 接入路由器做NAT,做限速的一些想法
  4. [Nginx]负载均衡和动静分离
  5. 【React Native开发】React Native控件之DrawerLayoutAndroid抽屉导航切换组件解说(13)
  6. java事件监听机制pdf,事件监听机制(转)
  7. 创业项目筹备了两个多月,确实不容易
  8. 【机房收费系统】---组合查询
  9. python发送文件_Python大文件传输
  10. Bitmap,Drawable转换
  11. php workerman在线同步点歌台,支持在线聊天,与点歌
  12. 电源防反接和防倒灌 - 使用MOS 管和运放实现理想二极管
  13. RocksDB基本架构与原理介绍
  14. c语言求斐波那契数列n项以及前n项和
  15. 银行存款利率C语言程序设计,存款利息的计算 有1000元,想存5年,可按以下5种办法存:...
  16. widget窗口小部件
  17. 【Python】链家网二手房购房决策树
  18. Python学习(二)——Python版本未激活
  19. 【蓝桥杯——单片机学习笔记】五.数码管显示(STC15F2K60S2)
  20. 万春总与无线院深圳管理干部沟通交流纪要

热门文章

  1. Apizza在线接口调试文档工具如何方便的设置线上线下环境变量
  2. USB接口和雷电接口有什么关系?
  3. 非线性系统 知识梳理
  4. C语言结构体内存对齐
  5. Android代码中设置横屏
  6. 研究生数学建模大赛多久出结果_商学院研究生参加中国研究生数学建模竞赛获得重大突破...
  7. 实战-全局唯一邀请码功能实现
  8. 莫烦python讲得好差_莫烦PYTHON——PyTorch——DQN 代码详解
  9. pdf资源有密码怎么办?
  10. 基于神经网络多层感知器的波士顿房价数据集回归问题