python读写Excel

外媒报道,微软正考虑添加 Python 为官方的一种 Excel 脚本语言,如果获得批准,Excel 用户将能够像目前使用 VBA 脚本一样,使用 Python 脚本与 Excel 文档、数据以及一些 Excel 核心函数进行交互。

之前做java还是做nodejs,对于读写excel一直是一个头疼的问题,在java中有开源的POI,无论功能和使用上都很齐全;转而看nodejs这一块,在处理excel问题上一直是一个头疼的问题,之前做一个项目,就是因为nodejs无法实现模板处理方法而必须使用其他的语言或者方法处理。

最近公司在做一个django的项目,其中后台涉及到一些python读写excel的方法,简单做个记录

开源模块

  • xlwings

可结合 VBA 实现对 Excel 编程,强大的数据输入分析能力,同时拥有丰富的接口,结合 pandas/numpy/matplotlib 轻松应对 Excel 数据处理工作。

  • openpyxl

简单易用,功能广泛,单元格格式/图片/表格/公式/筛选/批注/文件保护等等功能应有尽有,图表功能是其一大亮点,缺点是对 VBA 支持的不够好。

  • pandas

数据处理是 pandas 的立身之本,Excel 作为 pandas 输入/输出数据的容器。

  • win32com

从命名上就可以看出,这是一个处理 windows 应用的扩展,Excel 只是该库能实现的一小部分功能。该库还支持 office 的众多操作。需要注意的是,该库不单独存在,可通过安装 pypiwin32 或者 pywin32 获取。

  • xlsxwriter

拥有丰富的特性,支持图片/表格/图表/筛选/格式/公式等,功能与openpyxl相似,优点是相比 openpyxl 还支持 VBA 文件导入,迷你图等功能,缺点是不能打开/修改已有文件,意味着使用 xlsxwriter 需要从零开始。

  • DataNitro

作为插件内嵌到 Excel 中,可完全替代 VBA,在 Excel 中使用 python 脚本。既然被称为 Excel 中的 python,协同其他 python 库亦是小事一桩。然而,这是付费插件...

  • xlutils

基于 xlrd/xlwt,老牌 python 包,算是该领域的先驱,功能特点中规中矩,比较大的缺点是仅支持 xls 文件。

openpyxl

通过openpyxl去读取excel中单元格内容
例如我们读取一个excel文件中的内容


image.png
# -*- coding: utf-8 -*-
from openpyxl import load_workbook
from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font

def getSheet(filename, sheetname):
    wb = load_workbook(filename=filename)
    sheet_ranges = wb[sheetname]

    return wb, sheet_ranges

def readSheetContent(sheet_ranges):
    flag = True
    row = 1
    while(flag):
        if(sheet_ranges[u'A'+str(row)].value is None):
            flag = False
            break
        
        # 获取cell
        rule_key = sheet_ranges[u'A'+str(row)]
        error_level = sheet_ranges[u'B'+str(row)]
        line = sheet_ranges[u'C'+str(row)]
        result = sheet_ranges[u'D'+str(row)]
        reason = sheet_ranges[u'E'+str(row)]
        changeID = sheet_ranges[u'F'+str(row)]
        # 获取cell内容
        # 1. 获取cell value值
        print("Row"+str(row), rule_key.value, error_level.value, line.value, result.value, reason.value, changeID.value)
        # 2. 获取cell相关属性
        # 2.1 数据类型
        rule_key_data_type = rule_key.data_type
        print("rule_key_data_type:",rule_key_data_type)
        # 2.2 编码格式
        rule_key_encoding = rule_key.encoding
        print("rule_key_encoding:", rule_key_encoding)
        # 2.3 填充色相关
        rule_key_fill = rule_key.fill
        rule_key_fill_bgcolor = rule_key.fill.bgColor.value
        rule_key_fill_fgcolor = rule_key.fill.fgColor.value
        print("rule_key_fill_bgcolor:",rule_key_fill_bgcolor)
        print("rule_key_fill_fgcolor:",rule_key_fill_fgcolor)
        # 2.4 字体相关
        rule_key_font = rule_key.font
        print("rule_key_font:", 
                rule_key_font.name, 
                rule_key_font.size, 
                rule_key_font.bold, 
                rule_key_font.italic, 
                rule_key_font.vertAlign,
                rule_key_font.underline,
                rule_key_font.strike)

        # 3 修改单元格
        if(row > 1):
            result.value = True
            reason.value = u"modify cell content"+str(row)
            changeID.value = row
        row += 1
        

    return sheet_ranges


def saveWorkbook(wb, targetname):
    wb.save(filename = targetname)

filename = u"./test/test.xlsx"
sheetname = u"Sheet1"

wb, sheet_ranges = getSheet(filename, sheetname)

readSheetContent(sheet_ranges)

saveWorkbook(wb, filename)

执行完了以后的结果:


image.png

上面的这个例子,给出了一个通用的excel的读写方法,详细的文档可以参考https://openpyxl.readthedocs.io/en/stable/tutorial.html

pandas

Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。1
pandas的文档可以参考[https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_excel.html#]
还是参考上面的例子,我们读取test.xlsx文件内容

# -*- coding: utf-8 -*-
import pandas

def dataconvert(data):
    # print(data)
    if type(data) == unicode:
        return data
    elif type(data) == str:
        return data
    elif type(data) == long:
        return data
    elif type(data) == pandas._libs.tslib.Timestamp:
        return str(data)
    else:
        return ""

excelname = './test/test.xlsx'
xlsx = pandas.read_excel(excelname, header=0, index_col=0)

for idx, row in xlsx.iterrows():
    rule_key = idx
    error_level = dataconvert(row[u"error_level"])
    line = dataconvert(row[u"line"])
    result = dataconvert(row[u"是否有问题"])
    reason = dataconvert(row[u"理由"])
    changeID = dataconvert(row[u"提交ID"])

    print(rule_key, error_level,line, result, reason, changeID)

输出结果:


image.png

其他可以参考Pandas Excel examplePandas独有的基本数据结构

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348

推荐阅读更多精彩内容