前面讲了很多关于xlwings的基本操作,将这些操作组合起来,灵活贯通,才是算我们使用这个库到位了。下面从网上找一些数据来制作。
选取一个表格
从搜索结果里随机取得一张表格类型的图片。
请先思考下这个图片该如何实现
分析结构
简单分析,从上到下的看,这格表格主要分为两格部分,标题区域和数据区域。
标题区域每一行都不一样,数据区域有重复的行。
根据图片显示,可以设置表格的形状为8列14行。数据区域限制为Range((1,1),(14,8))
绘制表头
先将前三行合并
ws.range((1, 1), (1, 8)).merge()
ws.range((2, 1), (2, 8)).merge()
ws.range((3, 1), (3, 8)).merge()
设置对齐方式
垂直居中是默认的,所以不需要额外设置
第一行水平居中,第二行靠右,第三行靠左
ws.range((1, 1), (1, 8)).api.HorizontalAlignment = -4108
ws.range((2, 1), (2, 8)).api.HorizontalAlignment = -4152
ws.range((3, 1), (3, 8)).api.HorizontalAlignment = -4131
填入文字
将图片上的文字填入对应的单元格区域
ws.range((1, 1), (1, 8)).value = ' 出库单 '**
ws.range((2, 1), (2, 8)).value = '_____ 年 ___ 月 ___ 日 '
ws.range((3, 1), (3, 8)).value = ' 主管: 仓库: 领料人: '
设置字型
给第一行标题列加粗和增大字号
ws.range((1, 1), (1, 8)).api.Font.Bold = True
ws.range((1, 1), (1, 8)).api.Font.Size = 18
设置背景色
通过网上的软件,可以读取原图中的颜色,就可以设置相关的颜色
ws.range((1, 1), (1, 8)).color = '#fed966'**
**ws.range((2, 1), (2, 8)).color = '#fed966'
目前的显示如下
绘制数据区域
数据区域首尾行有区别,其他都一样,金额列有个短线,设置首尾行文字及样式及金额列文字如下。
ws.range((4, 1), (14, 8)).api.HorizontalAlignment = -4108
ws.range((4, 1), (4, 8)).value = [ ' 出库时间 ' , ' 物料名称 ' , ' 型号 ' , ' 单位 ' , ' 数量 ' , ' 单价 ' , ' 金额 ' , ' 用途或原因 ' ]
ws.range((14, 1), (14, 2)).merge()
ws.range((14, 1), (14, 2)).value = ' 合计 '**
ws.range((14, 3), (14, 6)).merge()
ws.range((14, 3), (14, 6)).value = ' 零元整 '
ws.range((5, 7), (14, 7)).value = ' - '
ws.range((4, 1), (4, 8)).color = '#fed966'
**ws.range((14, 1), (14, 8)).color = '#fed966'
当前效果如:
设置边框
数据区域是全边框,大表格是粗边框
数据区域设置上边框和内部水平与垂直边框,不需要重复设置下底和左右两边。
ws.range((4, 1), (14, 8)).api.Borders(8).LineStyle = 1
ws.range((4, 1), (14, 8)).api.Borders(11).LineStyle = 1
ws.range((4, 1), (14, 8)).api.Borders(12).LineStyle = 1
全区域设置粗框线的四个边界
ws.range((1, 1), (14, 8)).api.Borders(7).LineStyle = 1
ws.range((1, 1), (14, 8)).api.Borders(8).LineStyle = 1
ws.range((1, 1), (14, 8)).api.Borders(9).LineStyle = 1
ws.range((1, 1), (14, 8)).api.Borders(10).LineStyle = 1
ws.range((1, 1), (14, 8)).api.Borders(7).Weight = 4
ws.range((1, 1), (14, 8)).api.Borders(8).Weight = 4
ws.range((1, 1), (14, 8)).api.Borders(9).Weight = 4
ws.range((1, 1), (14, 8)).api.Borders(10).Weight = 4
调整列宽和行高
行高几乎是一致的,设为32
ws.range((1, 1), (14, 8)).row_height = 32
列宽前6格设置为9,后两个格子分别设为11,15
ws.range((1, 1), (14, 8)).row_height = 32
ws.range((1, 1), (1, 6)).column_width = 9
ws.range((1, 7)).column_width = 11
ws.range((1, 8)).column_width = 15
导出后发现离一张A4纸差的还挺远的。你们有打印机的可以直接设置纸张大小和查看打印预览,我没有只好先生产PDF再看。
重新增加行高和列宽,大致在50左右可以充满一个页面,再稍调整主管行的空格,使其对其。
一模一样肯定还要接着调整,但是基本效果已经达到了。