Python自動(dòng)化處理Excel、Word、PDF文檔的操作大全
Python 辦公自動(dòng)化完全指南:Excel、PDF 與 Word
在日常工作中,處理 Excel 表格、PDF 文檔和 Word 文檔是必不可少的任務(wù)。Python 提供了強(qiáng)大的第三方庫(kù)來幫助我們自動(dòng)化這些重復(fù)性工作,極大提高效率。本文將詳細(xì)介紹如何使用 openpyxl 操作 Excel,使用 PyPDF2 和 pdfplumber 操作 PDF,以及使用 python-docx 操作 Word。
章節(jié)一:Python 使用 openpyxl 操作 Excel
openpyxl 是一個(gè)用于讀寫 Excel 2010 xlsx/xlsm/xltx/xltm 文件的 Python 庫(kù)。
1、openpyxl 庫(kù)介紹
- 安裝:
pip install openpyxl
- 核心概念:
Workbook: 工作簿(整個(gè) Excel 文件)Worksheet: 工作表(Sheet)Cell: 單元格
2、Python 怎么打開及讀取表格內(nèi)容?
1)Excel 表格術(shù)語
- Workbook: Excel 文件對(duì)象
- Sheet: 表單
- Row: 行(從 1 開始)
- Column: 列(從 A 開始或從 1 開始)
- Cell: 單元格
2)打開 Excel 表格并獲取表格名稱
from openpyxl import load_workbook
# 加載工作簿
wb = load_workbook('example.xlsx')
# 獲取所有 sheet 名稱
print(wb.sheetnames)
# 輸出: ['Sheet1', 'Sheet2']

3)通過 sheet 名稱獲取表格
# 獲取特定的 sheet ws = wb['Sheet1'] # 或者獲取當(dāng)前活躍的 sheet ws_active = wb.active print(ws.title)

4)獲取表格的尺寸大小
# 獲取表格的最大行和最大列
print(f"最大行: {ws.max_row}")
print(f"最大列: {ws.max_column}")
# output: 尺寸: A1:C10
print(f"尺寸: {ws.dimensions}")

5)獲取表格內(nèi)某個(gè)格子的數(shù)據(jù)
① sheet[“A1”] 方式
cell_value = ws['A1'].value print(cell_value)
② sheet.cell(row=, column=) 方式
# 注意:row 和 column 都是從 1 開始 cell_value = ws.cell(row=1, column=1).value print(cell_value)

6)獲取某個(gè)格子的行數(shù)、列數(shù)、坐標(biāo)
c = ws['B2']
print(f"行: {c.row}, 列: {c.column}, 坐標(biāo): {c.coordinate}")
7)獲取一系列格子
① sheet[] 方式
# 獲取 A 列
col_a = ws['A']
# 獲取 A 到 C 列
col_range = ws['A:C']
# 獲取第 1 行
row_1 = ws[1]
# 獲取 A1 到 C3 的區(qū)域
cell_range = ws['A1:C3']
for row in cell_range:
for cell in row:
print(cell.value)

② .iter_rows() 方式
按行迭代,返回生成器,效率更高。
for row in ws.iter_rows(min_row=1, max_row=2, min_col=1, max_col=3):
for cell in row:
print(cell.value)

③ sheet.rows
返回所有行的生成器。
for row in ws.rows:
print(row) # tuple of cells

3、Python 如何向 Excel 中寫入某些內(nèi)容?
1)修改表格中的內(nèi)容
① 向某個(gè)格子中寫入內(nèi)容并保存
ws['A1'] = 'Hello World'
ws.cell(row=1, column=2, value='Python')
# 保存文件(如果是修改現(xiàn)有文件,建議另存為新文件名以防數(shù)據(jù)丟失)
wb.save('modified_example.xlsx')

② .append():向表格中插入行數(shù)據(jù)
非常常用的方法,用于在表格末尾追加一行數(shù)據(jù)。
# 添加一行數(shù)據(jù) ws.append(['Name', 'Age', 'Gender']) ws.append(['Alice', 25, 'Female'])

③ 在 Python 中使用 Excel 函數(shù)公式
ws['C1'] = 10 ws['C2'] = 20 ws['C3'] = '=SUM(C1:C2)' # 寫入公式

④ .insert_cols() 和 .insert_rows():插入空行和空列
ws.insert_rows(idx=2, amount=1) # 在第2行前插入1行 ws.insert_cols(idx=1, amount=2) # 在第1列前插入2列

⑤ .delete_rows() 和 .delete_cols():刪除行和列
ws.delete_rows(idx=2, amount=1) # 刪除第2行 ws.delete_cols(idx=1, amount=1) # 刪除第1列

⑥ .move_range():移動(dòng)格子
# 將 A1:C3 區(qū)域向下移動(dòng) 2 行,向右移動(dòng) 1 列
ws.move_range("A1:C3", rows=2, cols=1)

⑦ .create_sheet():創(chuàng)建新的 sheet 表格
ws_new = wb.create_sheet("NewSheet", index=0) # index=0 插入到最前面

⑧ .remove():刪除某個(gè) sheet 表
del wb['NewSheet'] # 或者 # wb.remove(wb['NewSheet'])

⑨ .copy_worksheet():復(fù)制一個(gè) sheet 表
source = wb.active target = wb.copy_worksheet(source) target.title = "Copy of Active"

⑩ sheet.title:修改 sheet 表的名稱
ws.title = "My Renamed Sheet"

? 創(chuàng)建新的 Excel 表格文件
from openpyxl import Workbook
wb_new = Workbook()
ws_new = wb_new.active
ws_new.title = "Data"
wb_new.save("new_file.xlsx")
wb.save('modified_example.xlsx')

? sheet.freeze_panes:凍結(jié)窗口
ws.freeze_panes = 'A2' # 凍結(jié)第一行 # ws.freeze_panes = 'B1' # 凍結(jié)第一列

? sheet.auto_filter.ref:給表格添加“篩選器”
from openpyxl import load_workbook
wb = load_workbook('example.xlsx')
ws = wb.active
ws.auto_filter.ref = ws.dimensions # 給所有有數(shù)據(jù)的區(qū)域添加篩選
# 或者指定區(qū)域
ws.auto_filter.ref = "A1:C10"
wb.save('modified_example.xlsx')

4、批量調(diào)整字體和樣式
需要導(dǎo)入 openpyxl.styles 模塊。
1)修改字體樣式
from openpyxl.styles import Font
ws = wb.active
# 粗體,斜體,紅色,字號(hào)20
font_style = Font(name='Arial', size=20, bold=True, italic=True, color='FF0000')
ws['A1'].font = font_style
wb.save('modified_example.xlsx')

2)獲取表格中格子的字體樣式
current_font = ws['A1'].font print(current_font.name, current_font.size)

3)設(shè)置對(duì)齊樣式
from openpyxl.styles import Alignment
# 水平居中,垂直居中,自動(dòng)換行
align = Alignment(horizontal='center', vertical='center', wrap_text=True)
ws['A1'].alignment = align
wb.save('modified_example.xlsx')

4)設(shè)置邊框樣式
from openpyxl import load_workbook
from openpyxl.styles import Border, Side
wb = load_workbook('example.xlsx')
ws = wb.active
# 使用雙線邊框,視覺上看起來更粗
double_border = Side(border_style="double", color="FF0000")
border = Border(left=double_border,
right=double_border,
top=double_border,
bottom=double_border)
ws['A1'].border = border
wb.save('modified_example.xlsx')
"thin" - 細(xì)邊框
"medium" - 中等粗細(xì)
"thick" - 粗邊框
"double" - 雙線邊框
"hair" - 極細(xì)邊框
"dashed" - 虛線邊框
"dotted" - 點(diǎn)線邊框等

5)設(shè)置填充樣式
from openpyxl import load_workbook
from openpyxl.styles import PatternFill
# 加載工作簿
wb = load_workbook('example.xlsx')
ws = wb.active
# 黃色背景填充
fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")
ws['A1'].fill = fill
# 保存修改
wb.save('modified_example.xlsx')

6)設(shè)置行高和列寬
from openpyxl import load_workbook
# 加載工作簿
wb = load_workbook('example.xlsx')
ws = wb.active
ws.row_dimensions[1].height = 30 # 設(shè)置第1行高度
ws.column_dimensions['A'].width = 20 # 設(shè)置A列寬度
# 保存修改
wb.save('modified_example.xlsx')

7)合并單元格
from openpyxl import load_workbook
# 加載工作簿
wb = load_workbook('example.xlsx')
ws = wb.active
ws.merge_cells('A1:B2')
# 或者
# ws.merge_cells(start_row=1, start_column=1, end_row=2, end_column=2)
# 取消合并
# ws.unmerge_cells('A1:B2')
# 保存修改
wb.save('modified_example.xlsx')

章節(jié)二:Python 使用 PyPDF2 和 pdfplumber 操作 PDF
1、PyPDF2 和 pdfplumber 庫(kù)介紹
PyPDF2: 主要用于合并、拆分、旋轉(zhuǎn)、加密 PDF 等頁(yè)面級(jí)操作,提取文本能力較弱。
pdfplumber: 專注于提取 PDF 中的文本和表格,準(zhǔn)確率較高。
安裝:
pip install PyPDF2 pdfplumber
2、Python 提取 PDF 文字內(nèi)容
1)利用 pdfplumber 提取文字
import pdfplumber
with pdfplumber.open("荷塘月色.pdf") as pdf:
for page in pdf.pages:
text = page.extract_text()
print(f"--- Page {page.page_number} ---")
print(text)

2)利用 pdfplumber 提取表格并寫入 Excel
import pdfplumber
import pandas as pd
with pdfplumber.open("example_table.pdf") as pdf:
page = pdf.pages[0] # 假設(shè)表格在第一頁(yè)
table = page.extract_table()
if table:
df = pd.DataFrame(table[1:], columns=table[0]) # 假設(shè)第一行是表頭
df.to_excel("output_table.xlsx", index=False)

3、PDF 合并及頁(yè)面的排序和旋轉(zhuǎn)
使用 PyPDF2 進(jìn)行操作。
1)分割及合并 PDF
① 合并 PDF
from PyPDF2 import PdfMerger
merger = PdfMerger()
pdfs = ['example_table1.pdf', 'example_table2.pdf']
for pdf in pdfs:
merger.append(pdf)
merger.write("merged_result.pdf")
merger.close()

② 拆分 PDF
from PyPDF2 import PdfReader, PdfWriter
reader = PdfReader("merged_result.pdf")
for i, page in enumerate(reader.pages):
writer = PdfWriter()
writer.add_page(page)
with open(f"page_{i+1}.pdf", "wb") as f:
writer.write(f)

2)旋轉(zhuǎn)及排序 PDF
① 旋轉(zhuǎn) PDF
from PyPDF2 import PdfReader, PdfWriter
reader = PdfReader("荷塘月色.pdf")
writer = PdfWriter()
page = reader.pages[0]
page.rotate(90) # 順時(shí)針旋轉(zhuǎn)90度
writer.add_page(page)
with open("rotated.pdf", "wb") as f:
writer.write(f)

② 排序 PDF
可以通過調(diào)整 add_page 的順序來實(shí)現(xiàn)。
# 假設(shè)倒序保存
from PyPDF2 import PdfReader, PdfWriter
reader = PdfReader("荷塘月色.pdf")
writer = PdfWriter()
for page in reversed(reader.pages):
writer.add_page(page)
with open("reversed.pdf", "wb") as f:
writer.write(f)

4、PDF 批量加水印及加密、解密
1)批量加水印
原理:將水印頁(yè)面作為“印章”蓋在每一頁(yè)上。
from PyPDF2 import PdfReader, PdfWriter
watermark = PdfReader("watermark.pdf").pages[0]
reader = PdfReader("content.pdf")
writer = PdfWriter()
for page in reader.pages:
page.merge_page(watermark) # 合并頁(yè)面
writer.add_page(page)
with open("watermarked.pdf", "wb") as f:
writer.write(f)

2)批量加密、解密
① 加密 PDF
from PyPDF2 import PdfReader, PdfWriter
writer = PdfWriter()
reader = PdfReader("荷塘月色.pdf")
for page in reader.pages:
writer.add_page(page)
writer.encrypt("password123") # 設(shè)置密碼
with open("encrypted.pdf", "wb") as f:
writer.write(f)

② 解密 PDF 并保存為未加密的 PDF
from PyPDF2 import PdfReader, PdfWriter
reader = PdfReader("encrypted.pdf")
if reader.is_encrypted:
reader.decrypt("password123")
writer = PdfWriter()
for page in reader.pages:
writer.add_page(page)
with open("decrypted.pdf", "wb") as f:
writer.write(f)

章節(jié)三:Python 使用 python-docx 操作 Word
1、python-docx 庫(kù)介紹
- 用途:用于創(chuàng)建和更新 .docx 文件。
- 安裝:
pip install python-docx
2、Python 讀取 Word 文檔內(nèi)容
1)Word 文檔結(jié)構(gòu)介紹
- Document: 整個(gè)文檔
- Paragraph: 段落(回車符分隔)
- Run: 文本塊(具有相同樣式的連續(xù)文本)
2)python-docx 提取文字和文字塊兒
① python-docx 提取文字
from docx import Document
doc = Document("example.docx")
full_text = []
for para in doc.paragraphs:
full_text.append(para.text)
print("\n".join(full_text))

② python-docx 提取文字塊兒
from docx import Document
doc = Document("example.docx")
for para in doc.paragraphs:
for run in para.runs:
print(run.text) # 打印每個(gè)樣式塊的文本

3)利用 Python 向 新建Word 文檔寫入內(nèi)容
① 添加段落
from docx import Document
doc = Document()
p = doc.add_paragraph('這是一個(gè)新段落。')
doc.save('test_save.docx')

② 添加文字塊兒
from docx import Document
doc = Document()
p = doc.add_paragraph('這是一個(gè)新段落。')
run = p.add_run('這是加粗的文字。')
run.bold = True
p.add_run('這是普通的文字。')
doc.save('test_save.docx')

③ 添加一個(gè)分頁(yè)
from docx import Document
doc = Document()
p = doc.add_paragraph('這是一個(gè)新段落。')
run = p.add_run('這是加粗的文字。')
run.bold = True
p.add_run('這是普通的文字。')
doc.add_page_break()
doc.save('test_save.docx')

④ 添加圖片
from docx import Document
from docx.shared import Inches
doc = Document()
p = doc.add_paragraph('這是一個(gè)新段落。')
run = p.add_run('這是加粗的文字。')
run.bold = True
p.add_run('這是普通的文字。')
# doc.add_page_break()
doc.add_picture('img.jpg', width=Inches(1.25)) # 需要 from docx.shared import Inches
doc.save('test_save.docx')

⑤ 添加表格
from docx import Document
doc = Document()
table = doc.add_table(rows=2, cols=2)
table.cell(0, 0).text = "A1"
table.cell(0, 1).text = "B1"
doc.save('test_save.docx')

⑥ 提取 Word 表格,并保存在 Excel 中
import pandas as pd
from docx import Document
doc = Document("test_save.docx")
tables_data = []
for table in doc.tables:
for row in table.rows:
row_data = [cell.text for cell in row.cells]
tables_data.append(row_data)
df = pd.DataFrame(tables_data)
df.to_excel("word_tables.xlsx", index=False)

3、利用 Python 調(diào)整 Word 文檔樣式
1)修改文字字體樣式
from docx import Document
from docx.shared import Pt, RGBColor
from docx.oxml.ns import qn
doc = Document()
p = doc.add_paragraph()
run = p.add_run('自定義樣式文字')
run.font.size = Pt(14)
run.font.color.rgb = RGBColor(0x42, 0x24, 0xE9)
# 設(shè)置中文字體需要特殊處理
run.font.name = '微軟雅黑'
run._element.rPr.rFonts.set(qn('w:eastAsia'), '微軟雅黑')
doc.save('test_save.docx')

2)修改段落樣式
① 對(duì)齊樣式
from docx import Document
from docx.shared import Pt, RGBColor
from docx.oxml.ns import qn
from docx.enum.text import WD_ALIGN_PARAGRAPH
doc = Document()
p = doc.add_paragraph()
run = p.add_run('自定義樣式文字')
run.font.size = Pt(14)
run.font.color.rgb = RGBColor(0x42, 0x24, 0xE9)
# 設(shè)置中文字體需要特殊處理
run.font.name = '微軟雅黑'
run._element.rPr.rFonts.set(qn('w:eastAsia'), '微軟雅黑')
p.alignment = WD_ALIGN_PARAGRAPH.CENTER # 居中
doc.save('test_save.docx')

② 行間距調(diào)整
from docx import Document
from docx.shared import Pt, RGBColor
from docx.oxml.ns import qn
from docx.enum.text import WD_ALIGN_PARAGRAPH
doc = Document()
p = doc.add_paragraph()
run = p.add_run('自定義樣式文字測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試')
run.font.size = Pt(14)
run.font.color.rgb = RGBColor(0x42, 0x24, 0xE9)
# 設(shè)置中文字體需要特殊處理
run.font.name = '微軟雅黑'
run._element.rPr.rFonts.set(qn('w:eastAsia'), '微軟雅黑')
p.alignment = WD_ALIGN_PARAGRAPH.CENTER # 居中
p.paragraph_format.line_spacing = 1.5 # 1.5倍行距
doc.save('test_save.docx')

③ 段前與段后間距
from docx import Document
from docx.shared import Pt, RGBColor
from docx.oxml.ns import qn
from docx.enum.text import WD_ALIGN_PARAGRAPH
doc = Document()
p = doc.add_paragraph()
run = p.add_run('自定義樣式文字測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試')
run.font.size = Pt(14)
run.font.color.rgb = RGBColor(0x42, 0x24, 0xE9)
# 設(shè)置中文字體需要特殊處理
run.font.name = '微軟雅黑'
run._element.rPr.rFonts.set(qn('w:eastAsia'), '微軟雅黑')
p.alignment = WD_ALIGN_PARAGRAPH.CENTER # 居中
p.paragraph_format.line_spacing = 1.5 # 1.5倍行距
p.paragraph_format.space_before = Pt(12) # 段前12磅
p.paragraph_format.space_after = Pt(12) # 段后12磅
p = doc.add_paragraph()
run = p.add_run('自定義樣式文字測(cè)試2測(cè)試2測(cè)試2測(cè)試2測(cè)試2測(cè)試2測(cè)試2測(cè)試2測(cè)試2測(cè)試2測(cè)試2測(cè)試2測(cè)試2測(cè)試2測(cè)試2測(cè)試2測(cè)試2測(cè)試2測(cè)試2測(cè)試2測(cè)試2')
doc.save('test_save.docx')

注意:以上代碼示例需要配合相應(yīng)的文件環(huán)境運(yùn)行。使用前請(qǐng)確保已安裝 openpyxl, pandas, PyPDF2, pdfplumber, python-docx 等庫(kù)。
以上就是Python自動(dòng)化處理Excel、Word、PDF文檔的操作大全的詳細(xì)內(nèi)容,更多關(guān)于Python處理Excel、Word、PDF文檔的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python 實(shí)現(xiàn)二維列表轉(zhuǎn)置
今天小編就為大家分享一篇python 實(shí)現(xiàn)二維列表轉(zhuǎn)置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12
Python如何寫入Pandas DataFrame到CSV文件
Pandas是一個(gè)功能強(qiáng)大的Python數(shù)據(jù)分析庫(kù),常用于處理和分析數(shù)據(jù),CSV文件是一種廣泛使用的數(shù)據(jù)交換格式,Pandas通過to_csv方法支持將DataFrame寫入CSV文件,此方法允許用戶指定分隔符、編碼和選擇性寫入特定列等2024-09-09
解決使用OpenCV中的imread()內(nèi)存報(bào)錯(cuò)問題
這篇文章主要介紹了解決使用OpenCV中的imread()內(nèi)存報(bào)錯(cuò)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03
tensorflow 用矩陣運(yùn)算替換for循環(huán) 用tf.tile而不寫for的方法
今天小編就為大家分享一篇tensorflow 用矩陣運(yùn)算替換for循環(huán) 用tf.tile而不寫for的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07
python用10行代碼實(shí)現(xiàn)對(duì)黃色圖片的檢測(cè)功能
這篇文章主要介紹了python用10行代碼實(shí)現(xiàn)對(duì)黃色圖片的檢測(cè)功能,涉及Python基于圖片庫(kù)PIL對(duì)圖片的檢測(cè)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
PyCharm 解決找不到新打開項(xiàng)目的窗口問題
這篇文章主要介紹了PyCharm 解決找不到新打開項(xiàng)目的窗口問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01

