Python 使用xlwings库操作excel的简明实践分享之出库单表格操作实践

1,173 阅读3分钟

前面讲了很多关于xlwings的基本操作,将这些操作组合起来,灵活贯通,才是算我们使用这个库到位了。下面从网上找一些数据来制作。

 

选取一个表格

从搜索结果里随机取得一张表格类型的图片。

image.png

  请先思考下这个图片该如何实现


分析结构

简单分析,从上到下的看,这格表格主要分为两格部分,标题区域和数据区域。

标题区域每一行都不一样,数据区域有重复的行。

根据图片显示,可以设置表格的形状为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'

 

目前的显示如下

image.png  

绘制数据区域

数据区域首尾行有区别,其他都一样,金额列有个短线,设置首尾行文字及样式及金额列文字如下。

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'

 

当前效果如:

image.png  

设置边框

数据区域是全边框,大表格是粗边框

数据区域设置上边框和内部水平与垂直边框,不需要重复设置下底和左右两边。

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

image.png

全区域设置粗框线的四个边界

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再看。

image.png

重新增加行高和列宽,大致在50左右可以充满一个页面,再稍调整主管行的空格,使其对其。

一模一样肯定还要接着调整,但是基本效果已经达到了。

 

 

image.png