用openpyxl编写excel,设置页面大小,页边距,打印标题,单元格边框,合并单元格,设置字号大小,文字自动换行
总算是完成了excel文件格式写入的难题,困难在于中文的资料太少了,许多只是肤浅的翻译外文,根本没有在真实环境中使用过。外文的资料也少,也许是大家用得少吧,有能力的直接用win32com,没能力就用pandas导出excel,然后手工调整表格样式吧。
整件事件中,pandas最新的更新也产生了很严重的错误。版本号是Anaconda3-5.3.0-Windows-x86_64.exe,更新了pandas中dataframe的mean函数总数出错,
- 是对完整dataframe调用mean函数,之前版本返回的是一个series序列,这次返回的是一个numpy数组,如果要是通过numpy生成dataframe会导致数据类型出错,正常的浮点数会变成复数,就需要用到numpy复数的real函数来取实数部分。
- dataframe调用mean函数如果多次话,有的时候会对字符串数据返回nan,有的时候不返回任何内容,注意不返回任何内容会导致后面连接数据表数据错位。
- 对dataframe中一列数据使用mean处理不了字符串数据。不像之前的那么智能。
所以我的解决办法就是判断哪些列是数字,哪些列是字符串,只统计数字,不统计字符串,然后把list转dict再转dataframe。
但是,重点是pandas的count函数没有任何问题的,和之前的一样,返回的是一个series序列,然后就可以用内置的方法python pd.Dataframe()
生成,这就有些尴尬了。count没出错,mean出错,害我找了一下午的问题。
现在开始说说怎么用openpyxl吧,这几天都在研究这个事情。openpyxl其实和别的模块一样,选定一个学会了怎么用就成了,用什么其实区别应该不大的。
from openpyxl import Workbook
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter
from openpyxl.utils.dataframe import dataframe_to_rows
from openpyxl.styles import Alignment,Border,Side,Font
wb = Workbook()#建立excel文件
thin_border = Border(left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin'))#创建边框对象
for file_name in names:#开始循环处理文件夹下所有excel文件
print (file_name)
ws = wb.create_sheet(file_name.split('.')[0])#创建工作簿名
ws.page_setup.orientation = ws.ORIENTATION_LANDSCAPE#页面方向
ws.page_setup.paperSize = ws.PAPERSIZE_A4#纸张大小
ws.page_margins.left = 0.25
ws.page_margins.rigt = 0
ws.page_margins.top = 0.2
ws.page_margins.bottom = 0.2
ws.page_margins.header = 0
ws.page_margins.footer = 0#设置页边距
ws.print_title_rows = '1:2'#设置打印标题为2行,每页开始都打印sheet的前两行
#print (dffff.tail())
rows = dataframe_to_rows(duo(file_name))#pandas的dataframe转openpyxl的格式
for row in rows:#不知道为啥有空行。openpyxl的序号从1开始。delete_rows()
if len(row) >2:
ws.append(row)
ws.column_dimensions['A'].width = 3#设置列宽
ws.column_dimensions['B'].width = 9
for i in range(3,ws.max_column):#最大列数目,是整数类型
ws.column_dimensions[get_column_letter(i)].width = 5
ws.column_dimensions[get_column_letter(ws.max_column)].width = 6
for i in list(ws.rows)[0]:#生成器转list才能迭代,第一行
i.alignment = Alignment(wrap_text=True)#设置文本自动换行
for row in ws.rows:
for cell in row:
cell.border =thin_border#设置边框
ws.insert_rows(1)#插入标题行
ws.merge_cells(start_row=1, start_column=1, end_row=1, end_column=ws.max_column)#合并标题行
p_title = file_name.split('.')[0]
ws['A1'] = p_title
ws['A1'].alignment = Alignment(horizontal='center')#设置标题居中
ws['A1'].font = Font(size=20)#设置字号大小
std=wb.get_sheet_by_name('Sheet')
wb.remove_sheet(std)#删除默认sheet,保存文件
wb.save('文件名.xlsx')#excel写入所有sheet
这里面是一定可以运行的,只是需要调整一些内容不然我的文件别人没有,导致出错就浪费时间。
网友评论