最新消息:

Python处理Excel

IT技术 ipcpu 79浏览

Python处理Excel.md

Excel预处理

Python处理Excel文件的库有很多很多,但是Excel的格式也有很多,xls、xlsx、xlsm,真是看花眼,有人列举了一些常用的库特点

很显然,好多库其中缺点一项就是对于xls没有支持,那咋办?
一般来说我们建议在Excel文件放入Python处理之前,先进行格式转换,统一转换为xlsx格式,然后在使用python调用处理。

import win32com.client as win32
fname = "full+path+to+xls_file"
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open(fname)

wb.SaveAs(fname+"x", FileFormat = 51)    
wb.Close()                               
excel.Application.Quit()
# FileFormat = 51 is for .xlsx extension
# FileFormat = 56 is for .xls extension
# 几点注意事项:
# 1. 系统需要安装Excel或者WPS并且有默认excel程序关联,WPS设置成默认程序也可以
# 2. 文件路径必须写完整路径,因为Excel程序无法识别Python文件的目录
# 3. win32com库,使用pip install pypiwin32安装

openpyxl库的使用

openpyxl是一个功能强大的Excel处理库,是一个比较综合的工具,能够同时读取和修改Excel文档。

from openpyxl import load_workbook
from openpyxl.styles import colors, Font, Fill, NamedStyle


#基础概念:一个Excel文件就是一个workbook,里面有多个worksheet
#每个sheet中有若干个单元格cell

# 加载文件, 如果文件有公式需要加上data_only
wb = load_workbook('./5a.xlsx', data_only=True)
# 读取sheetname
print('==输出文件所有工作表名:\n', wb.sheetnames)


#添加删除sheet
# 创建的sheet必须要赋值给一个对象,不然只有名字但是没有实际的新表
ws4 = wb.create_sheet(index=0, title='newsheet')
# 什么参数都不写的话,默认插入到最后一个位置且名字为sheet,sheet1...按照顺序排列
ws5 = wb.create_sheet()
# 删除sheet
wb.remove(ws4)  # 这里只能写worksheet对象,不能写sheetname


# 读取sheet1中的有效区域
ws1 = wb['Sheet1']
print('==最大列数为:', ws1.max_column)
print('==最大行数为:', ws1.max_row)

#读取A1单元格的值
print('==读取B2单元格内容')
print(ws1['B2'].coordinate, ws1['B2'].value)

#给A1单元格设置字体格式
ft = Font(name='微软雅黑', color='000000', size=15, b=True)
title = ws1['A1']
title.font = ft

#读取B4:C5
data = ws1['B4:C5']
print(data, type(data))


#遍历sheet1
for row in ws1.iter_rows():
    for cell in row:
        print(cell.coordinate, cell.value)

#保存修改
wb.save('./5a.xlsx')

执行结果

==输出文件所有工作表名:
 ['Sheet1', 'Sheet2', 'Sheet3']
==最大列数为: 4
==最大行数为: 4
==读取B2单元格内容
B2 66756
((<Cell 'Sheet1'.B4>, <Cell 'Sheet1'.C4>), (<Cell 'Sheet1'.B5>, <Cell 'Sheet1'.C5>)) <class 'tuple'>

pandas库的使用

pandas是我们日常经常用到的数据分析库,我们以前也说过他的DataFrame数据结构类似于Excel表的存储方式,因此pandas处理Excel文件缺失很方便

import pandas as pd

print('==打印sheet内容')
df = pd.read_excel('./5a.xlsx', sheet_name=0)  # 读取第1个sheet
print(df)

print('==打印所有sheet名字列表')
workbook = pd.ExcelFile('./5a.xlsx')
print(workbook)
print(workbook.sheet_names)


print('==输出行号', df.index.values)
print('==输出列标题', df.columns.values)

print('==读取某一行数据\n', df.iloc[0].values)
#这里读取数据并不包含表头
print('==读取多行数据\n', df.iloc[[0, 1]].values)
#嵌套列表
print('==读取某一列数据\n', df['总和'].values)
print('==读取某单元格数据\n', df.iloc[1, 3])
#这里不需要嵌套列表,也没有values


#把每一行都转换成字典
test_data=[]
keys = df.columns.values
for i in df.index.values:#获取行号的索引,并对其进行遍历:
    # 根据i来获取每一行指定的数据 并利用to_dict转成字典,# loc为按列名索引 iloc 为按位置索引,使用的是 [[行号], [列名]]
    row_data = df.loc[i, keys].to_dict()
    # 将每一行转换成字典后添加到列表
    test_data.append(row_data)
print('==最终获取到的数据是:\n{0}'.format(test_data))


print('==写到新的Excel中')
pd.DataFrame(df).to_excel('new_excel.xlsx', sheet_name='guess', index=False, header=True)

输出结果如下

==打印sheet内容
   月份    阿里云    cdn     总和
0   7  66756  14021  80777
1   8  65345  16532  81877
2   9  65872  17872  83744
==打印所有sheet名字列表
<pandas.io.excel._base.ExcelFile object at 0x0000023CD8D614F0>
['Sheet1', 'Sheet2', 'Sheet3']
==输出行号 [0 1 2]
==输出列标题 ['月份' '阿里云' 'cdn' '总和']
==读取某一行数据
 [    7 66756 14021 80777]
==读取多行数据
 [[    7 66756 14021 80777]
 [    8 65345 16532 81877]]
==读取某一列数据
 [80777 81877 83744]
==读取某单元格数据
 81877
==最终获取到的数据是:
[{'月份': 7, '阿里云': 66756, 'cdn': 14021, '总和': 80777}, {'月份': 8, '阿里云': 65345, 'cdn': 16532, '总和': 81877}, {'月份': 9, '阿里云': 65872, 'cdn': 17872, '总和': 83744}]
==写到新的Excel中

注意事项:在使用pandas的 df.to_excel(file_path)想要对一个有多张sheet的workbook操作时一定会尴尬的发现:永远只存在最后一次写进去的sheet,其他的都被清空了。这时候需要使用ExcelWriter,如下

import pandas as pd
import numpy as np


writer = pd.ExcelWriter('demo.xlsx')  #默认是覆盖模式,会把文件清空再写数据
#writer = pd.ExcelWriter('demo.xlsx', mode='a')  #追加模式,文件必须先存在


'''创建数据框1'''
df1 = pd.DataFrame({'V1': np.random.rand(10),
                    'V2': np.random.rand(10),
                    'V3': np.random.rand(10)})
df1.to_excel(writer, sheet_name='sheet1', index=False)

'''创建数据框2'''
df2 = pd.DataFrame({'V1': np.random.rand(10),
                    'V2': np.random.rand(10),
                    'V3': np.random.rand(10)})
df2.to_excel(writer, sheet_name='sheet2', index=False)

'''数据写出到excel文件中'''
writer.save()

参考资料

https://www.jianshu.com/p/720c6653d9b7

转载请注明:IPCPU-网络之路 » Python处理Excel