Python操作Word文檔7種方法的實(shí)現(xiàn)與對(duì)比(史上最全)
在Python中操作Word文檔是一項(xiàng)常見的任務(wù),特別是在辦公自動(dòng)化和數(shù)據(jù)處理領(lǐng)域。本文將詳細(xì)總結(jié)和對(duì)比幾種常用的Python庫(kù)和方法,包括它們的優(yōu)缺點(diǎn)、適用場(chǎng)景以及具體的代碼示例。我們將深入探討每種方法的具體功能和使用技巧,幫助你更好地理解和選擇合適的方法。
1. python-docx
概述:
python-docx 是一個(gè)用于創(chuàng)建和修改Microsoft Word文檔(.docx格式)的Python庫(kù)。它提供了豐富的API,使得開發(fā)者可以輕松地生成和編輯Word文檔。
主要功能:
- 創(chuàng)建新的Word文檔
- 添加段落、標(biāo)題、圖片、表格等
- 設(shè)置文本格式(字體、大小、顏色等)
- 讀取和修改現(xiàn)有文檔的內(nèi)容
- 插入分頁(yè)符、書簽、超鏈接等
優(yōu)點(diǎn):
- 跨平臺(tái):可以在任何支持Python的平臺(tái)上運(yùn)行。
- 易于使用:API簡(jiǎn)潔明了,文檔詳盡。
- 功能豐富:支持多種文檔元素的創(chuàng)建和編輯。
缺點(diǎn):
- 只支持 .docx 格式,不支持 .doc 格式。
- 對(duì)于復(fù)雜的Word文檔(如包含宏或嵌入對(duì)象的文檔)支持有限。
適用場(chǎng)景:
- 創(chuàng)建和編輯簡(jiǎn)單的Word文檔。
- 自動(dòng)生成報(bào)告、簡(jiǎn)歷等文檔。
- 批量處理Word文檔。
詳細(xì)功能和代碼示例:
1.創(chuàng)建和編輯文檔
from docx import Document from docx.shared import Pt, Inches # 創(chuàng)建一個(gè)新的文檔 doc = Document() # 添加標(biāo)題 doc.add_heading('文檔標(biāo)題', 0) # 添加段落 doc.add_paragraph('這是文檔的第一個(gè)段落。') # 添加帶有樣式的文本 p = doc.add_paragraph('這是一個(gè)帶') run = p.add_run('有特殊格式') run.bold = True run.italic = True # 設(shè)置字體樣式 run = p.add_run('這是設(shè)置字體的文本') run.font.name = 'Arial' run.font.size = Pt(14) run.font.bold = True run.font.italic = True run.font.color.rgb = RGBColor(0xFF, 0x00, 0x00) # 紅色 # 添加圖片 doc.add_picture('path_to_image.jpg', width=Inches(1.25)) # 添加表格 table = doc.add_table(rows=2, cols=3) table.cell(0, 0).text = '行1列1' table.cell(0, 1).text = '行1列2' table.cell(1, 0).text = '行2列1' # 添加分頁(yè)符 doc.add_page_break() # 添加書簽 p = doc.add_paragraph('這是書簽位置') p.add_bookmark('bookmark_name') # 添加超鏈接 p = doc.add_paragraph('這是一個(gè)超鏈接:') run = p.add_hyperlink('https://www.example.com', '點(diǎn)擊這里') # 保存文檔 doc.save('example.docx')
2.讀取和修改現(xiàn)有文檔
from docx import Document # 打開現(xiàn)有文檔 doc = Document('existing_document.docx') # 讀取文檔內(nèi)容 for para in doc.paragraphs: print(para.text) # 修改文檔內(nèi)容 para = doc.paragraphs[0] para.text = '這是修改后的內(nèi)容' # 添加新段落 doc.add_paragraph('這是添加的新段落') # 刪除段落 para = doc.paragraphs[1] p = para._element p.getparent().remove(p) p._p = p._element = None # 保存修改后的文檔 doc.save('modified_document.docx')
2. docx-mailmerge
概述:
docx-mailmerge 是一個(gè)用于批量生成Word文檔的庫(kù)。它允許你在Word模板中定義占位符,然后通過(guò)Python腳本填充這些占位符,生成多個(gè)類似的文檔。
主要功能:
- 讀取Word模板文件
- 替換模板中的占位符
- 生成多個(gè)文檔
優(yōu)點(diǎn):
- 簡(jiǎn)單易用:只需要定義模板和數(shù)據(jù)即可生成多個(gè)文檔。
- 支持復(fù)雜的數(shù)據(jù)結(jié)構(gòu):可以處理嵌套的數(shù)據(jù)。
缺點(diǎn):
- 功能相對(duì)單一:主要適用于郵件合并場(chǎng)景。
- 不支持復(fù)雜的文檔編輯操作。
適用場(chǎng)景:
- 批量生成合同、發(fā)票、證書等文檔。
- 自動(dòng)化生成個(gè)性化報(bào)告。
詳細(xì)功能和代碼示例:
創(chuàng)建模板和生成文檔
from mailmerge import MailMerge # 打開模板文件 template = MailMerge('template.docx') # 查看模板中的占位符 print(template.get_merge_fields()) # 定義數(shù)據(jù) data = { 'name': 'John Doe', 'address': '123 Main St', 'city': 'Anytown', 'state': 'Anystate', 'zip': '12345' } # 生成文檔 template.merge(**data) template.write('output.docx') # 生成多個(gè)文檔 data_list = [ {'name': 'John Doe', 'address': '123 Main St', 'city': 'Anytown', 'state': 'Anystate', 'zip': '12345'}, {'name': 'Jane Smith', 'address': '456 Elm St', 'city': 'Othertown', 'state': 'Otherstate', 'zip': '67890'} ] for i, data in enumerate(data_list): template.merge(**data) template.write(f'output_{i+1}.docx')
3. win32com.client
概述:
win32com.client 是一個(gè)用于在Python中調(diào)用Windows COM對(duì)象的庫(kù)。通過(guò)它,你可以直接控制Microsoft Word應(yīng)用程序,實(shí)現(xiàn)對(duì)Word文檔的高級(jí)操作。
主要功能:
- 打開和關(guān)閉Word應(yīng)用程序
- 創(chuàng)建和編輯文檔
- 讀取和修改文檔內(nèi)容
- 處理復(fù)雜的文檔結(jié)構(gòu)(如宏、嵌入對(duì)象等)
優(yōu)點(diǎn):
- 功能強(qiáng)大:可以實(shí)現(xiàn)幾乎所有的Word操作。
- 支持 .doc 和 .docx 格式。
缺點(diǎn):
- 僅限Windows平臺(tái)。
- 學(xué)習(xí)曲線較陡峭:需要熟悉COM對(duì)象和Word的內(nèi)部結(jié)構(gòu)。
- 性能較低:由于需要啟動(dòng)Word應(yīng)用程序,可能會(huì)有性能損失。
適用場(chǎng)景:
- 需要進(jìn)行復(fù)雜文檔操作的場(chǎng)景。
- 處理包含宏或嵌入對(duì)象的文檔。
詳細(xì)功能和代碼示例:
1.創(chuàng)建和編輯文檔
import os from win32com.client import Dispatch # 打開Word應(yīng)用程序 word = Dispatch('Word.Application') word.Visible = 0 # 后臺(tái)運(yùn)行,不顯示 word.DisplayAlerts = 0 # 不顯示警告 # 創(chuàng)建新文檔 doc = word.Documents.Add() # 添加標(biāo)題 doc.Paragraphs.Add().Range.Text = '文檔標(biāo)題' doc.Paragraphs.Last.Range.Font.Bold = True doc.Paragraphs.Last.Range.Font.Size = 16 # 添加段落 doc.Paragraphs.Add().Range.Text = '這是文檔的第一個(gè)段落。' # 添加帶有樣式的文本 p = doc.Paragraphs.Add().Range p.Text = '這是一個(gè)帶' p.Font.Bold = False p.Font.Italic = False p.Collapse(0) # wdCollapseEnd p.Text = '有特殊格式' p.Font.Bold = True p.Font.Italic = True # 設(shè)置字體樣式 p.Collapse(0) # wdCollapseEnd p.Text = '這是設(shè)置字體的文本' p.Font.Name = 'Arial' p.Font.Size = 14 p.Font.Bold = True p.Font.Italic = True p.Font.Color = 255 # 紅色 # 添加圖片 doc.InlineShapes.AddPicture('path_to_image.jpg', LinkToFile=False, SaveWithDocument=True) # 添加表格 table = doc.Tables.Add(Range=doc.Paragraphs.Add().Range, NumRows=2, NumColumns=3) table.Cell(1, 1).Range.Text = '行1列1' table.Cell(1, 2).Range.Text = '行1列2' table.Cell(2, 1).Range.Text = '行2列1' # 添加分頁(yè)符 doc.Paragraphs.Add().Range.InsertBreak(7) # wdPageBreak # 添加書簽 doc.Bookmarks.Add('bookmark_name', doc.Paragraphs.Add().Range) doc.Bookmarks['bookmark_name'].Range.Text = '這是書簽位置' # 添加超鏈接 p = doc.Paragraphs.Add().Range p.Hyperlinks.Add(Anchor=p, Address='https://www.example.com', SubAddress='', ScreenTip='點(diǎn)擊這里', TextToDisplay='點(diǎn)擊這里') # 保存文檔 doc.SaveAs('example.docx') # 關(guān)閉文檔和Word應(yīng)用程序 doc.Close() word.Quit()
2.讀取和修改現(xiàn)有文檔
import os from win32com.client import Dispatch # 打開Word應(yīng)用程序 word = Dispatch('Word.Application') word.Visible = 0 # 后臺(tái)運(yùn)行,不顯示 word.DisplayAlerts = 0 # 不顯示警告 # 打開現(xiàn)有文檔 doc = word.Documents.Open('existing_document.docx') # 讀取文檔內(nèi)容 for para in doc.Paragraphs: print(para.Range.Text) # 修改文檔內(nèi)容 para = doc.Paragraphs[0] para.Range.Text = '這是修改后的內(nèi)容' # 添加新段落 doc.Paragraphs.Add().Range.Text = '這是添加的新段落' # 刪除段落 para = doc.Paragraphs[1] para.Range.Delete() # 保存修改后的文檔 doc.Save() # 關(guān)閉文檔和Word應(yīng)用程序 doc.Close() word.Quit()
4. mammoth
概述:
mammoth 是一個(gè)用于將Word文檔(.docx格式)轉(zhuǎn)換為HTML的庫(kù)。它可以幫助你將Word文檔的內(nèi)容提取出來(lái),以便在Web應(yīng)用中使用。
主要功能:
- 將 .docx 文件轉(zhuǎn)換為 HTML
- 提取文檔中的文本和樣式信息
優(yōu)點(diǎn):
- 輕量級(jí):專注于文檔轉(zhuǎn)換,不依賴于其他庫(kù)。
- 易于集成:可以輕松地將轉(zhuǎn)換后的HTML嵌入到Web應(yīng)用中。
缺點(diǎn):
- 功能單一:主要用于文檔轉(zhuǎn)換,不支持文檔編輯操作。
- 不支持復(fù)雜的樣式轉(zhuǎn)換:某些復(fù)雜的樣式可能無(wú)法完全保留。
適用場(chǎng)景:
- 將Word文檔轉(zhuǎn)換為HTML,用于Web展示。
- 提取文檔中的純文本內(nèi)容。
詳細(xì)功能和代碼示例:
轉(zhuǎn)換文檔
from mammoth import convert_to_html # 讀取 .docx 文件 with open('input.docx', 'rb') as docx_file: result = convert_to_html(docx_file) # 獲取轉(zhuǎn)換后的HTML html = result.value # 保存HTML文件 with open('output.html', 'w', encoding='utf-8') as html_file: html_file.write(html) # 處理轉(zhuǎn)換錯(cuò)誤 if result.messages: for message in result.messages: print(f"Error: {message.type} - {message.message}")
5. pandoc
概述:
pandoc 是一個(gè)強(qiáng)大的文檔轉(zhuǎn)換工具,支持多種格式之間的轉(zhuǎn)換。雖然它不是一個(gè)Python庫(kù),但可以通過(guò)Python腳本調(diào)用 pandoc 命令來(lái)實(shí)現(xiàn)文檔轉(zhuǎn)換。
主要功能:
- 將多種格式的文檔轉(zhuǎn)換為Word文檔(.docx)
- 支持Markdown、LaTeX等多種格式
優(yōu)點(diǎn):
- 支持廣泛的文檔格式。
- 轉(zhuǎn)換質(zhì)量高:能夠很好地保留原始文檔的格式。
缺點(diǎn):
- 需要安裝 pandoc 命令行工具。
- 不支持文檔編輯操作。
適用場(chǎng)景:
- 將其他格式的文檔轉(zhuǎn)換為Word文檔。
- 需要高質(zhì)量文檔轉(zhuǎn)換的場(chǎng)景。
詳細(xì)功能和代碼示例:
轉(zhuǎn)換文檔
import subprocess # 調(diào)用 pandoc 命令將 Markdown 文件轉(zhuǎn)換為 Word 文檔 subprocess.run(['pandoc', 'input.md', '-o', 'output.docx']) # 調(diào)用 pandoc 命令將 LaTeX 文件轉(zhuǎn)換為 Word 文檔 subprocess.run(['pandoc', 'input.tex', '-o', 'output.docx']) # 調(diào)用 pandoc 命令將 HTML 文件轉(zhuǎn)換為 Word 文檔 subprocess.run(['pandoc', 'input.html', '-o', 'output.docx']) # 處理轉(zhuǎn)換錯(cuò)誤 try: subprocess.run(['pandoc', 'input.md', '-o', 'output.docx'], check=True) except subprocess.CalledProcessError as e: print(f"Error: {e.returncode} - {e.output}")
6. PyWinAuto
概述:
PyWinAuto 是一個(gè)自動(dòng)化測(cè)試工具,可以用來(lái)模擬用戶操作,包括打開和編輯Word文檔。這種方法適用于需要進(jìn)行復(fù)雜交互操作的場(chǎng)景。
主要功能:
- 模擬用戶操作(點(diǎn)擊、輸入文本等)
- 控制應(yīng)用程序窗口和菜單
優(yōu)點(diǎn):
- 靈活性高:可以模擬任何用戶操作。
- 支持復(fù)雜的交互操作。
缺點(diǎn):
- 僅限Windows平臺(tái)。
- 學(xué)習(xí)曲線較陡峭:需要熟悉自動(dòng)化測(cè)試的概念和技術(shù)。
適用場(chǎng)景:
- 需要進(jìn)行復(fù)雜交互操作的場(chǎng)景。
- 測(cè)試和驗(yàn)證Word文檔的功能。
詳細(xì)功能和代碼示例:
模擬用戶操作
from pywinauto.application import Application # 啟動(dòng)Word應(yīng)用程序 app = Application().start('C:\\Program Files\\Microsoft Office\\Office16\\WINWORD.EXE') app.connect(title='無(wú)標(biāo)題 - Word') # 模擬輸入文本 app.window(title='無(wú)標(biāo)題 - Word').type_keys('Hello, World!', with_spaces=True) # 保存文檔 app.window(title='無(wú)標(biāo)題 - Word').menu_select('文件->另存為...') app.window(title='另存為').type_keys('C:\\path\\to\\file.docx', with_spaces=True) app.window(title='另存為').button('保存').click() # 關(guān)閉文檔 app.window(title='無(wú)標(biāo)題 - Word').menu_select('文件->關(guān)閉') # 關(guān)閉Word應(yīng)用程序 app.kill()
7. Apache POI via Py4J
概述:
Apache POI 是一個(gè)Java庫(kù),用于處理Microsoft Office文件格式。通過(guò) Py4J,你可以在Python中調(diào)用Java代碼,從而利用 Apache POI 處理Word文檔。
主要功能:
- 創(chuàng)建和編輯Word文檔
- 讀取和修改文檔內(nèi)容
- 處理復(fù)雜的文檔結(jié)構(gòu)
優(yōu)點(diǎn):
- 功能強(qiáng)大:可以實(shí)現(xiàn)幾乎所有Word操作。
- 支持多種Office文件格式。
缺點(diǎn):
- 需要安裝Java環(huán)境。
- 學(xué)習(xí)曲線較陡峭:需要熟悉Java和 Py4J 的使用。
適用場(chǎng)景:
- 需要處理復(fù)雜文檔結(jié)構(gòu)的場(chǎng)景。
- 需要跨平臺(tái)支持的場(chǎng)景。
詳細(xì)功能和代碼示例:
創(chuàng)建和編輯文檔
首先,你需要安裝 Py4J 和 Apache POI,然后編寫一個(gè)Java類來(lái)處理Word文檔。
// Java code (WordProcessor.java) import org.apache.poi.xwpf.usermodel.*; public class WordProcessor { public void createDocument(String path) { XWPFDocument document = new XWPFDocument(); // 添加標(biāo)題 XWPFParagraph titlePara = document.createParagraph(); titlePara.setAlignment(ParagraphAlignment.CENTER); XWPFRun titleRun = titlePara.createRun(); titleRun.setText("文檔標(biāo)題"); titleRun.setFontSize(16); titleRun.setBold(true); // 添加段落 XWPFParagraph para = document.createParagraph(); XWPFRun run = para.createRun(); run.setText("這是文檔的第一個(gè)段落。"); // 添加帶有樣式的文本 run = para.createRun(); run.setText("這是一個(gè)帶"); run = para.createRun(); run.setText("有特殊格式"); run.setBold(true); run.setItalic(true); // 設(shè)置字體樣式 run = para.createRun(); run.setText("這是設(shè)置字體的文本"); run.setFontFamily("Arial"); run.setFontSize(14); run.setBold(true); run.setItalic(true); run.setColor("FF0000"); // 紅色 // 添加圖片 try { InputStream pictureStream = new FileInputStream("path_to_image.jpg"); document.addPictureData(pictureStream, Document.PICTURE_TYPE_JPEG); int pictureIndex = document.getAllPictures().size(); XWPFParagraph picPara = document.createParagraph(); XWPFRun picRun = picPara.createRun(); picRun.addPicture(document.getAllPictures().get(pictureIndex - 1), Document.PICTURE_TYPE_JPEG, "image.jpg", Units.toEMU(100), Units.toEMU(100)); } catch (Exception e) { e.printStackTrace(); } // 添加表格 XWPFTable table = document.createTable(2, 3); table.getRow(0).getCell(0).setText("行1列1"); table.getRow(0).getCell(1).setText("行1列2"); table.getRow(1).getCell(0).setText("行2列1"); // 添加分頁(yè)符 XWPFParagraph pageBreakPara = document.createParagraph(); pageBreakPara.createRun().addBreak(BreakType.PAGE); // 添加書簽 XWPFParagraph bookmarkPara = document.createParagraph(); bookmarkPara.createBookmark("bookmark_name"); bookmarkPara.createRun().setText("這是書簽位置"); // 添加超鏈接 XWPFParagraph linkPara = document.createParagraph(); XWPFHyperlink link = linkPara.createHyperlink(); link.setAddress("https://www.example.com"); link.createRun().setText("點(diǎn)擊這里"); // 保存文檔 try { FileOutputStream out = new FileOutputStream(path); document.write(out); out.close(); } catch (Exception e) { e.printStackTrace(); } } }
然后在Python中調(diào)用這個(gè)Java類:
from py4j.java_gateway import JavaGateway, GatewayClient # 啟動(dòng)Java Gateway gateway = JavaGateway(GatewayClient(port=25333), start_callback_server=True) # 獲取Java對(duì)象 word_processor = gateway.entry_point.getWordProcessor() # 調(diào)用Java方法 word_processor.createDocument("output.docx") # 關(guān)閉Gateway gateway.close()
總結(jié)
方法 | 主要功能 | 優(yōu)點(diǎn) | 缺點(diǎn) | 適用場(chǎng)景 |
---|---|---|---|---|
python-docx | 創(chuàng)建、編輯Word文檔 | 跨平臺(tái)、易于使用、功能豐富 | 只支持 .docx 格式、不支持復(fù)雜文檔 | 創(chuàng)建和編輯簡(jiǎn)單文檔、自動(dòng)生成報(bào)告 |
docx-mailmerge | 批量生成Word文檔 | 簡(jiǎn)單易用、支持復(fù)雜數(shù)據(jù) | 功能單一、不支持文檔編輯 | 批量生成合同、發(fā)票等 |
win32com.client | 控制Word應(yīng)用程序 | 功能強(qiáng)大、支持 .doc 和 .docx 格式 | 僅限Windows平臺(tái)、學(xué)習(xí)曲線陡峭 | 復(fù)雜文檔操作、處理嵌入對(duì)象 |
mammoth | 將 .docx 轉(zhuǎn)換為 HTML | 輕量級(jí)、易于集成 | 功能單一、不支持文檔編輯 | 文檔轉(zhuǎn)換、Web展示 |
pandoc | 文檔格式轉(zhuǎn)換 | 支持廣泛格式、轉(zhuǎn)換質(zhì)量高 | 需要安裝命令行工具 | 文檔轉(zhuǎn)換、高質(zhì)量輸出 |
PyWinAuto | 模擬用戶操作 | 靈活性高、支持復(fù)雜交互 | 僅限Windows平臺(tái)、學(xué)習(xí)曲線陡峭 | 復(fù)雜交互操作、測(cè)試驗(yàn)證 |
Apache POI via Py4J | 創(chuàng)建、編輯Word文檔 | 功能強(qiáng)大、支持多種格式 | 需要Java環(huán)境、學(xué)習(xí)曲線陡峭 | 復(fù)雜文檔操作、跨平臺(tái)支持 |
到此這篇關(guān)于Python操作Word文檔7種方法的實(shí)現(xiàn)與對(duì)比(史上最全)的文章就介紹到這了,更多相關(guān)Python操作Word內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
yolov5使用flask部署至前端實(shí)現(xiàn)照片\視頻識(shí)別功能
初學(xué)者在使用YOLO和Flask構(gòu)建應(yīng)用時(shí),往往需要實(shí)現(xiàn)上傳圖片和視頻的識(shí)別功能,本文介紹了如何在Flask框架中實(shí)現(xiàn)這一功能,包括文件上傳、圖片放大查看、視頻識(shí)別以及識(shí)別后的文件下載,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09python利用插值法對(duì)折線進(jìn)行平滑曲線處理
這篇文章主要為大家詳細(xì)介紹了python利用插值法對(duì)折線進(jìn)行平滑曲線處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12Python實(shí)現(xiàn)定時(shí)精度可調(diào)節(jié)的定時(shí)器
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)定時(shí)精度可調(diào)節(jié)的定時(shí)器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04Python實(shí)現(xiàn)監(jiān)控程序執(zhí)行時(shí)間并將其寫入日志的方法
這篇文章主要介紹了Python實(shí)現(xiàn)監(jiān)控程序執(zhí)行時(shí)間并將其寫入日志的方法,實(shí)例分析了Python日志操作的相關(guān)技巧,需要的朋友可以參考下2015-06-06