Python 操作Excel

  • 1,使用了openpyxl 和 xlrd 、xlwt两种方式操作
  • 2,先生成测试数据
  • 3,从测试数据中读取写入到Excel中
  • 4,再从Excel中把数据读出来显示

测试数据生成代码如下:

import random
import string
def phone_num():
    num_start = ['134', '135', '136', '137', '138', '139', '150', '151', '152', '158', '159', '157', '182', '187', '188',
           '147', '130', '131', '132', '155', '156', '185', '186', '133', '153', '180', '189']
    start = random.choice(num_start)
    end = ''.join(random.sample(string.digits,8))
    res = start+end
    return res

with open("test_excel.txt","w+",encoding="gb2312") as f:
    for i in range(1,101):
        i=str(i)
        f.write("%s\t%s\t%s\t%s\t%s\n" %(i,("张三"+i),phone_num(),("知识点ID"+i),("知识点名称"+i)))

读写Excel的代码如下:

# coding:utf-8

import xlrd
import xlwt
# workbook相关
from openpyxl.workbook import Workbook
# ExcelWriter,封装了很强大的excel写的功能
from openpyxl.writer.excel import ExcelWriter
# 一个eggache的数字转为列字母的方法
from openpyxl.utils import get_column_letter
from openpyxl.reader.excel import load_workbook


class HandleExcel():
    '''Excel相关操作类'''

    def __init__(self):
        self.head_row_labels = [u'学生ID', u'学生姓名', u'联系方式', u'知识点ID', u'知识点名称']

    """
     function:
      读出txt文件中的每一条记录,把它保存在list中
     Param:
      filename: 要读出的文件名
     Return:
      res_list: 返回的记录的list
    """

    def read_from_file(self, filename):
        res_list = []
        file_obj = open(filename, "r")
        for line in file_obj.readlines():
            res_list.append(line)
        file_obj.close()
        return res_list

    """
     function:
      读出*.xlsx中的每一条记录,把它保存在data_dic中返回
     Param:
      excel_name: 要读出的文件名
     Return:
      data_dic: 返回的记录的dict
    """

    def read_excel_with_openpyxl(self, excel_name="testexcel2007.xlsx"):
        # 读取excel2007文件
        wb = load_workbook(filename=excel_name)
        # 显示有多少张表
        print("Worksheet range(s):", wb.get_named_ranges())
        print("Worksheet name(s):", wb.get_sheet_names())
        # 取第一张表
        sheetnames = wb.get_sheet_names()
        ws = wb.get_sheet_by_name(sheetnames[0])
        # 显示表名,表行数,表列数
        print("Work Sheet Titile:", ws.title)
        print("Work Sheet Rows:", ws.max_row)
        print("Work Sheet Cols:", ws.max_column)
        # 获取读入的excel表格的有多少行,有多少列
        row_num = ws.max_row
        col_num = ws.max_column
        print("row_num: ", row_num, " col_num: ", col_num)
        # 建立存储数据的字典
        data_dic = {}
        sign = 1
        # 把数据存到字典中
        for row in ws.rows:
            temp_list = []
            # print("row",row)
            for cell in row:
                print(cell.value, )
                temp_list.append(cell.value)
            print("")
            data_dic[sign] = temp_list
            sign += 1
        print(data_dic)
        return data_dic

    """
     function:
      读出*.xlsx中的每一条记录,把它保存在data_dic中返回
     Param:
      records: 要保存的,一个包含每一条记录的list
      save_excel_name: 保存为的文件名
      head_row_stu_arrive_star:
     Return:
      data_dic: 返回的记录的dict
    """

    def write_to_excel_with_openpyxl(self, records, head_row, save_excel_name="save.xlsx"):
        # 新建一个workbook
        wb = Workbook()
        # 新建一个excelWriter
        # ew = ExcelWriter(workbook=wb)
        # 设置文件输出路径与名称
        dest_filename = save_excel_name
        # 第一个sheet是ws
        ws = wb.worksheets[0]
        # 设置ws的名称
        ws.title = "range names"
        # 写第一行,标题行
        for h_x in range(1, len(head_row) + 1):
            print(h_x)
            h_col = get_column_letter(h_x)
            print(h_col)
            ws.cell(1,h_x).value= '%s' % (head_row[h_x - 1])
        # 写第二行及其以后的那些行
        i = 2
        for record in records:
            record_list = str(record).strip().split("\t")
            for x in range(1, len(record_list) + 1):
                col = get_column_letter(x)
                ws.cell(i,x).value = '%s' % (record_list[x - 1])
            i += 1
        # 写文件
        # ew.save(filename=dest_filename)
        wb.save(filename=dest_filename)
    """
     function:
      测试输出Excel内容
      读出Excel文件
     Param:
      excel_name: 要读出的Excel文件名
     Return:
      无
    """

    def read_excel(self, excel_name):
        workbook = xlrd.open_workbook(excel_name)
        print(workbook.sheet_names())
        # 获取所有sheet
        print(workbook.sheet_names())  # [u'sheet1', u'sheet2']
        sheet2_name = workbook.sheet_names()[0]
        # 根据sheet索引或者名称获取sheet内容
        sheet2 = workbook.sheet_by_index(0)  # sheet索引从0开始
        sheet2 = workbook.sheet_by_name('sheet1')
        # sheet的名称,行数,列数
        print(sheet2.name, sheet2.nrows, sheet2.ncols)
        # 获取整行和整列的值(数组)
        rows = sheet2.row_values(3)  # 获取第四行内容
        cols = sheet2.col_values(2)  # 获取第三列内容
        print(rows)
        print(cols)
        # 获取单元格内容
        print(sheet2.cell(1, 0).value)
        print(sheet2.cell_value(1, 0))
        print(sheet2.row(1)[0].value)
        # 获取单元格内容的数据类型
        print(sheet2.cell(1, 0).ctype)
        # 通过名称获取
        return workbook.sheet_by_name(u'sheet1')

    """
     function:
      设置单元格样式
     Param:
      name: 字体名字
      height: 字体高度
      bold: 是否大写
     Return:
      style: 返回设置好的格式对象
    """

    def set_style(self, name, height, bold=False):
        style = xlwt.XFStyle()  # 初始化样式
        font = xlwt.Font()  # 为样式创建字体
        font.name = name  # 'Times New Roman'
        font.bold = bold
        font.color_index = 4
        font.height = height
        borders = xlwt.Borders()
        borders.left = 6
        borders.right = 6
        borders.top = 6
        borders.bottom = 6
        style.font = font
        style.borders = borders
        return style

    """
     function:
      按照 设置单元格样式 把计算结果由txt转变为Excel存储
     Param:
      dataset:要保存的结果数据,list存储
     Return:
      将结果保存为 excel对象中
    """

    def write_to_excel(self, dataset, head_row, save_excel_name):
        f = xlwt.Workbook()  # 创建工作簿
        # 创建第一个sheet:
        # sheet1
        count = 1
        sheet1 = f.add_sheet(u'sheet1', cell_overwrite_ok=True)  # 创建sheet
        # 首行标题:
        for p in range(len(head_row)):
            sheet1.write(0, p, head_row[p], self.set_style('Times New Roman', 250, True))
        default = self.set_style('Times New Roman', 200, False)  # define style out the loop will work
        for line in dataset:
            row_list = str(line).strip("\n").split("\t")
            for pp in range(len(str(line).strip("\n").split("\t"))):
                sheet1.write(count, pp, row_list[pp], default)
            count += 1
        f.save(save_excel_name)  # 保存文件

    def run_main_save_to_excel_with_openpyxl(self):
        print("测试读写2007及以后的excel文件xlsx,以方便写入文件更多数据")
        print("1. 把txt文件读入到内存中,以list对象存储")
        dataset_list = self.read_from_file("test_excel.txt")
        '''test use openpyxl to handle EXCEL 2007'''
        print("2. 把文件写入到Excel表格中")
        head_row_label = self.head_row_labels
        save_name = "test_openpyxl.xlsx"
        self.write_to_excel_with_openpyxl(dataset_list, head_row_label, save_name)
        print("3. 执行完毕,由txt格式文件保存为Excel文件的任务")

    def run_main_save_to_excel_with_xlwt(self):
        print(" 4. 把txt文件读入到内存中,以list对象存储")
        dataset_list = self.read_from_file("test_excel.txt")
        '''test use xlwt to handle EXCEL 97-2003'''
        print(" 5. 把文件写入到Excel表格中")
        head_row_label = self.head_row_labels
        save_name = "test_xlwt.xls"
        self.write_to_excel(dataset_list, head_row_label, save_name)
        print("6. 执行完毕,由txt格式文件保存为Excel文件的任务")


if __name__ == '__main__':
    print("create handle Excel Object")
    obj_handle_excel = HandleExcel()
    # 分别使用openpyxl和xlwt将数据写入文件
    obj_handle_excel.run_main_save_to_excel_with_openpyxl()
    obj_handle_excel.run_main_save_to_excel_with_xlwt()
    '''测试读出文件,注意openpyxl不可以读取xls的文件,xlrd不可以读取xlsx格式的文件'''
    # obj_handle_excel.read_excel_with_openpyxl("testexcel2003.xls") # 错误写法
    # obj_handle_excel.read_excel_with_openpyxl("testexcel2003.xls") # 错误写法
    obj_handle_excel.read_excel("test_xlwt.xls")
    obj_handle_excel.read_excel_with_openpyxl("test_openpyxl.xlsx")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值