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 打交道。标准的 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)的值
输出结果:
原Excel表格情况:
二、写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文件路径下出现了这个文件,内容为:
三、改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表为:
就写到这里吧,工作之余抽空写点,不足之处以后再补充吧。
关于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) # 保存工作簿
————————
————————
树叶的一生,只是为了归根吗?
长路漫漫,惟剑做伴。
一剑,一念。