美文网首页
用openpyxl编写excel

用openpyxl编写excel

作者: dec0de丶bcd385丶 | 来源:发表于2018-10-01 10:31 被阅读0次

    用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

          本文链接:https://www.haomeiwen.com/subject/jgycoftx.html