zoukankan      html  css  js  c++  java
  • my-Python读写改Excel的方法

    d:anaconda3python3python.exe -m pip install --upgrade pip

    pip install setuptools
    pip install xlrd
    pip install xlwt
    pip install xlutils

    pip install properties
    pip install xlwt

    doskey /history

    d:anaconda3python3python.exe -m pip install --upgrade pip

    python

    pip install setuptools

    python

    import xlrd,xlwt
    import xlutils
    from xlutils.copy import copy
    file_path=r'D: ote202003春雷log4mail801my200330aa6.xls'
    file2path=r'D: ote202003春雷log4mail801my200330aa7.xls'
    # import xlrd #导入模块

    from xlutils.copy import copy #导入copy模块
    # rb = xlrd.open_workbook('lll.xlsx') #打开weng.xls文件
    rb = xlrd.open_workbook(file_path,formatting_info=True)
    # rb = xlrd.open_workbook(file_path)
    read_file = xlrd.open_workbook(file_path,formatting_info=True)
    wb = copy(rb) #利用xlutils.copy下的copy函数复制
    wb.save(file2path) #保存文件

    import xlrd                           #导入模块
    from xlutils.copy import copy        #导入copy模块
    rb = xlrd.open_workbook('lll.xlsx')    #打开weng.xls文件
    wb = copy(rb)                          #利用xlutils.copy下的copy函数复制
    ws = wb.get_sheet(0)                   #获取表单0
    ws1 = wb.get_sheet(1) 
    wb.save('sss.xls')                    #保存文件

    ws.write(0, 0, 'changed!')             #改变(0,0)的值
    ws.write(8,0,label = '好的')           #增加(8,0)的值

    Python需要读取Excel(.xls、.xlsx)时通常使用xlrd模块;如果要对其内容进行编辑的话稍稍有些麻烦,通常的做法是使用xlutils的copy模块对原文件进行复制,然后保存成新的文件。

    使用示例

    from xlutils import copy
    import xlrd
    import time
    import os
    
    def save_result(file_path,res_flags,request_urls,responses):
        book = xlrd.open_workbook(file_path)  # 读取Excel
        new_book = copy.copy(book)  # 复制读取的Excel
        sheet = new_book.get_sheet(0)
        i = 1
        for request_url, response, flag in zip(request_urls, responses, res_flags):
            sheet.write(i, 8, u'%s' % request_url)
            sheet.write(i, 9, u'%s' % response)
            sheet.write(i, 10, u'%s' % flag)
            i += 1
        report_path = os.path.abspath(os.path.join('report'))
        if not os.path.exists(report_path):
            os.makedirs(report_path)
        new_book.save(os.path.abspath(os.path.join(report_path, 'Report@%s.xlsx' % time.strftime('%Y.%m.%d@%H%M%S'))))  # 保存为新的Excel
    

    以上的示例适用于普通场景,假如xlsx较复杂,夹杂着各种格式、规则、宏,可能就会遇到问题---普通读取会丢掉所有这些附带的信息

    其实xlrd早就已经适配了这个功能,它提供的formatting_info参数取值为True时(为了节省内存,该参数默认为False),就会读取各种格式的信息。

    使用方法

    xlrd.open_workbook(file,formatting_info=True) # 读取Excel
    

    但是我们会发现在读取xlsx格式的Excel时,传入formatting_info会直接抛出异常,而读取xls类型的文件时不存在此问题。

    raise NotImplementedError("formatting_info=True not yet implemented")
    

    不难推断,抛异常的原因是formatting_info还没有对新版本的xlsx的格式完成兼容。

    那么如果我们要操作的文件刚好是xlsx格式,又想保存其原有的格式该怎么办呢?

    解决方法

    1、修改为xlsx为xls(推荐)

    将xlsx另存为xls,然后再进行后续操作,亲测有效,能正常保存Excel原有格式, 不用修改代码。

    2、改用 openpyxl

    coding尝试读取文件,处理速度真的很慢...而且规则和宏全部丢失。

    3、使用pywin32

    这是用于Win32 (pywin32)扩展的Python扩展库,它提供了对许多来自Python的Windows api的访问。

    4、使用老旧的版本 xlrd-0.6.1

    使用xlrd-0.6.1可以读取,没有异常抛出。直到我传入其他几个xls文件,出现Expected BOF record; found 0x4b50 错误,原因是xlrd-0.6.1不支持office2007

    参考资料:

    http://blog.sina.com.cn/s/blog_5e574c030101an5s.html

    https://blog.csdn.net/erlang_hell/article/details/51992928

    https://github.com/mhammond/pywin32


    import xlrd                           #导入模块
    from xlutils.copy import copy        #导入copy模块
    rb = xlrd.open_workbook('lll.xlsx')    #打开weng.xls文件
    wb = copy(rb)                          #利用xlutils.copy下的copy函数复制
    wb.save('sss.xls')                    #保存文件

    import xlrd                           #导入模块
    from xlutils.copy import copy        #导入copy模块
    rb = xlrd.open_workbook('lll.xlsx')    #打开weng.xls文件
    wb = copy(rb)                          #利用xlutils.copy下的copy函数复制
    ws = wb.get_sheet(0)                   #获取表单0
    ws1 = wb.get_sheet(1)
    wb.save('sss.xls')                    #保存文件

    ws.write(0, 0, 'changed!')             #改变(0,0)的值
    ws.write(8,0,label = '好的')           #增加(8,0)的值

    D:Python365>doskey /history
    pip install propties
    pip install properties
    pip install xlwt

    doskey /history
    pwd
    ls
    stus = [['姓名', '年龄', '性别', '分数'],
            ['mary', 20, '女', 89.9],
            ['mary', 20, '女', 89.9]
            ]
    ipython
    Ipython
    python
    pip install xlrd
    python
    pip install xlutils
    book2 = copy(book1)#拷贝一份原来的excel
    # print(dir(book2))
    sheet = book2.get_sheet(0)#获取第几个sheet页,book2现在的是xlutils里的方法,不是xlrd的
    sheet.write(1,3,0)
    sheet.write(1,0,'hello')
    book2.save('stu.xls')
    python
    doskey /list
    doskey /history

    Python读写改Excel的方法

     

    (注:本文部分内容摘自互联网,由于作者水平有限,不足之处,还望留言指正。)

           面对疾风吧。

           回首往昔,更进一步。

           且随疾风前行,身后一许流星。

           正文:

           数据处理是Python的一大应用场景,而 Excel 则是最流行的数据处理软件。因此用 Python进行数据相关的工作时,难免要和 Excel 打交道。标准的 Excel 文件(xls/xlsx)具有较复杂的格式,并不方便像普通文本文件一样直接进行读写,需要借助第三方库来实现。

    以下内容均在Python3上实现,如果是Python2,则需要修改编码。

    一、读Excel表(xlrd模块)

          Xlrd模块只能用来读取数据操作,无法修改数据。

    复制代码
    import xlrd              #导入模块
    data = xlrd.open_workbook('电影.xlsx')    #打开电影.xlsx文件读取数据
    table = data.sheets()[0]       #读取第一个(0)表单
    #或者通过表单名称获取 table = data.sheet_by_name(u'Sheet1')
    print(table.nrows)            #输出表格行数
    print(table.ncols)            #输出表格列数
    print(table.row_values(0))    #输出第一行
    print(table.col_values(0))    #输出第一列
    print(table.cell(0,2).value)  #输出元素(0,2)的值
    复制代码

    输出结果:

    image

    原Excel表格情况:

    image

    二、写Excel表(xlwt模块)

    复制代码
    import xlwt                            #导入模块
    wb = xlwt.Workbook(encoding = 'ascii')  #创建新的Excel(新的workbook),建议还是用ascii编码
    ws = wb.add_sheet('weng')               #创建新的表单weng
    ws.write(0, 0, label = 'hello')         #在(0,0)加入hello
    ws.write(0, 1, label = 'world')         #在(0,1)加入world
    ws.write(1, 0, label = '你好')
    wb.save('weng.xls')                     #保存为weng.xls文件
    复制代码

    在py文件路径下出现了这个文件,内容为:

    image

    三、改Excel表(xlutils模块)

    复制代码
    import xlrd                           #导入模块
    from xlutils.copy import copy        #导入copy模块
    rb = xlrd.open_workbook('weng.xls')    #打开weng.xls文件
    wb = copy(rb)                          #利用xlutils.copy下的copy函数复制
    ws = wb.get_sheet(0)                   #获取表单0
    ws.write(0, 0, 'changed!')             #改变(0,0)的值
    ws.write(8,0,label = '好的')           #增加(8,0)的值
    wb.save('weng.xls')                    #保存文件
    复制代码

    修改后的Excel表为:

    image

    就写到这里吧,工作之余抽空写点,不足之处以后再补充吧。

    关于python3中的追加写入excel问题,这个问题坑了我几小时,其实加一个参数即可。
    因为之前有写好的excel,想追加写入,但是写入后却只有写入后的单元格格式,之前写的完全消失。
    以下是我的代码
    这代码可以用是我做的一个爬虫维护项目:
    def times():
        User_Agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'
        headers = {
            'User-Agent': User_Agent
        }
        search_url = 'https://www.cnss.com.cn/u/cms/www/indexJson/bdi_month.json?v=1577414941357'
        request = urllib.request.Request(search_url, headers=headers)
        response = urllib.request.urlopen(request)
        content = response.read().decode('utf-8')
        content = ''.join(content)
        # print(content)
        # index = re.findall('index":"(.*?)"', content)  # 获取指数
        date = re.findall('date":"(.*?)"', content)  # 获取时间
        time = []
        i = 0
        start_date = date[0].replace('.', '年')
        start_date.replace('.', '月')
        end_date = date[-1].replace('.', '年')
        end_date.replace('.', '月')
        # print(index,date,start_date,end_date)
        for j in range(int(len(date) / 1)):
            temp = date[i:i + 1]
            i += 1
            time.append(temp)
            hears = start_date + '日' + '——' + end_date + '日' + '嘻嘻嘻'
            title=['交易日期','干散货指数(BDI)','海岬型指数(BCI)','巴拿马型指数(BPI)','超灵便型船运价指数(BSI)','灵便型船指数(BHSI)']
            sheet1.write_merge(0, 0+0,0,0+5, hears, style)
            for ti in range(len(title)):
                sheet1.write(1, ti+0, title[ti], style)
            for x in range(len(time)):
                for y in range(len(time[x])):
                    sheet1.write(x + 2, 0, time[x][y], style)
            f.save('你想放的路径.xls')
    123456789101112131415161718192021222324252627282930313233
    上面的代码还是可以继续使用
    标题xlwt的缺陷:
    xlwt只能创建一个全新的excel文件,然后对这个文件进行写入内容以及保存。但是大多数情况下我们希望的是读入一个excel文件,然后进行修改或追加,这个时候就需要xlutils了。
    xlutils的简单使用:
    接下来的部分就是关键所在了
    formatting_info=True这个参数能保留原excel格式
    def write_excel_xls_append(path, value,u):
        index = len(value)  # 获取需要写入数据的行数
        workbook = xlrd.open_workbook('./result/30波罗的海干散货运价指数.xls',formatting_info=True)  # 打开工作簿
        sheets = workbook.sheet_names()  # 获取工作簿中的所有表格
        worksheet = workbook.sheet_by_name(sheets[0])  # 获取工作簿中所有表格中的的第一个表格
        rows_old = worksheet.ncols  # 获取表格中已存在的数据的行数
        new_workbook = copy(workbook)  # 将xlrd对象拷贝转化为xlwt对象
        styleS = xlwt.XFStyle()
        alignment = xlwt.Alignment()
        alignment.horz = xlwt.Alignment.HORZ_CENTER
        alignment.vert = xlwt.Alignment.VERT_CENTER
        styleS.alignment = alignment
        new_worksheet = new_workbook.get_sheet(0)  # 获取转化后工作簿中的第一个表格
        for i in range(0, index):
            for j in range(0, len(value[i])):
                new_worksheet.write(i+2, u+1, value[i][j],styleS)  # 追加写入数据,注意是从i+rows_old行开始写入
        new_workbook.save(path)  # 保存工作簿
    ————————

    ————————

        树叶的一生,只是为了归根吗?

        长路漫漫,惟剑做伴。

        一剑,一念。

  • 相关阅读:
    MS SQL SERVER导出表结构到Excel
    Ajax.ActionLink用法
    Layer弹出层关闭后刷新父页面
    Ajax.BeginForm提示不支持live属性或方法的错误
    BootStrap带样式打印
    利用JQuery jsonp实现Ajax跨域请求 .Net 的*.handler 和 WebService,返回json数据
    Bootstrap打印问题
    EF的表左连接方法Include和Join
    vs code的local history插件
    idea debug的drop frame,set watch和设置过滤条件
  • 原文地址:https://www.cnblogs.com/xinxihua/p/12616908.html
Copyright © 2011-2022 走看看