Python实现Excel转换工具小结

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

1. xlrd\xlwt

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

安装

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

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

2. 操作实现

表格构成

mark

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

流程:读取book,获取sheet,然后根据col\row获得对应的数值,具体的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/

posted @ 2017-03-06 17:56  RubbyZhang  阅读(1462)  评论(0编辑  收藏  举报