python的win32com.client控制word

这是我写的代码:


import win32com.client

# 打开指定名字的 Word 文档
word = win32com.client.Dispatch("Word.Application")
doc = word.Documents.Open("C:\\Users\\笨蛋\\Desktop\\example.docx")

# 遍历每个段落,并将每行第二和第三个字符下划线化
for para in doc.Paragraphs:
    words = para.Range.Words
    # 对于每一行,将第三和第四个单词修改为1号字体大小
    for para in doc.Paragraphs:
        words = para.Range.Words
        # 对于每一行,将第三和第四个单词修改为1号字体大小
        if words.Count >= 4:
            start1, end1 = words.Item(3).Start, words.Item(3).End
            start2, end2 = words.Item(4).Start, words.Item(4).End
            para.Range.Characters(3, 4).Font.Size = 1
            para.Range.Characters(4, 5).Font.Size = 1
            print("已执行")
# 保存文档并关闭 Word 应用
doc.Save()
doc.Close()

出现了以下报错:

C:\Users\笨蛋\Desktop>python 实验1.py
Traceback (most recent call last):
  File "C:\Users\笨蛋\Desktop\实验1.py", line 17, in <module>
    para.Range.Characters(3, 4).Font.Size = 1
  File "D:\Anaconda\Anaconda\lib\site-packages\win32com\client\dynamic.py", line 197, in __call__
    return self._get_good_object_(self._oleobj_.Invoke(*allArgs),self._olerepr_.defaultDispatchName,None)
pywintypes.com_error: (-2147352562, '无效的参数数目。', None, None)

谢绝chatgpt,试过了

Characters 只接受一个参数吧,我把它改成 Characters(3) 和 Characters(4) 可以运行。

这是Python使用Win32com操作Word时遇到的一个常见错误。主要原因是:

  1. 您试图修改的第3和第4个单词在某些段落中可能并不存在,导致调用Characters方法时传入的索引超出范围。
  2. 您传入的起始和结束索引参数有问题,不代表一个完整的单词。
    我的建议是:
  3. 在修改字体大小前,先判断words.Count是否大于4,以确保段落中至少有4个单词,避免索引越界。
  4. 调用words.Item(3)和words.Item(4)获取第3和第4个单词的起始和结束位置,作为Characters方法的参数。这可以确保传入代表一个完整单词的索引范围。
    修改后的代码如下:
python
for para in doc.Paragraphs:
    words = para.Range.Words
    # 对于每一行,将第三和第四个单词修改为1号字体大小
    if words.Count >= 4: 
        start1, end1 = words.Item(3).Start, words.Item(3).End
        start2, end2 = words.Item(4).Start, words.Item(4).End
        para.Range.Characters(start1, end1).Font.Size = 1
        para.Range.Characters(start2, end2).Font.Size = 1

这段代码首先会判断words的数量,然后通过words.Item(3)等方法获取完整的第3和第4个单词的起止位置, antes调用Characters方法,这样可以避免索引越界的错误。

代码是不是复制错了呀,为啥两个一样的for循环,你改成这样试试呢

# 遍历每个段落,并将每行第二和第三个字符下划线化
for para in doc.Paragraphs:
    words = para.Range.Words
    # 对于每一行,将第三和第四个单词修改为1号字体大小
    if words.Count >= 4:
        start1, end1 = words.Item(3).Start, words.Item(3).End
        start2, end2 = words.Item(4).Start, words.Item(4).End
        para.Range.Characters(3, 4).Font.Size = 1
        para.Range.Characters(4, 5).Font.Size = 1
        print("已执行")

根据错误提示,para.Range.Characters(3, 4).Font.Size这一行代码有问题,提示无效的参目数,应该是参数个数与要求的不一样,检查下Characters函数需要多少个参数,根据要求修正即可解决

可以借鉴下

from win32com.client import Dispatch #需要安装的是pypiwin32模块
 
 
app=Dispatch('Word.Application')
doc = app.Documents.Open('你的word文档路径')
 
# 页面设置
cm_to_points = 28.35 # 1厘米为28.35# 国家公文格式标准要求是上边距版心3.7cm
# 但是如果简单的把上边距设置为3.7cm
# 则因为文本的第一行本身有行距
# 会导致实际版心离上边缘较远,上下边距设置为3.3cm
# 是经过实验的,可以看看公文标准的图示
# 版心指的是文字与边缘距离
doc.PageSetup.TopMargin = 3.3*cm_to_points  
# 上边距3.3厘米
doc.PageSetup.BottomMargin = 3.3*cm_to_points  
# 下边距3.3厘米
doc.PageSetup.LeftMargin = 2.8*cm_to_points  
# 左边距2.8厘米
doc.PageSetup.RightMargin = 2.6*cm_to_points  
# 右边距2.6厘米
 
# 设置正常样式的字体
# 是为了后面指定行和字符网格时
# 按照这个字体标准进行
doc.Styles(-1).Font.Name = '仿宋' 
# word中的“正常”样式字体为仿宋
doc.Styles(-1).Font.NameFarEast = '仿宋' 
# word中的“正常”样式字体为仿宋
doc.Styles(-1).Font.NameAscii = '仿宋'
# word中的“正常”样式字体为仿宋
doc.Styles(-1).Font.NameOther = '仿宋' 
# word中的“正常”样式字体为仿宋
doc.Styles(-1).Font.Size = 16 
# word中的“正常”样式字号为三号
 
doc.PageSetup.LayoutMode = 1 
# 指定行和字符网格
doc.PageSetup.CharsLine = 28 
# 每行28个字
doc.PageSetup.LinesPage = 22 
# 每页22行,会自动设置行间距
 
# 页码设置
doc.PageSetup.FooterDistance = 2.8*cm_to_points  
# 页码距下边缘2.8厘米
doc.PageSetup.DifferentFirstPageHeaderFooter = 0 
# 首页页码相同
doc.PageSetup.OddAndEvenPagesHeaderFooter = 0 
# 页脚奇偶页相同
w = doc.windows(1)  
# 获得文档的第一个窗口
w.view.seekview = 4 
# 获得页眉页脚视图
s = w.selection  
# 获取窗口的选择对象
s.headerfooter.pagenumbers.startingnumber = startingnumber  
# 设置起始页码
s.headerfooter.pagenumbers.NumberStyle = 0  
# 设置页码样式为单纯的阿拉伯数字
s.WholeStory() 
# 扩选到整个部分(会选中整个页眉页脚)
s.Delete() 
#按下删除键,这两句是为了清除原来的页码
s.headerfooter.pagenumbers.Add(4)  
# 添加页面外侧页码
s.MoveLeft(1, 2)  
# 移动到页码左边,移动了两个字符距离
s.TypeText('— ')  
# 给页码左边加上一字线,注意不是减号
s.MoveRight() 
#移动到页码末尾,移动了一个字符距离
# 默认参数是1(字符)
s.TypeText(' —') 
s.WholeStory() 
# 扩选到整个页眉页脚部分,此处是必要的
# 否则s只是在输入一字线后的一个光标,没有选择区域
s.Font.Name = '宋体'
s.Font.Size = 14 
#页码字号为四号
s.paragraphformat.rightindent = 21 
#页码向左缩进1字符(21磅)
s.paragraphformat.leftindent = 21 
# 页码向右缩进1字符(21磅)
doc.Styles('页眉').ParagraphFormat.Borders(-3).LineStyle = 0 
# 页眉无底边框横线

可以借鉴下

# 使用Start,End指定字符范围
s = Word.Selection
s.Start = 0
s.End = n
# s从第0个字符(第1个字符前的插入点)到第n个字符。
# 汉字是每字为1字符
 
# 相当于按下Delete键
s.Delete() 
# 相当于按下Ctrl+A
s.WholeStory() 
# 向左移动
s.MoveLeft()
# 向右移动2个字符,第1个参数是移动单位WdUnits(具体见文档),1代表字符
s.MoveRight(1, 2)

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
这个问题是由于在修改字体大小的时候,使用的参数数目不正确所导致的。

正确的修改字体大小的代码应该是:

para.Range.Characters(start1, end1).Font.Size = 1
para.Range.Characters(start2, end2).Font.Size = 1

你需要将这段代码替换原来的这一段:

para.Range.Characters(3, 4).Font.Size = 1
para.Range.Characters(4, 5).Font.Size = 1

修改后的完整代码如下:

import win32com.client

# 打开指定名字的 Word 文档
word = win32com.client.Dispatch("Word.Application")
doc = word.Documents.Open("C:\\Users\\笨蛋\\Desktop\\example.docx")

# 遍历每个段落,并将每行第二和第三个字符下划线化
for para in doc.Paragraphs:
    words = para.Range.Words
    # 对于每一行,将第三和第四个单词修改为1号字体大小
    if words.Count >= 4:
        start1, end1 = words.Item(3).Start, words.Item(3).End
        start2, end2 = words.Item(4).Start, words.Item(4).End
        para.Range.Characters(start1, end1).Font.Size = 1
        para.Range.Characters(start2, end2).Font.Size = 1
        print("已执行")

# 保存文档并关闭 Word 应用
doc.Save()
doc.Close()

另外,为了防止出现无法预知的错误,你可以将 doc.Save()doc.Close() 放在 for 循环之外,避免文档在处理的过程中意外关闭导致修改未保存。

最终的完整代码如下:

import win32com.client

# 打开指定名字的 Word 文档
word = win32com.client.Dispatch("Word.Application")
doc = word.Documents.Open("C:\\Users\\笨蛋\\Desktop\\example.docx")

# 遍历每个段落,并将每行第二和第三个字符下划线化
for para in doc.Paragraphs:
    words = para.Range.Words
    # 对于每一行,将第三和第四个单词修改为1号字体大小
    if words.Count >= 4:
        start1, end1 = words.Item(3).Start, words.Item(3).End
        start2, end2 = words.Item(4).Start, words.Item(4).End
        para.Range.Characters(start1, end1).Font.Size = 1
        para.Range.Characters(start2, end2).Font.Size = 1
        print("已执行")

# 保存文档并关闭 Word 应用
doc.Save()
doc.Close()

如果我的回答解决了您的问题,请采纳!