1、openpyxl的两种优化模式。一般阅读模式内存使用率很高,约为原始文件大小的50倍,例如50 MB Excel文件为2.5 GB。所以可以使用只读、只写模式优化。
import os
import openpyxl
os.chdir(r'C:\Users\WIN7\Desktop\self_project\openpyxl') #修改工作路径
#openpyxl.worksheet._read_only.ReadOnlyWorksheet
#from openpyxl import load_workbook
#wb = load_workbook(filename='large_file.xlsx', read_only=True)
#ws = wb['big_data']
#
#for row in ws.rows:
# for cell in row:
# print(cell.value) #read_only=False 可以试试大数据量得到表格读取
#只写模式
#在此再次将常规openpyxl.worksheet替换为更快的替代方法openpyxl.WriteOnlyWorksheet。
#当您要转储大量数据时,请确保已安装lxml
#使用只写模式的时候,只能自己创建新的工作表
from openpyxl import Workbook
wb = Workbook(write_only=True)
ws = wb.create_sheet()
# now we'll fill it with 100 rows x 200 columns
for irow in range(10000):
ws.append(['%d' % i for i in range(1000)])
# save the file
wb.save('new_big_file1.xlsx') # doctest: +SKIP
print('finish')
#如果想让单元格带有样式或注释,请使用 openpyxl.cell.WriteOnlyCell() #这部分建议是直接在Excel上操作
from openpyxl import Workbook
wb = Workbook(write_only = True)
ws = wb.create_sheet()
from openpyxl.cell import WriteOnlyCell
from openpyxl.comments import Comment #注释
from openpyxl.styles import Font #单元格格式
cell = WriteOnlyCell(ws, value="hello world")
cell.font = Font(name='Courier', size=36)
cell.comment = Comment(text="A comment", author="Author's Name")
ws.append([cell, 3.14, None])
wb.save('write_only_file.xlsx')
#插入行列
import openpyxl
wb = openpyxl.Workbook()
ws = wb.active
#写入数据 写入十行两列的数据用于观察插入的效果
for irow in range(10):
ws.append(range(2))
#插入默认值为一行或一列。
ws.insert_rows(2) #例如,在第2行(在现有第7行之前)插入一行:
ws.insert_cols(1) #例如,在第1行(在现有第7行之前)插入一行:
#删除行列
ws.delete_rows(4, 2)
ws.title = 'insert deleting'
ws["b10"] = '=SUM($c$1:$c$10)'
ws.move_range("b10", rows=5, cols=5, translate=True) #移动单元格 translate=True 参数是判定单元格的公式是非跟随移动
wb.save('insert2.xlsx')
与numpy与Pandas一起使用
#openpyxl支持和Pandas 和Numpy的使用。 主要是 openpyxl.utils.dataframe。
#这样的支持使得数据
import pandas as pd
data = [["Fruit", "Quantity"],
["Kiwi", 3],
["Grape", 15],
["Apple", 3],
["Peach", 3],
["Pomegranate", 3],
["Pear", 3],
["Tangerine", 3],
["Blueberry", 3],
["Mango", 3],
["Watermelon", 3],
["Blackberry", 3],
["Orange", 3],
["Raspberry", 3],
["Banana", 3]]
df = pd.DataFrame(data)
from openpyxl.utils.dataframe import dataframe_to_rows
wb = Workbook()
ws = wb.active
for r in dataframe_to_rows(df, index=True, header=True):
ws.append(r)
for cell in ws['A'] + ws[1]:
cell.style = 'Pandas' #使用Pandas的格式
wb.save("pandas_openpyxl.xlsx")
#wb.save('pandas_save.xlsx')
#将工作表转换出DataFrame
wb = openpyxl.load_workbook("pandas_openpyxl.xlsx")
ws = wb.active
df = pd.DataFrame(ws.values)
df
#表格切出数据做DataFrame的索引 示例不够清晰 --自己来
import openpyxl
import pandas as pd
from itertools import islice
wb = openpyxl.load_workbook('headers_dataframe.xlsx')
ws = wb['Sheet1']
data = ws.values
cols = next(data)[1:] #next 取到 data的第一行的数据 【1:】 取从第二个
print(cols)
data = list(data)
print(data)
idx = [r[0] for r in data ]
print(idx)
data = (islice(r, 1, None) for r in data) #islice 跳过几行导入数据 参数:islice(文件名, 开始行, 结束行):
print('----')
df = pd.DataFrame(data, index=idx, columns=cols)
df