经验分享:使用Python3处理excel-案例1
简介
本博文案例场景为使用python3通过调用xlrd、xlwt模块编写脚本,实现对excel进行处理,其中涉及行列转换、合并单元格。
背景
- 导出后的格式
- 期待的格式
思路
那么该如何将导出后源文件的格式调整为期待的格式呢?我的思路是:
- 将源文件中的数据逐行写入到列表Ret中,如下
[[系统名称, 日志路径, IP], [ZBX, /home/zbx/logs/*.log, 192.168.1.10], [ZBX, /home/zbx/logs/*.log, 192.168.1.11], [ELK, /home/elk/logs/*.log, 192.168.1.20], [ELK, /home/elk/logs/*.log, 192.168.1.21], [ELK, /home/elk/logs/*.log, 192.168.1.22], [ELK, /home/elk/logs/*.log, 192.168.1.23], [ELK, /home/elk/logs/*.log, 192.168.1.24], [ELK, /home/elk/logs/*.log, 192.168.1.25], [Nginx, /home/nginx/logs/*.log, 192.168.1.30], [Nginx, /home/nginx/logs/*.log, 192.168.1.31], [Nginx, /home/nginx/logs/*.log, 192.168.1.32], [Nginx, /home/nginx/logs/*.log, 192.168.1.33], [Tomcat, /home/tomcat/logs/*.log, 192.168.1.40], [Tomcat, /home/tomcat/logs/*.log, 192.168.1.41], [Tomcat, /home/tomcat/logs/*.log, 192.168.1.42], [Tomcat, /home/tomcat/logs/*.log, 192.168.1.43], [Tomcat, /home/tomcat/logs/*.log, 192.168.1.44], [Tomcat, /home/tomcat/logs/*.log, 192.168.1.45], [Tomcat, /home/tomcat/logs/*.log, 192.168.1.46], [Tomcat, /home/tomcat/logs/*.log, 192.168.1.47]]
- 将列表中Ret相同系统名称的首行元素的索引追加到列表Idx,Idx初始化时为[0],追加后如下
[0, 1, 3, 9, 13, 21]
- 通过列表Idx中的值,可以推断每列需要合并单元格的起始位置和结束为止,然后合并
- 将IP以此写在新文件的第四列中
代码
# -*- coding:utf-8 -*- import os import sys import xlrd,xlwt work_dir = os.path.dirname(os.path.abspath(sys.argv[0])) r_xls = os.path.join(work_dir,sys.argv[1]) d_xls = os.path.join(work_dir,result.xls) def DataByLine(Line,ret,idx): # 读取xls数据,按照需求生成列表 # idx是列表,通过源文件中系统的IP个数推断出在新文件中这个系统的末行数据的行索引 # ret是列表,用于存放xls中的数据 t = idx[-1] while in Line: Line.remove() # 从源文件中逐行读取的数据是列表格式,其中会存在空值,需要将空值删除 for i in range(2,len(Line)): # 遍历IP,组成有系统、路径、ip元素的列表 ret.append([Line[0],Line[1],Line[i]]) t += 1 idx.append(t) return ret,idx # 将列表中的数据,依次写入新的xls def WtData(workbook,table,ret,idx,xls): for i,j in enumerate(idx): if (i+1) < (len(idx)): # 避免idx中最后一个元素参与下面的,最后一个元素代表的是整个表格数据的末行索引 table.write_merge(j,idx[i+1]-1,0,0,ret[j][0]) # 对第一列(相同系统)同样的系统进行合并单元格 table.write_merge(j,idx[i+1]-1,1,1,ret[j][1]) # 对第二列(相同路径)同样的系统进行合并单元格 for k in range(idx[i+1]-idx[i]): table.write(idx[i]+k,2,ret[j+k][2]) # 将按行显示的IP,在第三列转置后,按列存储 workbook.save(xls) def main(): workbook_r = xlrd.open_workbook(r_xls) table_r = workbook_r.sheet_by_index(0) workbook_d = xlwt.Workbook(encoding = utf-8) table_d = workbook_d.add_sheet(result) Nrow = table_r.nrows Ret = [] Idx = [0] for ln in range(Nrow): Ret,Idx = DataByLine(table_r.row_values(ln),Ret,Idx) WtData(workbook_d,table_d,Ret,Idx,d_xls) if __name__ == __main__: main()
验证
[root@pyenv xls_format]# /opt/soft/python374/bin/python3 xls_format.py logs.xls
输出文件内容如下: