python
主页 > 脚本 > python >

Python操作Word文档7种方法的实现与对比(史上最全)

2025-03-09 | 佚名 | 点击:

在Python中操作Word文档是一项常见的任务,特别是在办公自动化和数据处理领域。本文将详细总结和对比几种常用的Python库和方法,包括它们的优缺点、适用场景以及具体的代码示例。我们将深入探讨每种方法的具体功能和使用技巧,帮助你更好地理解和选择合适的方法。

1. python-docx

概述:

python-docx 是一个用于创建和修改Microsoft Word文档(.docx格式)的Python库。它提供了丰富的API,使得开发者可以轻松地生成和编辑Word文档。

主要功能:

优点:

缺点:

适用场景:

详细功能和代码示例:

1.创建和编辑文档

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

from docx import Document

from docx.shared import Pt, Inches

 

# 创建一个新的文档

doc = Document()

 

# 添加标题

doc.add_heading('文档标题', 0)

 

# 添加段落

doc.add_paragraph('这是文档的第一个段落。')

 

# 添加带有样式的文本

p = doc.add_paragraph('这是一个带')

run = p.add_run('有特殊格式')

run.bold = True

run.italic = True

 

# 设置字体样式

run = p.add_run('这是设置字体的文本')

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'

 

# 添加分页符

doc.add_page_break()

 

# 添加书签

p = doc.add_paragraph('这是书签位置')

p.add_bookmark('bookmark_name')

 

# 添加超链接

p = doc.add_paragraph('这是一个超链接:')

run = p.add_hyperlink('https://www.example.com', '点击这里')

 

# 保存文档

doc.save('example.docx')

2.读取和修改现有文档

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

from docx import Document

 

# 打开现有文档

doc = Document('existing_document.docx')

 

# 读取文档内容

for para in doc.paragraphs:

    print(para.text)

 

# 修改文档内容

para = doc.paragraphs[0]

para.text = '这是修改后的内容'

 

# 添加新段落

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 是一个用于批量生成Word文档的库。它允许你在Word模板中定义占位符,然后通过Python脚本填充这些占位符,生成多个类似的文档。

主要功能:

优点:

缺点:

适用场景:

详细功能和代码示例:

创建模板和生成文档

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

from mailmerge import MailMerge

 

# 打开模板文件

template = MailMerge('template.docx')

 

# 查看模板中的占位符

print(template.get_merge_fields())

 

# 定义数据

data = {

    'name': 'John Doe',

    'address': '123 Main St',

    'city': 'Anytown',

    'state': 'Anystate',

    'zip': '12345'

}

 

# 生成文档

template.merge(**data)

template.write('output.docx')

 

# 生成多个文档

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 是一个用于在Python中调用Windows COM对象的库。通过它,你可以直接控制Microsoft Word应用程序,实现对Word文档的高级操作。

主要功能:

优点:

缺点:

适用场景:

详细功能和代码示例:

1.创建和编辑文档

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

import os

from win32com.client import Dispatch

 

# 打开Word应用程序

word = Dispatch('Word.Application')

word.Visible = 0  # 后台运行,不显示

word.DisplayAlerts = 0  # 不显示警告

 

# 创建新文档

doc = word.Documents.Add()

 

# 添加标题

doc.Paragraphs.Add().Range.Text = '文档标题'

doc.Paragraphs.Last.Range.Font.Bold = True

doc.Paragraphs.Last.Range.Font.Size = 16

 

# 添加段落

doc.Paragraphs.Add().Range.Text = '这是文档的第一个段落。'

 

# 添加带有样式的文本

p = doc.Paragraphs.Add().Range

p.Text = '这是一个带'

p.Font.Bold = False

p.Font.Italic = False

p.Collapse(0)  # wdCollapseEnd

p.Text = '有特殊格式'

p.Font.Bold = True

p.Font.Italic = True

 

# 设置字体样式

p.Collapse(0)  # wdCollapseEnd

p.Text = '这是设置字体的文本'

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'

 

# 添加分页符

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='点击这里', TextToDisplay='点击这里')

 

# 保存文档

doc.SaveAs('example.docx')

 

# 关闭文档和Word应用程序

doc.Close()

word.Quit()

2.读取和修改现有文档

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

import os

from win32com.client import Dispatch

 

# 打开Word应用程序

word = Dispatch('Word.Application')

word.Visible = 0  # 后台运行,不显示

word.DisplayAlerts = 0  # 不显示警告

 

# 打开现有文档

doc = word.Documents.Open('existing_document.docx')

 

# 读取文档内容

for para in doc.Paragraphs:

    print(para.Range.Text)

 

# 修改文档内容

para = doc.Paragraphs[0]

para.Range.Text = '这是修改后的内容'

 

# 添加新段落

doc.Paragraphs.Add().Range.Text = '这是添加的新段落'

 

# 删除段落

para = doc.Paragraphs[1]

para.Range.Delete()

 

# 保存修改后的文档

doc.Save()

 

# 关闭文档和Word应用程序

doc.Close()

word.Quit()

4. mammoth

概述:

mammoth 是一个用于将Word文档(.docx格式)转换为HTML的库。它可以帮助你将Word文档的内容提取出来,以便在Web应用中使用。

主要功能:

优点:

缺点:

适用场景:

详细功能和代码示例:

转换文档

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

from mammoth import convert_to_html

 

# 读取 .docx 文件

with open('input.docx', 'rb') as docx_file:

    result = convert_to_html(docx_file)

 

# 获取转换后的HTML

html = result.value

 

# 保存HTML文件

with open('output.html', 'w', encoding='utf-8') as html_file:

    html_file.write(html)

 

# 处理转换错误

if result.messages:

    for message in result.messages:

        print(f"Error: {message.type} - {message.message}")

5. pandoc

概述:

pandoc 是一个强大的文档转换工具,支持多种格式之间的转换。虽然它不是一个Python库,但可以通过Python脚本调用 pandoc 命令来实现文档转换。

主要功能:

优点:

缺点:

适用场景:

详细功能和代码示例:

转换文档

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

import subprocess

 

# 调用 pandoc 命令将 Markdown 文件转换为 Word 文档

subprocess.run(['pandoc', 'input.md', '-o', 'output.docx'])

 

# 调用 pandoc 命令将 LaTeX 文件转换为 Word 文档

subprocess.run(['pandoc', 'input.tex', '-o', 'output.docx'])

 

# 调用 pandoc 命令将 HTML 文件转换为 Word 文档

subprocess.run(['pandoc', 'input.html', '-o', 'output.docx'])

 

# 处理转换错误

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 是一个自动化测试工具,可以用来模拟用户操作,包括打开和编辑Word文档。这种方法适用于需要进行复杂交互操作的场景。

主要功能:

优点:

缺点:

适用场景:

详细功能和代码示例:

模拟用户操作

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

from pywinauto.application import Application

 

# 启动Word应用程序

app = Application().start('C:\\Program Files\\Microsoft Office\\Office16\\WINWORD.EXE')

app.connect(title='无标题 - Word')

 

# 模拟输入文本

app.window(title='无标题 - Word').type_keys('Hello, World!', with_spaces=True)

 

# 保存文档

app.window(title='无标题 - Word').menu_select('文件->另存为...')

app.window(title='另存为').type_keys('C:\\path\\to\\file.docx', with_spaces=True)

app.window(title='另存为').button('保存').click()

 

# 关闭文档

app.window(title='无标题 - Word').menu_select('文件->关闭')

 

# 关闭Word应用程序

app.kill()

7. Apache POI via Py4J

概述:

Apache POI 是一个Java库,用于处理Microsoft Office文件格式。通过 Py4J,你可以在Python中调用Java代码,从而利用 Apache POI 处理Word文档。

主要功能:

优点:

缺点:

适用场景:

详细功能和代码示例:

创建和编辑文档

首先,你需要安装 Py4J 和 Apache POI,然后编写一个Java类来处理Word文档。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

// Java code (WordProcessor.java)

import org.apache.poi.xwpf.usermodel.*;

 

public class WordProcessor {

    public void createDocument(String path) {

        XWPFDocument document = new XWPFDocument();

         

        // 添加标题

        XWPFParagraph titlePara = document.createParagraph();

        titlePara.setAlignment(ParagraphAlignment.CENTER);

        XWPFRun titleRun = titlePara.createRun();

        titleRun.setText("文档标题");

        titleRun.setFontSize(16);

        titleRun.setBold(true);

         

        // 添加段落

        XWPFParagraph para = document.createParagraph();

        XWPFRun run = para.createRun();

        run.setText("这是文档的第一个段落。");

         

        // 添加带有样式的文本

        run = para.createRun();

        run.setText("这是一个带");

        run = para.createRun();

        run.setText("有特殊格式");

        run.setBold(true);

        run.setItalic(true);

         

        // 设置字体样式

        run = para.createRun();

        run.setText("这是设置字体的文本");

        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");

         

        // 添加分页符

        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("点击这里");

         

        // 保存文档

        try {

            FileOutputStream out = new FileOutputStream(path);

            document.write(out);

            out.close();

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

然后在Python中调用这个Java类:

1

2

3

4

5

6

7

8

9

10

11

12

13

from py4j.java_gateway import JavaGateway, GatewayClient

 

# 启动Java Gateway

gateway = JavaGateway(GatewayClient(port=25333), start_callback_server=True)

 

# 获取Java对象

word_processor = gateway.entry_point.getWordProcessor()

 

# 调用Java方法

word_processor.createDocument("output.docx")

 

# 关闭Gateway

gateway.close()

总结

方法 主要功能 优点 缺点 适用场景
python-docx 创建、编辑Word文档 跨平台、易于使用、功能丰富 只支持 .docx 格式、不支持复杂文档 创建和编辑简单文档、自动生成报告
docx-mailmerge 批量生成Word文档 简单易用、支持复杂数据 功能单一、不支持文档编辑 批量生成合同、发票等
win32com.client 控制Word应用程序 功能强大、支持 .doc 和 .docx 格式 仅限Windows平台、学习曲线陡峭 复杂文档操作、处理嵌入对象
mammoth 将 .docx 转换为 HTML 轻量级、易于集成 功能单一、不支持文档编辑 文档转换、Web展示
pandoc 文档格式转换 支持广泛格式、转换质量高 需要安装命令行工具 文档转换、高质量输出
PyWinAuto 模拟用户操作 灵活性高、支持复杂交互 仅限Windows平台、学习曲线陡峭 复杂交互操作、测试验证
Apache POI via Py4J 创建、编辑Word文档 功能强大、支持多种格式 需要Java环境、学习曲线陡峭 复杂文档操作、跨平台支持
原文链接:
相关文章
最新更新