经历过的打表工具从c++、C#,再到Python,算下来还是Python方便些。一天即可上手开发,非常适合快速迭代中的各种小工具开发。 Python开源的第三方库很多,涉及excel方面的也有好几个、、 等等。
1. xlrd\xlwt
主要实现excel文件的读操作,主要负责写操作。 是将二者融合在一起。
安装
现在之后可以通过源码的形式进行安装,也可以通过exe的形式安装。对于只用报表格小工具的同学,可以通过批处理进行。
批处理代码:msiexec /package python-2.7.10.64bit.msi /quiet cd .\xlrd-0.9.4\c:\Python27\python.exe setup.py installcd ..\.\xlwt-1.0.0\c:\Python27\python.exe setup.py installcd ..\.\protobuf-2.6.1\python\c:\Python27\python.exe setup.py installpause
2. 操作实现
表格构成
- Workbook :一个完整的excel表格
- Worksheet : 表格中一个sheet
- Cell : 表中一个单元格
读操作
流程:读取book,获取sheet,然后根据col\row获得对应的数值,具体的API的可以参考:
实例(无容错处理):#打开profiles.xlsself.book = xlrd.open_workbook(from_this_dir('profiles.xls'), formatting_info=True)#通过名字获得self.sheet = self.book.sheet_by_name('PROFILEDEF')#通过索引获得self.sheet = data.sheets()[0] self.sheet = data.sheet_by_index(0) #通过索引顺序获取#获取整行和整列的值(数组)self.sheet.row_values(i)self.sheet.col_values(i)#获取元素cell = self.sheet.cell(1, 1)
写操作
流程:创建一个book,添加一个sheet并向对应Cell中添加数据。具体Api可以参
考: 案例:#创建bookbook = xlwt.Workbook()#添加sheetsheet = book.add_sheet(sheet_name)#写数据sheet.write(0, 0, label = 'Row 0, Column 0 Value')#保存bookbook.save(file_name)
3.实现表格合并工具
#加载表格class SheetLoader: # Excel 表加载类,用于加载Excel表 def __init__(self): # 构造函数 self.file_path = '' self.sheet_name = '' self.workbook = None self.sheet = None self.num_rows = 0 self.num_cols = 0 def load(self, file_path, sheet_name): # 解析Excel表格,成功返回True,否则返回False self.file_path = file_path self.sheet_name = sheet_name # 打开Excel文件 try: self.workbook = xlrd.open_workbook(self.file_path) except BaseException, e: print 'Error: Load excel file failed', self.file_path sys.exit(-1) # 打开Excel表格 try: self.sheet = self.workbook.sheet_by_name(self.sheet_name) except BaseException, e: print 'Load excel sheet failed', self.sheet_name sys.exit(-1) # 行数和列数 self.num_rows = len(self.sheet.col_values(0)) self.num_cols = len(self.sheet.row_values(0)) print 'Load', self.file_path, self.sheet_name, self.num_rows, self.num_cols return Trueclass SheetCombiner: ''' 表格合并工具 用于将多个表格合并成一个表格,所有表格必须有相同的行数 ''' def __init__(self): # 构造函数 self.loaders = [] self.num_cols = 0 def add_sheet(self, file_path, sheet_name): ''' 添加表格 :param file_path: Excel文件路径 :param sheet_name: Excel表格名称 :return: ''' loader = SheetLoader() if not loader.load(file_path, sheet_name): print 'Error: Load excel file failed', self.file_path sys.exit(-1) if self.num_cols == 0: self.num_cols = loader.get_num_cols() else: # 检查表的列数是否一致 if self.num_cols != loader.get_num_cols(): print 'Error: not same cols', loader.get_sheet_name(), self.num_cols, loader.get_num_cols() sys.exit(-1) # 检查表的表头是否一致 first = self.loaders[0] for r in range(3): for c in range(self.num_cols): if loader.cell_value(r, c) != first.cell_value(r, c): print 'Error: not same header', loader.get_sheet_name(), r, c sys.exit(-1) self.loaders.append(loader) def combine(self, file_path, sheet_name): ''' 合并表格 :param file_path: 合并的Excel文件名称 :param sheet_name: 合并的Excel表格名称 :return: ''' if len(self.loaders) == 0: return workbook = xlwt.Workbook() sheet = workbook.add_sheet(sheet_name) loader = self.loaders[0] for row in range(4): for col in range(self.num_cols): sheet.write(row, col, loader.cell_value(row, col)) row = 4 for loader in self.loaders: for r in range(4, loader.get_num_rows()): for c in range(self.num_cols): sheet.write(row, c, loader.cell_value(r, c)) row += 1 workbook.save(file_path)
实现表格合并:
combiner = SheetCombiner()combiner.add_sheet('../dev/data_xls/achievement_data.xls', 'ACHIEVEMENT_DATA')combiner.add_sheet('../dev/data_xls/task_data.xls', 'TASK_DATA')combiner.combine('./output.xls', 'OUTPUT')
4. 结论
相对于lua这种脚本语言,python的功能确实强悍很多,尤其是众多的第三方库。以后可以愉快的考虑用python尝试一下各种小工具了。
参考: