zoukankan      html  css  js  c++  java
  • Python实现Excel转换工具小结

    经历过的打表工具从c++、C#,再到Python,算下来还是Python方便些。一天即可上手开发,非常适合快速迭代中的各种小工具开发。 Python开源的第三方库很多,涉及excel方面的也有好几个xlrdxlwtxlutils 等等。

    1. xlrdxlwt

    xlrd 主要实现excel文件的读操作,xlwt主要负责写操作。xlutils 是将二者融合在一起。

    安装

    现在之后可以通过源码的形式进行安装,也可以通过exe的形式安装。对于只用报表格小工具的同学,可以通过批处理进行。
    mark
    批处理代码:

    msiexec /package python-2.7.10.64bit.msi /quiet 
    cd .xlrd-0.9.4
    c:Python27python.exe setup.py install
    cd ...xlwt-1.0.0
    c:Python27python.exe setup.py install
    cd ...protobuf-2.6.1python
    c:Python27python.exe setup.py install
    pause
    

    2. 操作实现

    表格构成

    mark

    1. Workbook :一个完整的excel表格
    2. Worksheet : 表格中一个sheet
    3. Cell : 表中一个单元格
    读操作

    流程:读取book,获取sheet,然后根据col ow获得对应的数值,具体的API的可以参考:
    http://xlrd.readthedocs.io/en/latest/api.html
    实例(无容错处理):

    #打开profiles.xls
    self.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可以参
    考:http://xlwt.readthedocs.io/en/latest/api.html
    案例:

    #创建book
    book = xlwt.Workbook()
    #添加sheet
    sheet = book.add_sheet(sheet_name)
    #写数据
    sheet.write(0, 0, label = 'Row 0, Column 0 Value')
    #保存book
    book.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 True
    
    class 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尝试一下各种小工具了。

    参考:http://www.python-excel.org/

  • 相关阅读:
    POJ 3295 spfa判断是否存在负权回路
    hdu 1385 最短路+输出字典序好题
    hdu 1143 递归
    hdu 1598 并查集+贪心其实就是kruskal的思想
    快速排序
    HDU:Fighting for HDU
    HDU:Saving HDU
    HDU:悼念512汶川大地震遇难同胞——老人是真饿了
    每日一题统计指定的字符串
    每日一题2求一个文件里面指定字符出现的次数
  • 原文地址:https://www.cnblogs.com/zsb517/p/6511206.html
Copyright © 2011-2022 走看看