代码生成多份报告

因为需要向税务局提交多份格式相同但内容有差别的报告,正好就以此作为项目练习VBA和Python代码。而且考虑到后续数据可能需要更新,如果到时候再依次打开各个文件并重新填写数据,肯定会花很多时间。编写代码其实就是为了利用其可以复用的特点,方便今后的维护。(当然,向税局提交报告后,今天写的代码应该就没有用了。)

完整代码:
github:zyeah007/excelToDoc

要完成的目标:
(1)根据信息表模板,创建20张新表,每张表以公司名字命名
(2)从包含有数据的工作表中获取单元格数据,并填写到对应公司的工作信息表中
(3)根据每家公司的信息表数据,生成对应的word版报告。报告表格中的数据与工作表对应单元格数据一致。

一、用VBA生成多张工作表

由于需要在Excel内部生成多张相同格式的表格,所以直接使用VBA更方便。
在VBA中复制多张工作表的代码为:

For i = 1 To 20  #共循环20次,创建20家参股公司信息表
    Sheets("信息表模板").Copy after:=Sheets(Sheets.Count)
    Sheets(Sheets.Count).name = infoSheet.Cells(2 + i, 2).Value #infoSheet为包含公司信息的工作表
Next

原有的信息表模板并不包含一个标题用于标明公司的名称,故需在每个生成的工作表中插入新行并输入公司的名称。
涉及到的操作包括:
(1)插入新行
(2)合并单元格
(3)输入公司名称(同工作表名)

for i =3 to Sheets.Count
    maxCol = Sheets(i).columns.count  # 注意工作表的索引表示方法Sheets(i)
    Sheets(i).cells(1,1).EntireRow.Insert  #插入行
    Sheets(i).activate  # 因后面有对单元格select动作,所以需要先激活工作表,否则会报错
    Sheets(i).Range(Cells(1,2), Cells(1,maxCol)).Select
    With Selection
        .merge  # 合并单元格
        .HorizontalAlignment = xlCenter  # 水平居中
        .VerticalAlignment = xlCenter  # 垂直居中
        .Font.Bold = True  # 单元格字体加粗
    End With
    .Cells(1,1).value = Sheets(i).name
Next

二、抓取数据并填充表格

这部分只是机械的编写给目标单元格赋值的表达式。而且,因为源单元格和目标单元格同处于excel内部,所以不用担心数据类型的问题。(这在后面编写python代码时确实让人头疼!)
唯一可以说的是对单元格的数据格式进行设置。这里需要设置某些单元格数据为百分比格式。

Sheets(corpName).cells(8, "D").numberformatlocal  = "0.00%"

三、生成word版报告

这里其实有一个前提,即所谓的word版报告其实就是之前Excel信息表的word版。(更准确的讲,我是从word文档中复制了整个表格作为Excel文件的信息表模板的。)
首先,复制多个word文档,每个文档的文件名为公司名:

import shutil
shutil.copy(source, output)

读写Excel文件和word文件,分别要用到Python的openpyxl库和docx库。

import openpyxl
from docx import Document

打开一个公司的word文档,同时打开Excel文件,并根据该公司名称加载对应的Excel工作表

wb = openpyxl.load_workbook(workbook_path)
for file in os.listdir(file_path):
    temp = file[14:]
    corpName = temp.split('.')[0]  # 获取公司名称
    ws = wb[corpName]
    doc = Document(os.path.join(file_path,file))
    table = doc.tables[0]  # 该word文档中只有一个表格

接下来又是一轮机械的编写赋值表达式。不过,与用VBA编写不同的是,这里是用Python读取Excel中的数据并以Python可接受的数据形式写入doc对象中,所以需要考虑数据类型的一致性。我在写代码的时候就遇到两个问题:

(1)从Excel单元格读取到的数据为空,需要转换为字符
(2)浮点数转换为百分比的输出格式

对于第一个问题,在赋值表达式中加一个判断语句

table.cell(1,9).text = infoSheet['K4'].value if infoSheet['K4'].value else ''

解释:如果某个单元格为空,则Python读取的结果为NoneType,它不能赋值给其他变量。所以加入该判断语句后,可以使得结果为一个空字符串。
对于第二个问题,采用格式输出法:

table.cell(5,2).text = '%.2f%%'%(infoSheet['D8'].value*100)

至此,基本完成了表格的生成、获取并填写数据、以及生成相应报告的任务。

四、总结

今天遇到并解决的问题包括:
1、在VBA中复制工作表,采用先复制后重命名的方式
2、在工作表中插入新行,合并单元格,并设置单元格格式
3、VBA中使用Select动作,需要先activate目标工作表,否则会报错
4、Python的docx模块中的Document对象,用于加载word文件。Document.tables属性,获取word文件中的表格。
5、Python的NoneType返回值不能用于赋值给变量
6、int和float型数据在转换为字符串用于输出时,可以使用字符串格式输出法,比如:'%.2f%%'%(float*100)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容

  • 自从2014年开通[完美Excel]微信公众号以来,坚持分享已经学习到的Excel和VBA知识和心得,目前已分享文...
    完美Excel阅读 8,302评论 6 69
  • 1.1 VBA是什么 直到90年代早期,使应用程序自动化还是充满挑战性的领域.对每个需要自动化的应用程序,人们不得...
    浮浮尘尘阅读 21,735评论 6 49
  • 要你命1000:数据管理 ////////////////////////////////////////////...
    ZZS_简阅读 1,456评论 0 5
  • 腾冲的美,不只存在于断壁残垣留下的古老气息,也不只局限于它那世间少有的银杏童话。腾冲,一个古老淳朴的地方,一个身在...
    不爱吃鱼的大脸猫阅读 308评论 0 4
  • 秋枫片片红似火, 黄榔几棵赤为多。 交相辉映远山中, 丹心丛丛照故国。 凄风冷雨几番过, 冰露寒霜又如何。 夕阳晚...
    云逸1108阅读 112评论 0 1