处理Excel文件

常见的 Excel 包:

  • OpenPyXL 是个读写 Excel 2010 xlsx/xlsm/xltx/xltm 的 Python 库, 简单易用, 功能广泛, 单元格格式/图片/表格/公式/筛选/批注/文件保护等等功能应有尽有, 图表功能是其一大亮点;
  • xlwings 是一个基于 BSD 授权协议的 Python 库, 可以轻松的使用 Python 操作 Excel, 也可以在 Excel 中调用 Python, 以接近 VBA 语法的实现 Excel 编程, 支持 Excel 宏, 并且可以作为 Web 服务器, 提供 REST API 接口;
  • pandas 数据处理是 pandas 的立身之本, Excel 作为 pandas 输入/输出数据的容器;
  • win32com 从命名上就可以看出, 这是一个处理 windows 应用的扩展, Excel 只是该库能实现的一小部分功能. 该库还支持 office 的众多操作. 需要注意的是, 该库不单独存在, 可通过安装 pypiwin32 或者 pywin32 获取;
  • Xlsxwriter 拥有丰富的特性, 支持图片/表格/图表/筛选/格式/公式等, 功能与 openpyxl 相似, 优点是相比openpyxl 还支持 VBA 文件导入, 迷你图等功能, 缺点是不能打开/修改已有文件, 意味着使用 xlsxwriter 需要从零开始;
  • DataNitro 一个 Excel 的付费插件, 内嵌到 Excel 中, 可完全替代 VBA, 在 Excel 中使用 python 脚本。既然被称为 Excel 中的 python, 同时可以与其他 python 库协同;
  • xlutils 基于 xlrd/xlwt, 老牌 python 包, 算是该领域的先驱, 功能特点中规中矩, 比较大的缺点是仅支持 xls 文件.

.xls 和 .xlsx 格式文件

  • .xls: Office 2003及之前版本的 Excel 只能保存为 .xls 格式. 单个工作表最多支持65536行, 256列.
  • .xlsx: 2007及之后版本的 Excel 既能保存为 .xls , 又能保存为 .xlsx. 单个工作表最多支持1048576行, 16384列.

因此格式相互转换可能造成数据丢失.

xlwt, xlrd, xlutils

xlwt模块只能写xls文件, 不能写xlsx文件(写xlsx程序不会报错, 但最后文件无法直接打开, 会报错). 而pandas既可处理xls文件, 也可处理xlsx文件.

单元格索引从0开始.

import xlwt

代码 说明
wb = xlwt.Workbook(encoding=’utf-8′) 创建一个工作簿Book对象
wb.add_sheet(“Sheet1”) 添加名为Sheet1的工作表
ws = wb.get_sheet(0) 根据索引或名称返回Worksheet对象
ws.write(0, 0, “123”) 将值填入指定位置
r1 = ws.row(0) 返回指定行
c1 = ws.col(0) 返回指定列
r1.write(1, “456”) 在行的第二列写入”456″
worksheet.write_merge(2, 3, 0, 3, ‘合并从第三行到第四行,第一列到第四列’) 合并单元格
style = xlwt.XFStyle() 初始化样式
font1 = xlwt.Font() 创建字体对象
font1.name = ‘Times New Roman’ 设置字体
font1.bold = True 黑体
font1.underline = True 下划线
font1.italic = True 斜体
style.font = font1 应用字体
aligment1 = xlwt.Aligment() 创建对齐格式对象
alignment1.horz = xlwt.Alignment.HORZ_CENTE 水平方向: HORZ_GENERAL, HORZ_LEFT, HORZ_CENTER, HORZ_RIGHT, HORZ_FILLED, HORZ_JUSTIFIED, HORZ_CENTER_ACROSS_SEL, HORZ_DISTRIBUTED
alignment1.vert = xlwt.Alignment.VERT_CENTER 垂直方向: VERT_TOP, VERT_CENTER, VERT_BOTTOM, VERT_JUSTIFIED, VERT_DISTRIBUTED
style.aligment = aligment1 应用对齐格式
ws.write(1, 0, ‘带样式的单元格’, style) 带样式写入
worksheet.write(1, 1, xlwt.Formula(‘HYPERLINK(“https://www.cnblogs.com/khrushchefox/”;”Khru“)’)) 单元格添加超链接
worksheet.write(1, 2, xlwt.Formula(‘SUM(A1,B1)’)) 单元格添加公式
r1.height / c1.width = 300 赋值改变行高/列宽 (单位: 0.05pt)
wb.save(“test.xls”) 保存文件

import xlrd

代码 说明
wb = xlrd.open_workbook(“test.xls”, formatting_info=True) 打开指定文件,返回Book对象, 保留格式信息
wb.nsheets 返回Sheet数目
wb.sheets() 返回所有Sheet对象的列表
ws = wb.sheet_by_name(“Sheet1”) 根据名字返回Sheet对象
wb.sheet_by_index(0) 根据索引返回Sheet对象
ws.name 返回表格名称
ws.nrows / ws.ncols 返回行/列数
ws.row_len(0) 返回指定行的长度
cell1 = ws.cell(0, 0) 根据位置获取Cell对象
ws.cell_value(0, 0) 根据位置获取值
cell1.value 返回单元格的值
data_list1 = ws.row_values(rowx=0, start_colx=0, end_colx=None) 获取指定行中的所有数据
data_list2 = ws.col_values(colx=0, start_rowx=0, end_rowx=None) 获取指定列中的所有数据

import xlultils

xlutils不能读,但可以修改 (追加写入) xls, 因为xlutils包依赖于xlwt和xlrd.

import xlrd
from xlutils.copy import copy

wb = xlrd.open_workbook("test.xls")
new_wb = copy(wb)
ws = new_wb.get_sheet(0)
ws.write(0, 0, "111")
new_wb.save("test2.xls")

openpyxl

openpyxl模块可实现对excel文件的读, 写和修改, 只能处理xlsx文件, 不能处理xls文件.

对于openpyxl, 单元格的行和列从1开始.

创建, 打开与保存

from openpyxl import Workbook, load_workbook

代码 说明
wb = Workbook() 创建一个Workbook工作簿对象, 自带一个名为 Sheet 的表单
wb = load_workbook(dir) 打开指定路径的文件
wb.sheetnames() 工作簿中所有表单名字的列表
ws = wb.active 创建的 workbook 会将第一个表单激活, 通过 wb.active 获取引用当前激活的表单
ws2 = wb.create_sheet(“Sheet2”, index=1) 新建一个工作表, 位于第二
ws3 = wb[“Sheet2”] 获取指定名称的表单
ws4 = wb.get_sheet_by_name(u”工作表1″) 同上
ws.title 表单的名字 Sheet
ws_copy = wb.copy_worksheet(ws) 复制ws
wb.remove(ws_copy) 删除ws_copy
wb.save(“test.xlsx”) save 方法会立即保存, 不会有任何提示

单元格操作

代码 说明
ws.append(iterable) 按顺序(或字典的键)将可迭代对象的值填入
cell1 = ws.cell(6, 1, “某个值”) 指定位置和值, 创建一个cell1对象 (如果有原值, 则原值被改变)
cell2 = ws.cell(6, 1) 指定位置及其值, 创建一个cell2对象
ws[“a6”] = 123.11 对表格进行赋值
cell2.value cell2的值
cell2.coordinate cell2的坐标 (‘A6’)
cell2.row (cell2.column/cell2.col_idx) cell2的行 (列) 号
cell2.column_letter cell2的列的字母形式
ws[“a:c”] (ws[“a”]) 按列遍历, 每一列组成元组, 返回一个二维元组
ws[1:3] (ws[1]) 按行遍历, 每一行组成元组, 返回一个二维元组
ws[“a1:c3”] 按行遍历指定范围, 每一行组成元组, 返回一个二维元组
ws.iter_rows(min_row=None, max_row=None, min_col=None, max_col=None, values_only=False) 按行遍历, 返回一个生成器
ws.iter_cols(values_only=True) 按列遍历, 只读取值
ws.rows (ws.columns) 表单的所有行 (列)
ws.merge_cells() (unmerge_cells) 合并单元格 (拆分单元格)
ws.insert_cols(2, 3) (insert_rows) 从第二列开始插入三列
ws.delete_cols(2, 1) (delete_rows) 从第二列开始删除一列
ws.move_range(“c3:d4”, -2, -2) 将单元格上移2行, 左移2行

使用公式

from openpyxl.formula.translate import Translator

代码 说明
ws[“c2”] = “=SUM(a2:b2)” 使用openpyxl.utils.FORMULAE集合中支持的公式
ws[“c3″] = Translator(formula=”=SUM(a2:b2)”, origin=”c2″).translate_formula(“c3”) 对指定单元格翻译公式

只读和只写

  • 只读模式, 不进行修改和保存.

    from openpyxl import load_workbook
    
    wb = load_workbook(filename='test.xlsx', read_only=True)  # 打开工作簿时指定只读模式
    ws = wb['1']
    
    # 读取数据
    for row in ws.rows:
        for cell in row:
            print(cell.value)
    
    #需要手动关闭释放内存
    wb.close()
    
  • 只写模式

    from openpyxl import Workbook
    from openpyxl.cell import WriteOnlyCell
    from openpyxl.styles import Font
    
    wb = Workbook(write_only=True)  # 创建工作簿时指定只写模式
    ws = wb.create_sheet()  # 只能通过create_sheet新建一个sheet
    
    for _ in range(100):
        ws.append([i for i in range(200)])  # 只能通过append写入数据
    
    # 如果需要保留公式、注释等操作,可以使用WriteOnlyCell
    cell = WriteOnlyCell(ws, value="111")
    cell.font = Font(name='黑体', size=15)
    ws.append([cell])
    
    wb.save('test.xlsx')  # 保存后无法再修改
    

原文地址:http://www.cnblogs.com/khrushchefox/p/16794530.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性