大家好,我是刀哥。如果你是一家集团公司的财务人员,合并报表由你来做,或者你是这家集团公司外聘的独立审计师,需要你定期编制合并底稿、出具审计报告,而集团公司有多家分子公司,可能十几家,甚至几十家上百家。在做合并报表时,需要将每家分子公司原始财务报表(或称未审报表)数据过入到合并底稿表格中,然后再编制调整分录,此时如果手工一家一家数据搬运,无数次Ctrl+c和Ctrl+v,会觉得特别无聊,也非常累人,估计连续搬运还不到5家,手就开始抽筋了。加上如果每月都要做的话,那光就重复搬运未审数这一项任务,就足够费时够折磨人的,所以这次刀哥就拿自己工作中的实例,用代码来解决这个问题。

1.

目标任务

刀哥要将2020年8月16家分子公司的财务报表(资产负债表和利润表)数据,过入到2020年8月的合并底稿表格中。

▲ 各家原始财务报表及待填入的合并底稿表格,已作脱敏处理

2.

解决过程

①获取每家公司原始财务报表的文件路径并保存

如上图,刀哥已将这16家分子公司的财务报表都放在了同一文件夹下,文件夹名称为“8月报表”。如果还有更多的分子公司,请全部放在同一文件夹下,尽管放!使劲放!

获取每家财务报表文件路径的代码如下。

 1#把所有原始财务报表放在同一文件夹下,将其文件路径提取出来并保存 2def get_file(folder_path):  #获取同一文件夹下所有财务报表各自的文件路径 3    dir_file = os.listdir(folder_path) 4    print(type(dir_file))   5    for path in dir_file: 6        if path[-4:] == 'xlsx' or path[-3:] == 'xls': 7            whole_path = r'd:\F:学习\python\读写财务报表\8月报表\{}'.format(path) 8            dir_xls.append(whole_path) 9    return dir_xls1011dir_xls = []12folder_path = r'd:\F:学习\python\读写财务报表\8月报表' #此为文件夹路径13dir_xls = get_file(folder_path)14print(dir_xls)

②打开已加密的合并底稿表格。

1#打开要写入的合并底稿表格,因为是加密文档,用密码打开2xlApp = win32.Dispatch('Excel.Application')3write_filepath = r'd:\F:学习\python\读写财务报表\某超NB集团公司 Consolidation-2020-IFRS.xlsx'  #要写入的合并底稿表格的文件路径4password = 'Hope for a peace world' #打开密码5xlApp.Visible = True6xlwb = xlApp.Workbooks.Open(write_filepath,False,True,None,Password=password)

【学习资料&学习社群】

关注本公众号回复关键词即可

免费自领excel、python等办公软件学习教程

以及加入如下学习社群

财会学习群、注会考试群

英语学习群、书法交流群

群内有海量学习考试资料,在线交流答疑解惑

还会不定期发送最新全国会职位招聘信息」

③读取单家财务报表数并写入合并底稿

我用单元格内容定位进行读取,用单元格地址定位进行写入。

比如,读取资产负债表时,取“项目”列中“货币资金”对应的“期末余额”数,取到之后写入合并底稿对应表格的“E14”单元格中,其他各报表项目均以此类推,代码如下。

 1def read_and_write_datas(read_file_path,target_sheet):  #读取财务报表数据,并写入合并底稿表格 2    data = xlrd.open_workbook(read_file_path) 3    names = data.sheet_names() 4    #print(names) 5    for i in names: 6        if '资产负债表' in i: 7            sheetName1 = i 8        elif '利润表' in i: 9            sheetName2 = i10        else:11            continue12    data1 = pd.read_excel(read_file_path,sheet_name=sheetName1,header=3)13    assets = data1.iloc[:,:4]14    liabilities_and_equity = data1.iloc[:,4:8]15    data2 = pd.read_excel(read_file_path,sheet_name=sheetName2,header=3)1617    #---------------------------18    #资产类项目19    Cash_and_cash_equivalents = assets['期末余额'][assets['项目']=='  货币资金']  #货币资金20    Fair_value_financial_assets_through_PL = assets['期末余额'][assets['项目']=='  交易性金融资产']  #交易性金融资产21    Bills_receivable = assets['期末余额'][assets['项目']=='  应收票据']  #应收票据22    Trade_receviables_others = assets['期末余额'][assets['项目']=='  应收账款']  #应收账款23    Prepayment_to_suppliers = assets['期末余额'][assets['项目']=='  预付款项']  #预付款项24    Other_receivables = assets['期末余额'][assets['项目']=='  其他应收款']  #其他应收款25    Inventory = assets['期末余额'][assets['项目']=='  存货']  #存货26    Deferred_expenses = assets['期末余额'][assets['项目']=='  长期待摊费用']  #待摊费用27    Property_and_equipment = assets['期末余额'][assets['项目']=='  固定资产净额']  #固定资产28    Construction_in_progress = assets['期末余额'][assets['项目']=='  在建工程']  #在建工程29    Intangible_assets = assets['期末余额'][assets['项目']=='  无形资产']  #无形资产3031    #---------------------------32    #负债类和所有者权益类项目,都要加负号33    Bank_loan = -liabilities_and_equity['期末余额.1'][liabilities_and_equity['项目.1']=='  短期借款']  #短期借款34    Notes_payable = -liabilities_and_equity['期末余额.1'][liabilities_and_equity['项目.1']=='  应付票据']  #应付票据35    Accounts_payable = -liabilities_and_equity['期末余额.1'][liabilities_and_equity['项目.1']=='  应付账款']  #应付账款36    Advance_from_customers = -liabilities_and_equity['期末余额.1'][liabilities_and_equity['项目.1']=='  预收款项']  #预收款项37    Salaries_and_welfare = -liabilities_and_equity['期末余额.1'][liabilities_and_equity['项目.1']=='  应付职工薪酬']  #应付职工薪酬38    Income_tax = -liabilities_and_equity['期末余额.1'][liabilities_and_equity['项目.1']=='  应交税费']  #应交税费39    Interest_payable_current = -liabilities_and_equity['期末余额.1'][liabilities_and_equity['项目.1']=='  应付利息']  #应付利息40    Other_payables = -liabilities_and_equity['期末余额.1'][liabilities_and_equity['项目.1']=='  其他应付款']  #其他应付款41    Long_term_loan = -liabilities_and_equity['期末余额.1'][liabilities_and_equity['项目.1']=='  长期借款']  #长期借款42    Long_term_payables = -liabilities_and_equity['期末余额.1'][liabilities_and_equity['项目.1']=='  长期应付款']  #长期应付款43    Reserves = -liabilities_and_equity['期末余额.1'][liabilities_and_equity['项目.1']=='  专项储备']  #专项储备4445    #---------------------------46    #损益类项目,收入类加负号,成本费用类不加负号47    turnover = -data2['本年累计'][data2['项            目']=='         其中:主营业务收入'] #主营业务收入48    Cost_of_Sales = data2['本年累计'][data2['项            目']=='          其中:主营业务成本']  #主营业务成本49    business_tax_and_surcharges = data2['本年累计'][data2['项            目']=='         营业税金及附加']  #营业税金及附加50    Selling_Expenses = data2['本年累计'][data2['项            目']=='         销售费用'] #销售费用51    G_A = data2['本年累计'][data2['项            目']=='         管理费用'] #管理费用52    Finance_Cost = data2['本年累计'][data2['项            目']=='         财务费用'] #财务费用53    Interest_Income = data2['本年累计'][data2['项            目']=='                   利息收入'] #利息收入54    Other_expense = data2['本年累计'][data2['项            目']=='    减:营业外支出'] #营业外支出55    Other_Income = -data2['本年累计'][data2['项            目']=='    加:营业外收入']  #营业外收入56    Realized_Gain_or_Loss_from_Financial_Assets = -data2['本年累计'][data2['项            目']=='        投资收益(损失以“-”号填列)'] #投资收益57    Income_Taxes = data2['本年累计'][data2['项            目']=='    减:所得税费用'] #所得税费用5859#----------------60#写入已打开的合并底稿表格61    ws = xlwb.Worksheets(target_sheet) #实现表格一一对应关系62    ws.Range('E14').value = float(Cash_and_cash_equivalents)63    ws.Range('E16').value = float(Fair_value_financial_assets_through_PL)64    ws.Range('E17').value = float(Trade_receviables_others)65    ws.Range('E19').value = float(Bills_receivable)66    ws.Range('E20').value = float(Other_receivables)67    ws.Range('E22').value = float(Inventory)68    ws.Range('E23').value = float(Prepayment_to_suppliers)69    ws.Range('E24').value = float(Deferred_expenses)70    ws.Range('E40').value = float(Property_and_equipment)71    ws.Range('E44').value = float(Construction_in_progress)72    ws.Range('E52').value = float(Intangible_assets)73    ws.Range('E67').value = float(Bank_loan)74    ws.Range('E68').value = float(Notes_payable)75    ws.Range('E69').value = float(Accounts_payable)76    ws.Range('E70').value = float(Advance_from_customers)77    ws.Range('E71').value = float(Salaries_and_welfare)78    ws.Range('E73').value = float(Income_tax)79    ws.Range('E77').value = float(Interest_payable_current)80    ws.Range('E74').value = float(Other_payables)81    ws.Range('E90').value = float(Long_term_loan)82    ws.Range('E92').value = float(Long_term_payables)83    ws.Range('E101').value = float(Reserves)84    ws.Range('E131').value = float(turnover)85    ws.Range('E133').value = float(Cost_of_Sales)+float(business_tax_and_surcharges)86    ws.Range('E139').value = float(Selling_Expenses)87    ws.Range('E141').value = float(G_A)88    ws.Range('E143').value = float(Finance_Cost)-float(Interest_Income)89    ws.Range('E145').value = float(Interest_Income)90    ws.Range('E147').value = float(Other_expense)+float(Other_Income)91    ws.Range('E157').value = float(Realized_Gain_or_Loss_from_Financial_Assets)92    ws.Range('E164').value = float(Income_Taxes)

④建立合并底稿与各单家的一一对应关系,实现多报表批量读写

因为要将各单家公司原始财务报表数据过入到合并底稿中对应公司名的表格中去,故需建立一一对应关系,防止数据跑错表格。

且与①中保持一致,有多少家就放多少家,尽管放!使劲放!代码如下。

 1#建立匹配对应关系,即每一张未审报表数据读取出来后,要写入到合并底稿中的哪个表格中去,指明去处,别跑错地方了 2match_dict = { 3    'P公司':'CX', 4    'A公司':'BF', 5    'B公司':'FY', 6    'C公司':'DY', 7    'D公司':'BP', 8    'E公司':'DT', 9    'F公司':'JL',10    'G公司':'LJ',11    'H公司':'PX',12    'I公司':'PXF',13    'J公司':'MA',14    'K公司':'XS',15    'L公司':'XP',16    'M公司':'XY',17    'N公司':'GC',18    'O公司':'YF'19    }2021#读写过程22start_time = time.time()23print('刀哥,程序开始读写工作!')24for i in range(len(dir_xls)):25    print('正在读写第{}张表:{}'.format(i+1,dir_xls[i]))26    read_file_path = dir_xls[i]27    for key,value in match_dict.items():28        if key in read_file_path:29            target_sheet = value30            read_and_write_datas(read_file_path,target_sheet)31    print('第{}张表读写完毕!'.format(i+1))32end_time = time.time()33total_time = end_time-start_time34print('所有财务报表全部读写完毕!共用时{:.1f}秒'.format(total_time))

3.

目标实现

经过上述一番折腾,运行代码终端输出如下结果。

 1刀哥,程序开始读写工作! 2正在读写第1张表:d:\F:学习\python\读写财务报表\8月报表\财务报表(2020-08)-P公司.xlsx 3第1张表读写完毕! 4正在读写第2张表:d:\F:学习\python\读写财务报表\8月报表\财务报表(2020-08)-A公司.xlsx 5第2张表读写完毕! 6...... 7正在读写第15张表:d:\F:学习\python\读写财务报表\8月报表\财务报表(2020年-08)-N公司.xlsx 8第15张表读写完毕! 9正在读写第16张表:d:\F:学习\python\读写财务报表\8月报表\财务报表(2020年-08)-O公司.xlsx10第16张表读写完毕!11所有财务报表全部读写完毕!共用时78.4秒

于是,经过1分多钟的等待,16张报表数据全部过入到对应的合并底稿表格中,并已保存好乖乖躺在了我的电脑里,至此,打完收工!

最后还要说一点的是,通过代码实现对表格格式的统一性要求比较高,需要各公司使用统一格式的报表模板,合并底稿中对应各家的表格也要统一,这样才能准确的读取数据,并准确的写入到指定的地方去。否则,程序容易报错,读写结果也容易出现错位串行。

每家公司报表难免会有自己的特殊性,难免用代码写入后还有报表不平的情况,遇到这样的情况,手动打开表格检查一下修改一下就好,这也比完全靠人工搬运,效率也要高出几十、几百倍,并且单家报表数量越多,则越能体现出它的优势。

- END -

一个会写代码的注册会计师,

请关注刀哥,看用代码能把财会玩出什么新花样!

有问题欢迎来交流,如果你喜欢刀哥的文章,请分享转发

也请为刀哥点个在看,点击右上角设为星标,更多精彩内容不错过。


我对你心跳不止,你也关注我一下呗

本文部分内容来自网络,如有侵权请联系删除。

  • 高科技手段助力打击财务造假犯罪!6年离奇失踪四次!“扇贝跑路事件”终迎大结局!

  • 公司借款,“逼疯”财务,借款费用到底怎么做账?

  • 硬核!!继北京考区取消CPA考试后,这个地区宣布不取消

  • 芯片企业长期待摊费用的核算和账务处理实例

  • 最新官宣 | 取消2020年北京地区注册会计师考试

点击领取会计类考试网校资料支持刀哥,点个【在看】

xlwings 合并单元格 读取_将16家公司财务报表数据过入合并底稿表格,我只用了1分钟...相关推荐

  1. easyexcel读取合并单元格内容_一周一个小技巧 | excel不会核对内容?不会填充合并单元格?7个实用的EXCEL技巧,一起来看看吧...

    上方蓝色字,获取更多就业信息~ 1 两列姓名核对  如果要核对表二中的姓名在表一中有没有出现,一个公式马上搞定.=IF(COUNTIF(A:A,C2),"是","否&qu ...

  2. Excel合并单元格读取

    文件: 输出: 南京_区1_A101_192.168.1.5_ 南京_区1_A102_192.168.1.6_ 南京_区2_A101_192.168.1.7_ 南京_区2_A201_192.168.1 ...

  3. Execl XSSFSheet 合并单元格读取

    toSheet.SetColumnWidth(i, fromSheet.GetColumnWidth(i));//列宽 //读取合并单元格         public static void mer ...

  4. java poi excel合并单元格 相同的列以及在有父级约束条件下合并二级列

    import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.util.CellRangeAddress;public clas ...

  5. xlwings 合并单元格 读取_xlwings,让excel飞起来

    excel已经成为必不可少的数据处理软件,几乎天天在用.python有很多支持操作excel的第三方库,xlwings是其中一个. 关于xlwings xlwings开源免费,能够非常方便的读写Exc ...

  6. easyui datagrid不是相邻的能合并单元格吗_万能的Ctrl+E快捷键,学会能一键批量解决Excel中90%的问题!...

    Hello,各位叨友们好呀!我是叨叨君~ Excel中你们最常用的快捷键是啥?Ctrl+C复制.Ctrl+V粘贴?其实除了这两大快捷键外,还有一个少有人用的快捷键「Ctrl+E」,它被大神们称为表格中 ...

  7. easyui datagrid不是相邻的能合并单元格吗_介绍一种划分账龄的方法,要不了半个小时就能完成...

    有小朋友叫我讲讲往来款,那我就先讲讲怎么划分账龄吧.有些小朋友觉得划分账龄是一件非常耗时的事. 我觉得吧,没那么复杂,简单得很,只要你学会了这种方法. 以应收账款为例. 如上图,在J9单元格写下这个公 ...

  8. python合并单元格 索引_如何在matplotlib选项卡中合并单元格

    我用matplotlib创建了一个表,我想合并一些单元格.索引中具有相同字符串的单元格将合并为一个单元格.在 问题被标记为重复,但链接无法回答我的问题#tbl_handler is an instan ...

  9. excel单元格斜线_怎么在excel中画斜线?怎么在excel表格中画斜线?

    在excel表格中画斜线的技巧教程: 1.在Excel中打开一个空白工作簿. 2.您可以在任何大小的单元格中执行此操作,但是如果先将其增大则更容易理解.为此,我们只需单击并按住第1行和第2行之间的线, ...

最新文章

  1. k8s pod的创建流程图示
  2. 【Android 修炼手册】Gradle 篇 -- Android Gradle Plugin 主要 Task 分析
  3. mailbox 编程_往死里写——从站mailbox实现 | 学步园
  4. 每天阅读一个 npm 模块(4)- throttle-debounce
  5. Spring Boot 声明式事务 @Transactional 的使用
  6. Xformode的坑
  7. 手机软件项目管理—项目组内部的沟通
  8. 苹果证实将弃用Windows版QuickTime
  9. etymon word flower bee apiary forget out~1
  10. JS浏览器兼容性问题
  11. 程序开发——开源软件库
  12. win7下面用超级终端不能输入命令原因
  13. linux系统网桥管理工具brctl 安装及使用
  14. ftp客户端安装,六款可以安装的ftp客户端
  15. 网站如何做域名转移?闲置域名要及时处理
  16. projection theorem
  17. 从小白到大咖——十分钟学会JavaScript操作浏览器内置对象
  18. 前端实现五子棋小游戏2(AI实现人机对战)
  19. “神一般存在”的印度理工学院到底有多牛?
  20. 【排序】八大排序算法简介及它们各自的特点总结

热门文章

  1. mysql 插入加锁_MySQL的死锁系列- 锁的类型以及加锁原理
  2. rockycapture_RockyCapture航线规划软件介绍文档
  3. org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].Standard
  4. matlab通信工具comm,matlab无线通信例程及simulink仿真
  5. hibernate clob mysql_Hibernate操作Clob类型数据
  6. 疯狂的html css,疯狂Html+CSS+JS 中JS总结
  7. java thread 输出结果_大神来看看这段程序输出结果是什么?
  8. 单片机和微型计算机硬件组成的异同,嵌入式和单片机的区别是什么?两者有什么联系...
  9. 定义域是取交集吗_高中数学;函数定义域秒解技巧(学好函数突破数学)
  10. (万里开源)greatdb mysql 8.0以上版本创建用户并授权远程连接