my-Python读写改Excel的方法

Posted xinxi2010

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了my-Python读写改Excel的方法相关的知识,希望对你有一定的参考价值。

 

 

 

 

 

d:\\anaconda3python3\\python.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:\\anaconda3python3\\python.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:\\note202003春雷log4mail801my200330\\aa6.xls\'
file2path=r\'D:\\note202003春雷log4mail801my200330\\aa7.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)  # 保存工作簿
————————

 

————————

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

    长路漫漫,惟剑做伴。

    一剑,一念。

 

 

 

 

 

以上是关于my-Python读写改Excel的方法的主要内容,如果未能解决你的问题,请参考以下文章

MFC怎么读写EXCEL文件

Java-jxl插件Excel文件读写报错jxl.read.biff.BiffException: Unable to recognize OLE stream

Java-jxl插件Excel文件读写报错jxl.read.biff.BiffException: Unable to recognize OLE stream

互斥锁自旋锁读写锁和条件变量

使用poi包读写excel需要导入哪几个jar包

Python读写EXCEL文件常用方法大全