用openpyxl编写excel

用openpyxl编写excel,设置页面大小,页边距,打印标题,单元格边框,合并单元格,设置字号大小,文字自动换行

总算是完成了excel文件格式写入的难题,困难在于中文的资料太少了,许多只是肤浅的翻译外文,根本没有在真实环境中使用过。外文的资料也少,也许是大家用得少吧,有能力的直接用win32com,没能力就用pandas导出excel,然后手工调整表格样式吧。

整件事件中,pandas最新的更新也产生了很严重的错误。版本号是Anaconda3-5.3.0-Windows-x86_64.exe,更新了pandas中dataframe的mean函数总数出错,

  1. 是对完整dataframe调用mean函数,之前版本返回的是一个series序列,这次返回的是一个numpy数组,如果要是通过numpy生成dataframe会导致数据类型出错,正常的浮点数会变成复数,就需要用到numpy复数的real函数来取实数部分。
  2. dataframe调用mean函数如果多次话,有的时候会对字符串数据返回nan,有的时候不返回任何内容,注意不返回任何内容会导致后面连接数据表数据错位。
  3. 对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

这里面是一定可以运行的,只是需要调整一些内容不然我的文件别人没有,导致出错就浪费时间。

你可能感兴趣的:(用openpyxl编写excel)