python操作Excel

# -*- coding: utf-8 -*-
# @Time    : 19-1-11 上午9:33
# @Author  : Felix Wang

import xlrd
from openpyxl import load_workbook
import openpyxl
from openpyxl.drawing.image import Image
from openpyxl.styles import PatternFill, Font


class OperationExcel(object):
    def __init__(self, filename):
        self.filename = filename
        try:
            self.__workbook = xlrd.open_workbook(self.filename)
        except Exception as e:
            self.creatwb(self.filename)
            self.__workbook = xlrd.open_workbook(self.filename)
        self.__wb = load_workbook(self.filename)
        self.ws = self.__wb.active

    def __enter__(self):
        """进入with语句的时候被调用"""
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        """离开with的时候被with调用"""
        self.__wb.save(self.filename)
        self.__wb.close()

    def get_sheet_names(self):
        return self.__wb.sheetnames

    def get_data(self, row=1, col=1, sheet_name=None, flag='0'):
        """
        :param sheet_name: 表名
        :param row: 行位置
        :param col: 列位置
        :param flag:标志,0:表示获取某行某列,1:获取某行,2:获取某列
        :return:返回
        """
        if sheet_name is None:
            sheet_name = self.get_sheet_names()[0]
        sheet = self.__workbook.sheet_by_name(sheet_name)
        # c = sheet.ncols  # 最大列数
        # w = sheet.nrows  # 最大行数
        # print(c, w)
        try:
            if str(flag) == '0':
                return sheet.row_values(row - 1)[col - 1]
            if str(flag) == '1':
                return sheet.row_values(row - 1)
            if str(flag) == '2':
                return sheet.col_values(col - 1)
        except Exception as e:
            print('该位置没有数据', e)

    def get_all_data(self, sheet_name=None):
        if sheet_name is None:
            sheet_name = self.get_sheet_names()[0]
        sheet = self.__workbook.sheet_by_name(sheet_name)
        data = []
        for i in range(sheet.nrows):
            data.append(sheet.row_values(i))
        return data

    def get_max_row_and_col(self):
        return {'max_rows': self.ws.max_row, 'max_cols': self.ws.max_column}

    # 新建excel
    def creatwb(self, filename):
        wb = openpyxl.Workbook()
        wb.save(filename=filename)
        print("新建Excel:" + filename + "成功")

    # 写入数据
    def write_data(self, col, row, data):
        self.ws.cell(row, col, data)

    def write_all_data(self, data_list, left_offset=0, top_offset=0):
        """
        :param data_list: 列表或者元组[[],[],[]...],里面的每一个表示一行
        :param left_offset: 左边偏移
        :param top_offset: 上边偏移
        :return:
        """
        left_offset = left_offset if str(left_offset).isdigit() and left_offset > 0 else 0
        top_offset = top_offset if str(top_offset).isdigit() and top_offset > 0 else 0
        lens = len(data_list)
        for index, data in enumerate(data_list):
            for i, dd in enumerate(data):
                self.ws.cell(index + top_offset + 1, i + left_offset + 1, dd)
            print(index + 1, lens, data)

    def set_color(self, col, row, color):
        """
        设置单元格颜色
        :param col:
        :param row:
        :param color: 颜色:如 FFFFFF
        :return:
        """
        # 单元格填充颜色
        self.ws.cell(row, col).fill = PatternFill(fill_type='solid', fgColor=color)

    def set_hyperlink(self, col, row, hyperlink):
        """
        设置超链接
        :param col:
        :param row:
        :param hyperlink:超链接地址
        :return:
        """
        self.ws.cell(row, col).hyperlink = hyperlink

    def set_font(self, col, row, font):
        self.ws.cell(row, col).font = font

    # 往Excel中插入图片
    def insert_img(self, img_name, place=None):
        img = Image(img_name)
        if place is None:
            self.ws.add_image(img)
        else:
            self.ws.add_image(img, place)  # 例如'A1'


if __name__ == '__main__':
    with OperationExcel('a.xlsx') as op:
        d = op.get_sheet_names()
        print(d)
        # print(op.get_data('Sheet2', 1, 2, 0))
        # print(op.get_all_data('Sheet1'))
        op.write_data(1, 3, 'test')
        op.write_data(2, 3, 't2est')

        # op.insert_img(r'1234.jpg')
        # op.insert_img(r'1234.jpg', 'D3')
        op.write_all_data([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12, 15]], top_offset=-10, left_offset=15)
        op.set_color(3, 5, 'ff0000')
        op.write_data(3, 5, 'hello')

        font = Font(
            name="宋体",
            size=15,
        )
        op.set_font(3, 5, font)

'''

  ####循环插入字典可以使用这种方法
row_and_col = op.get_max_row_and_col()
max_rows = row_and_col['max_rows']
max_cols = row_and_col['max_cols']
if max_rows == 1 and max_cols == 1:
    print('开始插入Excel标题')
    i = 1
    for key in data.keys():
        op.write_data( i, 1, key)
        op.write_data( i, 2, data[key])
        i += 1
    print('插入Excel标题成功')
if max_rows > 1 or max_cols > 1:
    print('开始插入Excel数据')
    j = 1
    for key in data.keys():
        op.write_data( j, max_rows + 1, data[key])
        j += 1
    print('插入Excel数据成功')
# 循环插入字典时
'''
原文地址:https://www.cnblogs.com/felixwang2/p/9026099.html