Python处理Excel和PDF文档

时间:2021-10-13 14:13:31

一、使用Python操作Excel

  Python来操作Excel文档以及如何利用Python语言的函数和表达式操纵Excel文档中的数据。

  虽然微软公司本身提供了一些函数,我们可以使用这些函数操作Excel文档。但是,使用Excel自带的函数受限于Excel软件的功能限制。换句话说,只有微软提供了某种功能,我们才能使用相应的功能解决问题。如果微软没有提供相应的函数应对一个复杂的功能,那么,我们只能进行重复性操作。使用Python语言操作Excel则不然,我们可以灵活应用Python语言的所有功能,读取、计算和编辑Excel文档中的数据。

一、Python处理Excel之openpyxl

  1、openpyxl简介和安装

    1、openpyxl简介

  openpyxl是一个读写Excel2010(xlsx/xlsm)文档的Python库,如果要处理更早格式的Excel文档,需要用到另外的库。openpyxl是一个比较综合的工具,能够同时读取和修改Excel文档。XlsxWriter也是一个与Excel处理相关的知名项目,仅支持创建和写入Excel文档,不支持读取Excel文档。

    2、openpyxl安装
pip install openpyxl

  2、使用openpyxl读取Excel文档

    1、Excel的构成

  一个Excel文档称为一个工作簿,在Office2010下,典型工作簿的文件扩展名为xlsx。一个工作簿可以包含多个表格(在Excel又称为sheet)。打开工作簿后会默认显示一个表格,这个表格一般称为活跃表。表格中包含若干单元格,所有单元格都有一个唯一的坐标。Excel通过行和列表示一个单元格,其中,行的坐标使用数字表示,列的坐标使用字母表示。

    2、openpyxl处理Excel文件

  openxpyxl中有三个不同层次的类,分别是Workbook、Worksheet和Cell。Workbook是对Excel工作簿的抽象,Worksheet是对表格的抽象,Cell是对单元格的抽象。每一个类都包含了若干属性和方法,以便于我们通过这些属性和方法获取表格中的数据。

  例如,我们要打开一个Excel表格或者创建一个Excel文档,都需要创建一个Workbook对象。我们需要获取Excel文档中的某一张表,应该先创建一个Workbook对象,然后使用该对象的方法来得到一个Worksheet对象。如果要读取或者修改某个单元格,我们需要先获得Worksheet对象,然后再获取代表单元格的Cell对象。

  一个Workbook对象代表一个Excel文档,因此,在操作一个Excel之前,应该先创建一个Workbook对象。对于创建一个新的Excel文档,直接进行Workbook类调用即可。对于读取一个已有的Excel文档,可以使用openpyxI模块的load_workbook函数。该函数接受多个参数,但只有filename参数为必传参数。filenmame可以是一个文件名,也可以是一个打开的文件对象。

import openpyxl
wb=openpyxl.load_workbook('example.xls')

  调用完load_workbook函数以后,我们就得到了一个Workbook对象。Workbook对象有很多的属性和方法,其中,大部分方法都与sheet相关。

  Workbook对象的部分属性如下:

 active:获取活跃的Worksheet;
read_only:是否以read_only模式打开Excel文档;
encoding:文档的字符集编码;
properties:文档的元数据,如标题,创建者,创建日期等;
worksheets:以列表的形式返回所有的Worksheet。
#操作
print(wb.active)
print(wb.read_only)
print(wb.encoding)
print(wb.worksheets) #结果如下
<Worksheet "product">
False
utf-8
[<Worksheet "pre">, <Worksheet "product">]

实操

  Workbook对象的方法大都与Worksheet相关。常用的方法如下:

 sheetnames:获取所有表格的名称;
[sheetname]:通过表格名称获取Worksheet对象;
active:获取活跃的表格;
remove:删除一个表格;
create_sheet:创建一个空的表格;
copy_worksheet:在Workbook内拷贝表格
#实操
print(wb.sheetnames)
print(wb['pre'])
print(wb.active)
print(wb.create_sheet(index=0, title='new sheet'))
print(wb.sheetnames)
print(wb.remove(wb['new sheet']))
print(wb.sheetnames)
print(wb.copy_worksheet(wb['pre']))
###将修改保存(从内存刷到磁盘)
wb.save('example.xlsx') #结果
<Worksheet "new sheet">
['new sheet', 'pre', 'product']
['new sheet', 'pre', 'product']
<Worksheet "pre">
<Worksheet "pre Copy">

实操

  有了Worksheet对象以后,我们可以通过这个Worksheet对象获取表格的属性,得到单元格中的数据,修改表格中的内容。openpyxI提供了非常灵活的方式来访问表格中的单元格和数据。

  常用的Worksheet属性如下:

 title:表格的标题;
dimensions:表格的大小,这里的大小是指有含有数据的表格大小。例如,对于example.xlsx文件,dimensions属性的值为'Al:El1';
maxrow:表格的最大行;
min_row:表格的最小行;
maxcolumn:表格的最大列;
mincolumn:表格的最小列;
rows:按行获取单元格(Cell对象);
columns:按列获取单元格(Cell对象);
freeze_panes:冻结窗格;
values:按行获取表格的内容(数据)。
#实操
ws = wb['pre']
print(ws.title)
print(ws.max_row) #结果如下
pre
59

实操

  通过不同的属性名获取student这张表的属性。其中,columns、rows和values这几个属性都是通过生成器的方式返回数据。

  openpyxl并不知道我们的表格中有多少数据,在数据量大的情况下,如果一次获取所有数据,势必会占用较多的内存。因此,openpyxl的设计中,需要返回数据时都是通过生成器的方式返回。对于附件中的student表,因为记录较少,我们可以使用list函数或tuple函数获取所有的数值。需要注意的是,columns与rows返回的是Cell对象,values返回的是数据。

  freeze_panes这个参数比较特别,主要用于在表格较大时冻结顶部的行或左边的列。对于冻结的行或列,就算用户滚动电子表格,也是始终可见的。每个Worksheet对象都有一个freeze_panes属性,可以设置为一个Cell对象或一个单元格坐标的字符串,单元格上面的行和左边的列将会冻结(注意单元格所在的行和列并不会冻结)。例如,我们需要冻结第一行,那么freeze_panes取值应该为A2,如果要冻结第一列,freeze_panes取值为Bl。如果要同时冻结第一行和第一列,则freeze_panes取值为B2。freeze_panes取值为None表示不冻结任何窗格。

  Worksheet常用的一些方法:

 iter_rows:按行获取所有单元格(Cell对象);
iter_columns:按列获取所有的单元格;
append:在表格末尾添加数据;
merged_cells:合并多个单元格;
unmerge_cells:移除合并的单元格。

  iter_rows方法和iter_columns方法在参数取默认值时,与rows属性和columns属性的作用相同。区别在于,iter_rows方法和iter_columns方法可以通过函数参数限定访问表格的范围。

print(list(ws.iter_rows(min_row=2,max_row=4,min_col=1,max_col=3)))

  从Worksheet的属性和方法的使用中可以看到,很多属性和方法返回的不是某一个具体的数值,而是一个Cell对象。一个Cell对象就代表一个单元格,我们可以直接使用Excel坐标的方式获取Cell对象,也可以使用Worksheet的cell方法获取Cell对象。如下所示:

print(ws['A1'])
print(ws.cell(row=1, column=2))

  Cell对象比较简单,其常用的属性如下:

 row:单元格所在的行;
column:单元格所在的列;
value:单元格的取值;
cordinate:单元格的坐标
    3、openpyxl提供的各种API

  使用4种不同的方法来打印student表中的内容。为了对数据的格式进行控制,我们使用print函数而不是print语句进行打印。

  通过Worksheet的values方法打印表格中的数据,这也是打印数据最简单的方法。values通过生成器访问数据并按行返回,因此,我们使用for循环遍历表格的内容。

from __future__ import print_function
for row in ws.values:
print(*row)

  使用Worksheet的rows属性来遍历表格中的数据。rows属性按行返回Cell对象,因此,我们使用列表推导来获取每一个Cell对象的值。如下所示:

for row in ws.rows:
print(*[cell.value for cell in row])

  Worksheet的iter_rows方法在不加任何参数的情况下与rows属性效果相同,因此这种方法与前一种方法看起来很像

for row in ws.iter_rows():
print(*[cell.value for cell in row])

  最后这种方式是最麻烦的方式,也是大家最容易想到的方式。我们首先获取表格的最小行数和最大行数,然后获取最小列数与最大列数,通过行和列的索引确定一个唯一元格。确定单元格以后,打印单元格的值。这种方式是每确定一个单元格打印一次,因此,我们在print函数中将end参数取值为空格来避免换行,并在内层for循环结束以后,显示地进行换行。如下所示:

for i in range(ws.min_row, ws.max_row + 1):
for j in range(ws.min_column, ws.max_column + 1):
print(ws.cell(row=i ,column=j).value, end=' ')
print()

  3、使用openpyxl修改Excel

  openpyxl不但可以读取Excel文档,而且还可以修改Excel文档,包括修改单元格的 数据、合并单元格、修改单元格的字体、在Excel文档中画图等。

  一个Workbook对象就代表了一个工作簿,因此,新建一个工作簿就是创建一个 Workbook对象。创建完Workbook对象以后,默认会有一个名为“sheetl”的表格,我们 可以通过表格的名称或get_active_sheet方法来获取这个表格。获取表格以后,可以通过给 表格的title属性赋值的方式来修改表格的名称。

from openpyxl import Workbook

wb =Workbook()
wb.sheetnames ws = wb.active
ws.title
ws.title = 'pre'

  修改

ws['A1'] = 'hello world'
wb.save('example.xlsx')

二、其他操作Excel的方式

  1、xlrd主要是用来读取excel文件

    1、安装xlrd
pip install xlrd
    2、实操
import xlrd

workbook = xlrd.open_workbook('dns_records.xls')
sheet_names = workbook.sheet_names() for sheet_name in sheet_names:
sheet2 = workbook.sheet_by_name(sheet_name)
print(sheet_name)
rows = sheet2.row_values(3) # 获取第四行内容
cols = sheet2.col_values(1) # 获取第二列内容 print(rows)
print(cols)

实操

  2、xlwt主要是用来写excel文件

    1、安装
pip install xlwt
    2、实操
import xlwt

wbk = xlwt.Workbook()
sheet = wbk.add_sheet('sheet 1')
sheet.write(0,1,'test text')#第0行第一列写入内容
wbk.save('test.xls')

实操

  3、xlutils结合xlrd可以达到修改excel文件目的

    1、安装
pip install xlutils
    2、实操
import xlrd
from xlutils.copy import copy workbook = xlrd.open_workbook(u'有趣装逼每日数据及趋势.xls')
workbooknew = copy(workbook)
ws = workbooknew.get_sheet(0)
ws.write(3, 0, 'changed!')
workbooknew.save(u'有趣装逼每日数据及趋势copy.xls')

实操

  4、xlsxwriter可以写excel文件并加上图表

    1、安装
pip install xlsxwriter
    2、实操
 import xlsxwriter

 def get_chart(series):
chart = workbook.add_chart({'type': 'line'})
for ses in series:
name = ses["name"]
values = ses["values"]
chart.add_series({
'name': name,
'categories': 'A2:A10',
'values':values
})
chart.set_size({'width': 700, 'height': 350})
return chart if __name__ == '__main__':
workbook = xlsxwriter.Workbook(u'H5应用中心关键数据及趋势.xlsx')
worksheet = workbook.add_worksheet(u"每日PV,UV")
headings = ['日期', '平均值']
worksheet.write_row('A1', headings)
index = 0
for row in range(1,10):
for com in [0,1]:
worksheet.write(row,com,index)
index+=1
series = [{"name":"平均值","values":"B2:B10"}]
chart = get_chart(series)
chart.set_title ({'name': '每日页面分享数据'})
worksheet.insert_chart('H7', chart)
workbook.close()

实操

三、Python3实战

  1、Python处理excel并json序列化,并写入文件中

import  xlrd
from collections import OrderedDict
import json def login_pc_parameter():
#excel的路径
wb = xlrd.open_workbook('pc_login.xlsx')
convert_list = []
#处理的sheet,默认是第一个(索引值为0)
sh = wb.sheet_by_index(0)
#显示excel的标题,一般是第一行内容
title = sh.row_values(0) for rownum in range(1, sh.nrows):
#获取每行的数据
rowvalue = sh.row_values(rownum)
#使用有序字典类,防止乱序
single = OrderedDict()
for colnum in range(0, len(rowvalue)):
# print(title[colnum], rowvalue[colnum])
single[title[colnum]] = rowvalue[colnum]
convert_list.append(single) j = json.dumps(convert_list,ensure_ascii=False,indent=2)
# print(convert_list)
# print(j) with open("file3.json", "w",encoding="utf-8") as f:
f.write(j) if __name__ == '__main__':
login_pc_parameter()

二、使用Python操作PDF

  PDF(Portable Document Format)是一种便携式文档格式,这种文档格式与操作系统平台无关。PDF文件无论是在Windows,Unix还是在苹果公司的MacOS操作系统中都是通用的,这一特点使它成为在Internet上进行电子文档发行和数字化信息传播的理想文档格式。虽然PDF便于传输和阅读,但是,编辑PDF却很不容易。PyPDF2对编辑PDF提供了有限的支持,我们可以使用PyPDF2模块读取、合并和写入PDF文档。

一、PyPDF2 安装与介绍

  PyPDF2是一个纯Python的开源库,能够分割或合并PDF文件,也可以裁剪或转换 PDF文件中的页面。我们还可以使用PyPDF2查看PDF文件的元信息,对PDF文件进行加密,破解PDF文件的密码等。

  官网:https://pythonhosted.org/PyPDF2/

  安装

pip install PyPDF2

  PyPDF2提供了4个主要的类,分别是PdfFileWriter、PdfFileReader、PdfFileMerger和PageObject。前三个类分别用以读取PDF文件、写入PDF文件与合并PDF文件。PageObject类代表了一个PDF页面,可以使用PdfFileReader类的getPage方法得到一个PageObject对象。

二、使用PdfFileReader读取PDF文档

  学习一个库,最好的方式就是使用IPython进行练习。IPython能够看到程序的中间结果,也可以方便地获取帮助信息。接下来,我们就使用IPython学习PyPDF2的使用。在 IPython的交互模式下输入以下代码:

  1、获取pdf文档共有多少页

import PyPDF2

reader = PyPDF2.PdfFileReader(open(u'Python Linux系统管理与自动化运维.pdf', 'rb'))
num_pages = reader.getNumPages() print(num_pages)

  2、显示pdf文档的info信息

doc_info = reader.getDocumentInfo()

print(doc_info)

  结果如下

{'/CreationDate': "D:20171125012631+08'00'", '/Creator': 'Adobe Acrobat 11.0.10', '/ModDate': "D:20180430102312+08'00'", '/Producer': 'Adobe Acrobat Pro 11.0 Paper Capture Plug-in', '/Title': ''}

三、使用PdfFileWrite创建PDF文档

  对PDF文件进行加密、裁剪PDF文件、调整PDF页面的顺序等。我们需要编辑PDF页面。例如,去除PDF文件中的第一页,从一个PDF文件中提取几个页面保存到另一个文件。PyPDF2并不能直接编辑PDF文件,但是,我们可以利用PyPDF2从一个PDF文档拷贝需要的页面到另一个PDF文档,通过这种迂回的方式实现编辑PDF的功能。

  例如,我们现在要修改Python Linux系统管理与自动化运维.pdf文件,仅仅保存该文件的第2页、第5页和第6页。我们将这几个页面抽取出来,保存到另外一个PDF文件中,并对这个PDF文件进行加密。如下所示:

  1、将需要的内容写入新的pdf文件

import PyPDF2

reader= PyPDF2.PdfFileReader(open(u'Python Linux系统管理与自动化运维.pdf', 'rb'))
output= PyPDF2.PdfFileWriter()
output.addPage(reader.getPage(1))
output.addPage(reader.getPage(4))
output.addPage(reader.getPage(5))
output.getNumPages()

  创建了一个PdtFileWriter对象和一个PdtFileReader对象。接着,我们使用PdtFileReader对象的getPage方法获取需要的PDF页面,并通过PdtFileWriter对象的addPage方法增加页面。PdtFileWriter类有很多方法,如添加空白页的addBlankPage方法、添加书签的addBookmark方法、添加元信息的addMetadata方法以及对PDF进行加密的encrypt方法。在PdtFileWriter类的所有方法中,最常用的是addPage方法。

getNumPages方法获取PdtFileWriter拥有的PDF页面数。

  2、使用encrypt方法对PDF文件进行加密。

output.encrypt('')
outputStream = (open(u'Python Linux系统管理与自动化运维_test.pdf', 'wb'))
output.write(outputStream)
outputStream.close()

四、修改PDF页面

  需要修改PDF的页面,PyPDF2也提供了部分支持,如旋转页面、添加水印。PageObject类中有部分方法可以修改PDF页面,其中,rotateClockwise和rotateCounterClockwise方法用来旋转页面。这两个方法只接受一个参数,且参数取值必须是90的倍数,表示旋转多少度。下面的代码将redbooks.pdf文件的首页旋转180度,并保存到一个新的文件中。

  1、旋转文档

import PyPDF2
reader = PyPDF2.PdfFileReader(open(u'Python Linux系统管理与自动化运维.pdf', 'rb'))
writer = PyPDF2.PdfFileWriter()
page = reader.getPage(20)
page.rotateClockwise(90)
writer.addPage(page)
outputStream = open("test.pdf", "wb")
writer.write(outputStream)
outputStream.close()

  2、给文档添加水印

import PyPDF2
reader = PyPDF2.PdfFileReader(open(u'Python Linux系统管理与自动化运维.pdf', 'rb'))
watermark = PyPDF2.PdfFileReader(open(u'Python Linux系统管理与自动化运维.pdf', 'rb'))
writer = PyPDF2.PdfFileWriter() for i in range(reader.getNumPages()):
page = reader.getPage(i)
page.mergePage(watermark.getPage(0))
writer.addPage(page)
output_stream = open("watermark-test.pdf", 'wb')
writer.write(output_stream)
output_stream.close()

Python处理Excel和PDF文档的更多相关文章

  1. java操作office和pdf文件java读取word,excel和pdf文档内容

    在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应 ...

  2. 分享一下自己写的Python 3的各种PDF文档【花了半年时间那】

    这些文档花了我半年的时间去整理.因为是第一次进行整理,希望帮助后来者少走弯路.毕竟是第一次整理.哪些地方不到位,希望大家和我练习,我们一起把它做好,以下就直接给出下载地址了,都是免积分的下载奥.因此. ...

  3. Python处理Excel生成CSV文档

    Python是一种解释型的.动态数据类型的.面向对象的高级程序设计语言.拥有丰富的处理数据和文本类库,并且得益于它是一种解释型的语言,在程序修改和功能扩展上,可以很容易做到大规模的调整.综合考虑Pyt ...

  4. Python 处理EXCEL的CSV文档分列求SUM

    相对于导出EXCEL文件,PYTHON计算更为实时. import csv import sys from optparse import OptionParser def calculate_pro ...

  5. pyPdf - 用Python方便的处理PDF文档

    pyPdf库 ( http://pybrary.net/pyPdf/ ) ,操作起来相当直接易懂,把代码贴在这儿,做个记录.  1 from pyPdf import PdfFileWriter, P ...

  6. Python抓取单个网页中所有的PDF文档

    Github博文地址,此处更新可能不是很及时. 1.背景 最近发现算法以及数据结构落下了不少(其实还是大学没怎么好好学,囧rz),考虑到最近的项目结构越来越复杂了,用它来练练思路,就打算复习下数据结构 ...

  7. JSP生成WORD文档,EXCEL文档及PDF文档的方法

    转自:https://www.jb51.net/article/73528.htm 本文实例讲述了JSP生成WORD文档,EXCEL文档及PDF文档的方法.分享给大家供大家参考,具体如下: 在web- ...

  8. 程序生成word与PDF文档的方法&lpar;python&rpar;

    程序导出word文档的方法 将web/html内容导出为world文档,再java中有很多解决方案,比如使用Jacob.Apache POI.Java2Word.iText等各种方式,以及使用free ...

  9. Python监控进程性能数据并画图保存为PDF文档

    引言 利用psutil模块(https://pypi.python.org/pypi/psutil/),可以很方便的监控系统的CPU.内存.磁盘IO.网络带宽等性能參数,下面是否代码为监控某个特定程序 ...

随机推荐

  1. Android 自定义View 三板斧之三——重写View来实现全新控件

    通常情况下,Android实现自定义控件无非三种方式. Ⅰ.继承现有控件,对其控件的功能进行拓展. Ⅱ.将现有控件进行组合,实现功能更加强大控件. Ⅲ.重写View实现全新的控件 本文来讨论最难的一种 ...

  2. PreparedStatement ResultSet

    public int searchProblemDistinctCount() throws Exception { DBOperator dbo = getDBOperator(); try { P ...

  3. CISA 信息系统审计知识点 &lbrack;第一章&period; 信息系统审计过程 &rsqb;

    对有志成为审计师或者IT管理者de朋友, 第一章. 信息系统审计过程 1. IS 审计和保障标准.指南.工具.职业道德规范 信息技术保证框架(ITAF,Information Technology A ...

  4. c&num; 服务端

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. 新版本ButterKnife的配置

    新版本的ButterKnife的添加方式发生了变化,然后摸索着记录了一下. 按照ButterKnife的官网描述,使用ButterKnife需要在Gradle中添加如下依赖: compile 'com ...

  6. 有个程序猿要去当CEO了:(一)事情始末

    事情大概是这样的: 去年年底,我从原公司离职,原因大概是公司绩效不好,呆着也没意思. 后来听说,年终结算遣散了所有人. 今年年初的时候,前老板又找上我,说希望能和我再合作. 起先是想分我一部分干股,让 ...

  7. TCP&sol;IP协议栈 --- IP路由

    IP路由:当一个IP包在主机发送出去或者在网络当中时,是怎么选择路径到达目的主机的呢? 一般情况下, 如果说源主机和目的主机在同一个网络中的话,那个数据报可以直接到达目的主机而不经过路由器,下面可以试 ...

  8. SpringBoot(一)走进Springboot的世界

    什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员 ...

  9. PAT1001A&plus;B Format

    链接:https://www.patest.cn/contests/pat-a-practise/1001 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 ...

  10. 【XSY2519】神经元 prufer序列 DP

    题目描述 有\(n\)点,每个点有度数限制,\(\forall i(1\leq i\leq n)\),让你选出\(i\)个点,再构造一棵生成树,要求每个点的度数不超过度数限制.问你有多少种方案. \( ...