1 Star 1 Fork 0

DylanMingan/bills_assistant

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
fill_table.py 8.95 KB
一键复制 编辑 原始数据 按行查看 历史
DylanMingan 提交于 2023-02-15 20:35 . 修复表格边框
from docx import Document
from docx.shared import Pt
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
from docx.enum.text import WD_ALIGN_PARAGRAPH # 设置对象居中、对齐等。
from docx.enum.table import WD_ROW_HEIGHT_RULE
from docx.enum.table import WD_ALIGN_VERTICAL
import sys,os
import datetime
def Num2Big(money):
cnNums = ["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"] #汉字的数字
cnIntRadice = ["", "拾", "佰", "仟"] #基本单位
cnIntUnits = ["", "万", "亿", "兆"] #对应整数部分扩展单位
cnDecUnits = ["角", "分", "毫", "厘"] #对应小数部分单位
cnInteger = "整" #整数金额时后面跟的字符
cnIntLast = "元" #整型完以后的单位
maxNum = 999999999999999.9999 #最大处理的数字
# IntegerNum 金额整数部分
# DecimalNum 金额小数部分
ChineseStr = "" #输出的中文金额字符串
parts =[] #分离金额后用的数组,预定义
Symbol = "" #正负值标记
if money == "":
return ""
money = float(money)
if money >= maxNum:
return ""
if money == 0:
ChineseStr = cnNums[0] + cnIntLast + cnInteger
return ChineseStr
if money < 0:
money = -money
Symbol = "负 "
money = str(money) #转换为字符串
if money.find(".") == -1:
IntegerNum = money
DecimalNum = ""
else:
parts = money.split(".")
IntegerNum = parts[0]
DecimalNum = parts[1][0:4]
if int(IntegerNum) > 0:#获取整型部分转换
zeroCount = 0
IntLen = len(IntegerNum)
for i in range(0,IntLen):
n = IntegerNum[i:i+1:1]
p = IntLen - i - 1
q = p // 4
m = p % 4
if n == "0":
zeroCount +=1
else:
if zeroCount > 0:
ChineseStr += cnNums[0]
zeroCount = 0 #归零
ChineseStr += cnNums[int(n)] + cnIntRadice[m]
if m == 0 and zeroCount < 4:
ChineseStr += cnIntUnits[q]
ChineseStr += cnIntLast#整型部分处理完毕
if DecimalNum != "":#小数部分
decLen = len(DecimalNum)
for i in range(0,decLen):
n = DecimalNum[i:i+1:1]
if n != "0":
ChineseStr += cnNums[int(n)] + cnDecUnits[i]
if ChineseStr == "":
ChineseStr += cnNums[0] + cnIntLast + cnInteger
elif DecimalNum == "0":
ChineseStr += cnInteger
ChineseStr = Symbol + ChineseStr
return ChineseStr
def set_cell_border(cell, **kwargs):
"""
Set cell`s border
Usage:
set_cell_border(
cell,
top={"sz": 12, "val": "single", "color": "#FF0000", "space": "0"},
bottom={"sz": 12, "color": "#00FF00", "val": "single"},
left={"sz": 24, "val": "dashed", "shadow": "true"},
right={"sz": 12, "val": "dashed"},
)
"""
tc = cell._tc
tcPr = tc.get_or_add_tcPr()
# check for tag existnace, if none found, then create one
tcBorders = tcPr.first_child_found_in("w:tcBorders")
if tcBorders is None:
tcBorders = OxmlElement('w:tcBorders')
tcPr.append(tcBorders)
# list over all available tags
for edge in ('left', 'top', 'right', 'bottom', 'insideH', 'insideV'):
edge_data = kwargs.get(edge)
if edge_data:
tag = 'w:{}'.format(edge)
# check for tag existnace, if none found, then create one
element = tcBorders.find(qn(tag))
if element is None:
element = OxmlElement(tag)
tcBorders.append(element)
# looks like order of attributes is important
for key in ["sz", "val", "color", "space", "shadow"]:
if key in edge_data:
element.set(qn('w:{}'.format(key)), str(edge_data[key]))
def addrow(table, times):
"""
添加表格行
:param table: 表格名
:param times: 添加几行
"""
for i in range(times):
table.add_row()
insertion_row = table.rows[5]._tr
insertion_row.addnext(table.rows[-1]._tr)
# 合并不规范的单元格
table.cell(6, 1).merge(table.cell(6, 3))
# 设置单元格边框
for j in range(9):
set_cell_border(table.cell(6, j),
top={"sz": 4, "val": "single", "color": "#000000", "space": "0"},
bottom={"sz": 4, "val": "single", "color": "#000000", "space": "0"},
left={"sz": 4, "val": "single", "color": "#000000", "space": "0"},
right={"sz": 4, "val": "single", "color": "#000000", "space": "0"}, )
def SetDetail(table,lists):
addrow(table, len(lists)-1)
# 明细复制赋值
for row in range(len(lists)):
# 需要指定单元格的大小
table.rows[row + 5].height_rule = WD_ROW_HEIGHT_RULE.EXACTLY
table.rows[row + 5].height = Pt(24)
for col in range(9):
table.cell(row + 5, col).paragraphs[0].clear()
table.cell(row + 5, col).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
cell_font = table.cell(row + 5, col).paragraphs[0].add_run(lists[row][col])
# 设置单元格居中
table.cell(row + 5, col).vertical_alignment = WD_ALIGN_VERTICAL.CENTER
# 设置英文字体为Times New Roman
cell_font.font.name = 'Times New Roman'
# 设置字体大小
cell_font.font.size = Pt(12)
# 设置中文字体为宋体
cell_font._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
def SetTime(table):
#清空表格里的时间#
table.cell(1,3).paragraphs[0].clear() #序号
#读取时间
time=datetime.datetime.now().strftime('%Y年%m月%d日')
#修改表格的时间
run_table_time = table.cell(1,3).paragraphs[0].add_run(str(time)) #序号
#设置英文字体为Times New Roman
run_table_time.font.name = 'Times New Roman'
#设置字体大小
run_table_time.font.size = Pt(12)
#设置中文字体为宋体
run_table_time._element.rPr.rFonts.set(qn('w:eastAsia'),'宋体')
def SetCompanyName(table,company_name):
#清空#
table.cell(3,1).paragraphs[0].clear() #序号
#修改
run_table_time = table.cell(3,1).paragraphs[0].add_run(company_name) #序号
#设置英文字体为Times New Roman
run_table_time.font.name = 'Times New Roman'
#设置字体大小
run_table_time.font.size = Pt(12)
#设置中文字体为宋体
run_table_time._element.rPr.rFonts.set(qn('w:eastAsia'),'宋体')
def SetNum(table,lists):
# 计算所有的总数
allnum = 0.0
for index in lists:
allnum += float(index[-1])
# 保留2位小数点
allnum = str(format(allnum, ".2f"))
#清空总价大写数字
table.cell(-5,8).paragraphs[0].clear()
#修改表格的总价大写数字
run_table_allnum = table.cell(-5,8).paragraphs[0].add_run(allnum) #序号
#设置英文字体为Times New Roman
run_table_allnum.font.name = 'Times New Roman'
#设置字体大小
run_table_allnum.font.size = Pt(12)
#清空总价大写数字
table.cell(-5,4).paragraphs[0].clear()
#读取发票的总价
num=float(allnum)
#修改表格的总价大写数字
run_table_bignum = table.cell(-5,4).paragraphs[0].add_run(str(Num2Big(num))) #序号
#设置英文字体为Times New Roman
run_table_bignum.font.name = 'Times New Roman'
#设置字体大小
run_table_bignum.font.size = Pt(12)
#设置中文字体为宋体
run_table_bignum._element.rPr.rFonts.set(qn('w:eastAsia'),'宋体')
#测试数据
# lists=[['1', ' ', ' ', '123', '赛 ', '个', '1', '123', '123.7'],
# ['2', ' ', ' ', '34', '赛发动发', '个', '213', '3', '639.6'],
# ['3', ' ', ' ', '东方', '送的', '个', '2', '4', '8'],
# ['4', ' ', ' ', '懂发', '赛', '个', '1', '4', '4'],
# ['5', ' ', ' ', '懂发', '赛', '个', '1', '4', '4'],
# ['6', ' ', ' ', '懂发', '赛', '个', '1', '4', '4'],
# ['7', ' ', ' ', '懂发', '赛', '个', '1', '4', '4'],
# ['8', ' ', ' ', '懂发', '赛', '个', '1', '4', '4']]
# company_name="fsd公司"
# name="螺1丝"
def CreatForms(name,company_name,lists):
pwd_path=os.getcwd()
in_forms_file_path = os.path.join(pwd_path,"template/1.docx")
out_forms_file_path = os.path.join(pwd_path,"template/2.docx")
document_in_forms = Document(in_forms_file_path)
document_out_forms = Document(out_forms_file_path)
##入库单
# 读取第一个表格
table = document_in_forms.tables[0]
SetDetail(table,lists)
SetTime(table)
SetCompanyName(table,company_name)
SetNum(table,lists)
##出库单
table = document_out_forms.tables[0]
SetDetail(table,lists)
SetTime(table)
SetNum(table,lists)
# 保存文档
in_pre="入库单-"
document_in_forms.save(in_pre+name+".docx")
out_pre="出库单-"
document_out_forms.save(out_pre+name+".docx")
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/DylanMingan/bills_assistant.git
git@gitee.com:DylanMingan/bills_assistant.git
DylanMingan
bills_assistant
bills_assistant
master

搜索帮助