2021-08-15

Python办公自动化(Word,Excel,PDF)

Word自动化(Python使用python_doxs操作Word)

python_docx库是用于创建和编辑Microsoft Word文件的。

官方文档:https://python-docx.readthedocs.io/en/latest/index.html

Docx文介绍

Docx是允许开发者以非常简单的方式操作Word 2007/2010/2013文件的轻量级.NET组件。它的速度非常快,而且不需要安装微软的Office软件。
在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JnrNBb3c-1629013712958)(C:\Users\LENOVO\Pictures\20200509225516945.png)]

特性:

1)支持在文件中插入、删除和替代文本,支持所有的文本格式,如字体,颜色,大小,斜体字,下划线,删除线,高亮等。

2)支持段落的对齐方式,最新版本支持插入各级标题。

3)支持插入图片、超链接、表格、页眉页脚以及自定义属性等。

Python_docx 安装
pip install python_docx
创建,并写入Word文档
#代码摘自Python_docx官方文档
from docx import Document
from docx.shared import Inches

#创建一个document对象
document = Document()

#添加标题,并设置级别,范围为0-9,默认为1
document.add_heading('Document Title', 0)

#添加段落
p = document.add_paragraph('A plain paragraph having some ')
#在段落后追加文档,并且可以修改样式。bold:加粗;italic:倾斜
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True

#添加标题和段落
document.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='Intense Quote')

#添加前面是小圆点项目列表
document.add_paragraph(
    'first item in unordered list', style='List Bullet'
)

#添加前面是数字的项目列表
document.add_paragraph(
    'first item in ordered list', style='List Number'
)

#添加图片
document.add_picture('monty-truth.png', width=Inches(1.25))

#添加表格
records = (
    (3, '101', 'Spam'),
    (7, '422', 'Eggs'),
    (4, '631', 'Spam, spam, eggs, and spam')
)

table = document.add_table(rows=1, cols=3)
#获取第一行的单元格
hdr_cells = table.rows[0].cells

#设置上面第一行的单元格列表
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'
for qty, id, desc in records:
    row_cells = table.add_row().cells
    row_cells[0].text = str(qty)
    row_cells[1].text = id
    row_cells[2].text = desc

#添加分页
document.add_page_break()

#保存文档
document.save('path\demo.docx')

成品:

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BZW3azoP-1629013712965)(C:\Users\LENOVO\Pictures\QQ图片20210814095153.png)]

读取Word文档
from docx import Document
#1,python_docx读取文字
doc = Document('path')
for paragraph in doc.paragraphs:
    print(paragraph.text)
#2,提取文字块
paragraph = doc.paragraphs[0] #第一段的文字内容
runs = paragraph.runs
for run in paragraph.runs:
    print(run.text)

    
更改样式

什么是样式?

当类似元素的格式一致时,文档可以更好地交流。为了实现这种一致性,专业的文档设计人员开发了一个样式表,它定义了文档元素类型并指定了每个元素的格式。例如,也许正文段落要设置为 9 pt Times Roman,行高为 11 pt,对齐左齐平,右参差不齐。当这些规范应用于文档的每个元素时,就会实现一致和优美的外观。

Word 中的样式是一组可以一次性应用于文档元素的规范。Word 具有段落样式、字符样式、表格样式和编号定义。这些分别应用于段落、文本跨度、表格和列表。

#导入模块
from docx import Document
from docx.shared import Pt,RGBColor 
from docx.oxml.ns import qn

#修改文字字体样式
doc = Document('path')
for paragraph in doc.paragraphs:
    for run in paragraph.runs:
        run.font.bold = True #加粗
        run.font.italic = True #倾斜
        run.font.underline = True #下划线
        run.font.shadow = True #阴影
        run.font.size = Pt(18) #大小
        run.font.color.rgb = RGBColor(255,255,0) #颜色
        run.font.name = "宋体" #字体
        r = run._element.rPr.rFonts
        r.set(qn("w:eastAsia"),"宋体")
        
#修改段落
doc.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER #居中对齐
doc.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.LEFT #左对齐
doc.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.RIGHT #右对齐

#修改行间距
for paragraph in doc.paragraphs:
    paragraph.paragraph_format.line_spacing = 5.0
    
#修改段前和断后间距
paragraph.paragreph_format.space_before = Pt(12)



Excel自动化(Python使用xlrd,xlwt,openpyxl操作Excel)

xlrd文档:https://xlrd.readthedocs.io/en/latest/api.html

xlwt文档:https://xlrd.readthedocs.io/en/latest/api.html

openpyxl文档:https://openpyxl.readthedocs.io/en/stable/_modules/openpyxl/reader/excel.html

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dp8uYLNI-1629013712969)(C:\Users\LENOVO\Pictures\20200509213721104.png)]

xlrd
#安装
pip insatll xlrd

#导入
import xlrd
常用方法:
  • data = xlrd.open_workbook(‘path’) #打开Excel文件读取数据:

  • table = data.sheets()[0] #通过索引顺序获取

  • table = data.sheet_by_index(0) #通过索引顺序获取

  • table = data.sheet_by_name(u’Sheet1’) #通过名称获取

  • table.row_values(i),table.col_values(i) #获取整行和整列的值(数组)

  • nrows = table.nrows,ncols = table.ncols #获取行数和列数

  • for i in range(nrows ):

    ​ print table.row_values(i) #循环行列表数据

  • cell_A1 = table.cell(0,0).value,cell_C4 = table.cell(2,3).value #单元格的值

  • cell_A1 = table.row(0)[0].value,cell_A2 = table.col(1)[0].value #使用行列索引

#例子
import xlrd
book = xlrd.open_workbook('path')

#获取所有sheet名称
sheet_names = workbook.sheet_names()

# 获取所有的sheet对象
sheets_object = workbook.sheets()

# 通过index获取第一个sheet对象
sheet1_object = workbook.sheet_by_index(0)
    
# 通过name获取第一个sheet对象
sheet1_object = workbook.sheet_by_name(sheet_name="表1")

# 通过index判断sheet1是否导入
sheet1_is_load = workbook.sheet_loaded(sheet_name_or_index=0)
sheet1_is_load = workbook.sheet_loaded(sheet_name_or_index="表1")

# 获取sheet1中的有效行数
nrows = sheet1_object.nrows
all_row_values = sheet1_object.row_values(rowx=2)
row_values = sheet1_object.row_values(rowx=2, start_colx=1, end_colx=3)
row_object = sheet1_object.row(rowx=2)
row_slice = sheet1_object.row_slice(rowx=2)

# 获取sheet1中第3行的单元类型
row_types = sheet1_object.row_types(rowx=2)

# 获取sheet1中第3行的长度
row_len = sheet1_object.row_len(rowx=2)
rows_generator = sheet1_object.get_rows()

# 获取sheet1中的有效列数
ncols = sheet1_object.ncols
col_values = sheet1_object.col_values(colx=1)
col_values1 = sheet1_object.col_values(1, 1, 3)

# 获取sheet1中第2列的单元
col_slice = sheet1_object.col_slice(colx=1)
col_types = sheet1_object.col_types(colx=1)

# 获取sheet1中第rowx+1行,第colx+1列的单元对象
cell_info = sheet1_object.cell(rowx=1, colx=2)

# 获取sheet1中第rowx+1行,第colx+1列的单元值
cell_value = sheet1_object.cell_value(rowx=1, colx=2)

# 获取sheet1中第rowx+1行,第colx+1列的单元类型值
cell_type = sheet1_object.cell_type(rowx=1, colx=2)


xlwt
#安装
pip install xlwt

#导入
import xlwt

#创建一个workbook对象
workboook = xlwt.workbook()

#创建一个worksheet
worksheet = workbook.add_sheet('sheetname')

#写入数据:行,列,值。
worksheet.write(1, 0, lable = 'value')

#带样式写入数据
style = xlwt.XFStyle() # 初始化样式
font = xlwt.Font() # 为样式创建字体
font.name = 'Times New Roman' 
font.bold = True # 黑体
font.underline = True # 下划线
font.italic = True # 斜体字
style.font = font # 设定样式
worksheet.write(1, 0, '样式', style) # 带样式的写入

#设置单元格格
worksheet.col(0).width = 2333

#向单元格添加公式
worksheet.write(1, 0, xlwt.Formula('A1*B1')) 
worksheet.write(1, 1, xlwt.Formula('SUM(A1,B1)')) 

#合并行和列
worksheet.write_merge(0, 1, 0, 3, '合并') #合并第一行到第二行,第一列到第三列。

#设置对齐方式:
alignment = xlwt.Alignment() # 创建对其格式的对象
alignment.horz = xlwt.Alignment.HORZ_CENTER #左右对齐
"""
对齐方式:
# 水平对齐方式
HORZ_GENERAL                = 0x00
HORZ_LEFT                   = 0x01
HORZ_CENTER                 = 0x02
HORZ_RIGHT                  = 0x03
HORZ_FILLED                 = 0x04
HORZ_JUSTIFIED              = 0x05 # BIFF4-BIFF8X
HORZ_CENTER_ACROSS_SEL      = 0x06 # Centred across selection (BIFF4-BIFF8X)
HORZ_DISTRIBUTED            = 0x07 # Distributed (BIFF8X)
# 垂直对齐方式
VERT_TOP                    = 0x00
VERT_CENTER                 = 0x01
VERT_BOTTOM                 = 0x02
VERT_JUSTIFIED              = 0x03 # Justified (BIFF5-BIFF8X)
VERT_DISTRIBUTED            = 0x04 # Distributed (BIFF8X)
# 旋转角度
ROTATION_0_ANGLE            = 0x00
ROTATION_STACKED            = 0xFF
# 自动缩进设置
SHRINK_TO_FIT               = 0x01
NOT_SHRINK_TO_FIT           = 0x00
"""

#边框设置
borders = xlwt.Borders()  # 创建边框对象Create Borders
borders.left = xlwt.Borders.DASHED  #对边框对象进行操作,指定边框上下左右的边框类型为虚线
borders.right = xlwt.Borders.DASHED
borders.top = xlwt.Borders.DASHED
borders.bottom = xlwt.Borders.DASHED
borders.left_colour = 0x40      #指定上下左右的边框颜色为0x40
borders.right_colour = 0x40
borders.top_colour = 0x40
borders.bottom_colour = 0x40
style = xlwt.XFStyle()  # Create Style   #创建样式对象
style.borders = borders  # 将设置好的边框对象borders 加到样式对象style中。
worksheet.write(0, 0, '单元格内容', style)   #向单元格第一行第一列写入“单元格内容”,并使用创建好的样式对象style

#设置单元格背景
pattern = xlwt.Pattern() # 创建模式对象
pattern.pattern = xlwt.Pattern.SOLID_PATTERN 
pattern.pattern_fore_colour = 5 #设置模式颜色 
style = xlwt.XFStyle() # 创建样式对象
style.pattern = pattern # 将模式加入到样式对象
worksheet.write(0, 0, '内容', style)#向单元格写入内容时使用样式对象style

openpyxl
#下载
pip install openpyxl

#导入
from openpyxl import Workbook

#创建对象
wb = Workbook()
ws = wb.active

#保存数据
ws.save('path')

#打开文件
wd = load_workbook('path')

#查看表名
wb.sheetname()

for sheet in  wb:
    print(sheet.title) #循环遍历所用表

#创建sheet表
ws1 = wb.create_sheet("sheetname")

#选择表
ws2 = wb.get_sheet_by_name("sheetname")

#删除表
wb.remove(sheet)
del wb[sheet]

#访问单元格
cell = ws['A4']
cell2 = ws.cell(row=4, cloumn=2, value=10)
cell_range = ws['A2':'C4']  #通过切片多单元访问
col_range =ws['C:D'] #访问列 
row_range =ws['5:13'] #访问行
for row in  ws.iter_rows(min_row=1, max_col=3, max_row=2):
    for cell in  row:
        print(cell)  #通过for循环访问(行)
for row in  ws.iter_rows(min_row=1, max_col=3, max_row=2):
    for cell in  row:
        print(cell)  #通过for循环访问(列)
ws = wb.active #遍历所用

#获取每一行,每一列
for row in sheet.rows:
    for cell in row:
        print(cell.value)

for column in sheet.columns:
    for cell in column:
        print(cell.value
  
#导入的类
from openpyxl.styles import Font, colors, Alignment

# 字体
bold_itatic_24_font = Font(name='等线', size=24, italic=True, color=colors.RED, bold=True)
sheet['A1'].font = bold_itatic_24_font

# 设置B1中的数据垂直居中和水平居中
sheet['B1'].alignment = Alignment(horizontal='center', vertical='center')

#设置行高和列宽
sheet.row_dimensions[2].height = 40 # 第2行行高
sheet.column_dimensions['C'].width = 30 # C列列宽

#合并和拆分单元格
sheet.merge_cells('B1:G1') # 合并一行中的几个单元格
sheet.merge_cells('A1:C3') # 合并一个矩形区域中的单元格

#拆分单元格的代码。拆分后,值回到A1位置
sheet.unmerge_cells('A1:C3')

PDF自动化(Python使用PyPDF2操作PDF)

PDF是Portable Document Format的简称,意为“可携带文档格式”,是由Adobe Systems用于与应用程序、操作系统、硬件无关的方式进行文件交换所发展出的文件格式。PDF文件以PostScript语言图象模型为基础,无论在哪种打印机上都可保证精确的颜色和准确的打印效果,即PDF会忠实地再现原稿的每一个字符、颜色以及图象。而PyPDF2是python内处理PDF文件的模块。PyPDF 的前身是 pyPDf 包在2005年发布,该包的最后一个版本发布于2010年,后来大约经过一年左右, 名为 Phasit 的公司赞助 PyPdf 的一个分支后来命名为 PyPDF2,两个版本功能都基本一样,最大区别就是 PyPDF2 中 加入了支持 Python3 特性;PyPDF2 近期也没有再更新了,最近一个版本发布在2016年,但使用热度依然没有消退;虽然后面又出现了 PyPDF3、PyPDF4 等不同版本,但这些包并没有对 PyPDF2 功能向后完全兼容,用户受欢迎程度当然也不如 PyPDF2

PyPDF2文档:http://pythonhosted.org/PyPDF2/

#下载pip install pypdf2#导入from PyPDF2  import PdfFileReader,PDFFileReader#PDF信息提取with open(pdf_path, 'rb') as f:    pdf = PdfFileReader(f) 	infomation = pdf.getDocumentInfo() 	number_of_pages = pdf.getNumPages() 	txt = f'''{pdf_path} information: Author : {infomation.author}, Creator : {infomation.creator}, Producer : {infomation.producer}, Subject : {infomation.subject}, Title : {infomation.title}, Number of pages : {number_of_pages} ''' print(txt)     #提取文字 pdffile = open('example.pdf','rb')pdfReader = PyPDF2.PdfFileReader(pdffile)print(pdfReader.numPages) #获取pdf的页数page = pdfReader.getPage(0) #打开一个界面print(page.extractText()) #提取页面中的文字pdffile.close() #关闭页面中的文字#PDF旋转页面pdf_writer = PdfFileWriter()pdf_reader = PdfFileReader(pdf_path) page_1 = pdf_reader.getPage(0).rotateClockwise(90) #顺时针旋转90度pdf_writer.addPage(page_1)page_2 = pdf_reader.getPage(1).rotateCounterClockwise(90) #逆时针旋转90度pdf_writer.addPage(page_2)#pdf合并merge_pdf = 'path1'p1_reader = PdfFileReader('path2')p2_reader = PdfFileReader('path3')merge = PdfFileWriter()#将p1_reader添加如merge_pdf内for i in range(0,p1_reader.getNumPages()):    merge.addPage(p1_reader.getPage(i))#将p2_reader添加如merge_pdf内for j in range(0,p2_reader.getNumPages()):    merge.addPage(p2_reader.getPage(j))#输出with open(merge_pdf,'wb') as f:    merge.write(f)#pdf拆分pdf_reader = PdfFileReader('path')for i in range (0, pdf_reader.getNumber()): #也可以按页码范围分割:for i in range(a, b):    pdf_writer = PdfFileWriter()    pdf_writer.addPage(pdf_reader.getPage(i))    with open(save_path+'{}.pdf'.format(str(i)), 'wb') as fh: #将原PDF文件按业分割         pdf_writer.write(fh)    print('{} Save Sucessfully !\n'.format(str(i)))#pdf添加水印#pypdf2只能操作PDF对象,在添加水印的之前,需要预先准备一个PDF文件。watermark = 'path' #水印pdf = 'path' #要添加水印的文件watermark_obj = PdfFileReader(watermark)watermark_page = watermark_obj.getPage(0)pdf_reader = PdfFileReader('pdf')pdf_writer = PdfFileWriter()for page in range(pdf_reader.getNumber()):    page = pdf_reader.getPage(page)    page.mergePage(watermark_page)    pdf_writer.addPage(page)with open(output, 'wb') as out:    pdf_writer.write(out)    #pdf加密pdf_writer.encrypt(user_pwb = '密码')#pdf解密pdf_reader = pdf_reader.decrypt('密码')

方法总结;

PdfFileReader

  • decrypt(password):如果pdf文件加密的话,可以使用该方法对其解密。
  • getDocumentInfo():检索pdf文件的一些信息。
  • getNumPages():这个会pdf文件中的页数。
  • getPage(pageNumber):会得到pdf文件中对应的pageNumber页数的页面对象,返回值为PageObject实例。在得到PageObject实例之后就可以将其加添、插入等操作。
  • getPageNumber(page):与上面的方法对立,可以传入PageObject实例,然后得到该实例是pdf文件中第几页的。
  • getOutlines(node=None, outlines=None):检索文档中出现的文档大纲。
  • isEncrypted:记录该pdf是否加密。如果文件本身加密,即使在使用解密decrypt方法之后,还是会返回true。
  • numPages:pdf总共的页数,相当于访问getNumPages()的只读属性。

PdfFileWriter

  • addAttachment(fname, fdata):向pdf添加文件。
  • addBlankPage(width=None, height=None):给pdf添加一个空白页到最后,如果没有指定大小就使用当前Weiter中pdf最后一页的大小。
  • addPage(page):添加page到pdf中,通常这个page是由上面的Reader获取的。
  • appendPagesFromReader(reader, after_page_append=None):将reader中的数据拷贝到当前的Writer实例中,并且如果指定after_page_append的话,最后还有回掉该函数并且将writer中的数据传入其中。
  • encrypt(user_pwd, owner_pwd=None, use_128bit=True):将pdf进行加密,其中官方说userpwd是允许用户使用一些限制的权限打开pdf文件,也就是使用该密码的话可能会有一些限制,但是本人并没有在文档中找到设置权限的内容。而ownerpwd则是允许用户无限制的使用。第三个参数是是否使用128位加密。
  • getNumPages():得到pdf页数。
  • getPage(pageNumber):得到对应页数的Page,是一个PageObject对象,可以使用上面的addPage方法将page进行添加。
  • insertPage(page, index=0):将page添加到pdf中,index指定的是被插入的位置。
  • write(stream):将该Writer中的内容写入到文件中。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值