当前位置: 首页 > 知识库问答 >
问题:

如何在python-docx中更改标题字体和大小?

欧阳永宁
2023-03-14

我将此作为python docx问题提交:https://github.com/python-openxml/python-docx/issues/805但被要求在这里展开讨论。

https://python-docx.readthedocs.io/en/latest/user/styles-using.html意味着我应该能够像这样更改标题字体样式:

font = doc.styles['Heading 1'].font
font.name = 'Times New Roman'
font.size = docx.shared.Pt(16)

但这不起作用:生成的文档对所有标题都使用Calibri。(它们也是蓝色的,标题1有一条下划线,我也需要以某种方式消除。)

更改特定标题上的字体或删除标题的潜在样式也不起作用。

这是一个测试程序,它尝试了所有三种方法,但是标题1和2仍然以蓝色卡利布里的形式出现,尽管所有人都试图将它们改为时代新罗马:

import docx

doc = docx.Document()

# Deleting heading latent styles seems to do nothing:
latent_styles = doc.styles.latent_styles
latent_styles['Heading 1'].delete()
latent_styles['Heading 2'].delete()

# Setting the Normal font works:
font = doc.styles['Normal'].font
font.name = 'Times New Roman'
font.size = docx.shared.Pt(12)

# Setting heading styles doesn't do anything:
# they all still end up as blue Calibri.
font = doc.styles['Heading 1'].font
font.name = 'Times New Roman'
font.size = docx.shared.Pt(16)

font = doc.styles['Heading 2'].font
font.name = 'Times New Roman'
font.size = docx.shared.Pt(14)

doc.add_heading("Heading 0", 0)
doc.add_paragraph('Here is a paragraph of text.')
doc.add_heading("Heading 1", 1)
doc.add_paragraph('Here is a paragraph of text.')
doc.add_heading("Heading 2", 2)
doc.add_paragraph('Here is a paragraph of text.')

# It also doesn't work to change the style of a specific heading:
heading = doc.add_heading("Another Heading 1", 1)
heading.style.font.name = "Times New Roman"
doc.add_paragraph('Here is a paragraph of text.')

doc.save('test.docx')

无法使用docx更改“heading 1”字体名称将其称为bug,并建议创建新样式作为解决方法。一个更简单的解决方法是在普通段落文本内创建行,然后设置这些行的样式。但如果有可能将这些标题的样式设置为蓝色Calibri以外的样式,那么似乎最好使用“标题1”之类的标准元素。。。文件表明这是可能的。

共有1个答案

谷梁向荣
2023-03-14

正如您观察到的,通常情况下,将字体(font.name)更改为“正常工作”的样式。出于我不完全理解的原因,标题以及可能的标题1标题2等样式是一个例外。我想这与他们的字体选择由主题指定有关。也许这与它们在形成目录方面的特殊作用有关。

首先,我们有几个观察:

>

如果我们将字体名称“Times New Roman”应用于标题样式,然后检查生成的XML,我们会看到以下内容:

>>> heading = document.add_heading("Title", 0)
>>> title_style = heading.style
>>> title_style.font.name = "Times New Roman"
>>> title_style.element.xml
<w:style xmlns:w=... w:type="paragraph" w:styleId="Title">
  <w:name w:val="Title"/>
  <w:basedOn w:val="Normal"/>
  <w:next w:val="Normal"/>
  <w:link w:val="TitleChar"/>
  <w:uiPriority w:val="10"/>
  <w:qFormat/>
  <w:rsid w:val="00FC693F"/>
  <w:pPr>
    <w:pBdr>
      <w:bottom w:val="single" w:sz="8" w:space="4" w:color="4F81BD" w:themeColor="accent1"/>
    </w:pBdr>
    <w:spacing w:after="300" w:line="240" w:lineRule="auto"/>
    <w:contextualSpacing/>
  </w:pPr>
  <w:rPr>
    <w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia"
              w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"
              w:ascii="Times New Roman" w:hAnsi="Times New Roman"/>
    <w:color w:val="17365D" w:themeColor="text2" w:themeShade="BF"/>
    <w:spacing w:val="5"/>
    <w:kern w:val="28"/>
    <w:sz w:val="52"/>
    <w:szCs w:val="52"/>
  </w:rPr>
</w:style>
  • 从这里我们可以看到很多有趣的项目,但我们目前的关注点仅限于
>>> title_style.element.rPr.rFonts.xml
<w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia"
          w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"
          w:ascii="Times New Roman" w:hAnsi="Times New Roman"/>

我们可以看到,“Times New Roman”确实已经应用于两种字体设置,但标题仍然以Calibri显示,正如“majorHAnsi”所映射的那样。

要跳转到解决方案,如果我们将w: asciiThemefont-name设置为Times New Roman,标题将按需要显示:

from docx.oxml.ns import qn

rFonts = title_style.element.rPr.rFonts
rFonts.set(qn("w:asciiTheme"), "Times New Roman")

我希望在其他标题样式上也能使用同样的方法。

请注意,如果您是“从头开始”生成文档,而不是编辑现有文档,那么从已经具有所需样式的空白文档开始可能更容易:

document = Document("my-starting-document.docx")

 类似资料:
  • 现在我有一个docx文件,我加载到 我可以看到存储在style中的不同样式的当前字体大小。通过做xml 我想用poi更新字体大小,所以我试了一下 但是,在完成上述代码后,如果我使用第一段代码检查文档的字体大小(object),字体大小仍然是原始值,而不是我想要设置的12。 对于如何解决这个问题,有什么建议吗?

  • 问题内容: 有人可以指导我以最简单的方法更改UITableView节标题中文本的字体大小吗? 我使用以下方法实现了节标题: 然后,我了解了如何使用此方法成功更改节标题高度: 我有使用此方法填充的UITableView单元格: 但是,我对如何实际增加节标题文本的字体大小(或就此而言的字体样式)感到困惑? 有人可以帮忙吗?谢谢。 问题答案: 不幸的是,您可能必须重写此方法: 在Objective-C中

  • 问题内容: 听起来这是一个简单的问题,但是我找不到在python中用matplotlib制作的图中更改字体(不是字体大小)的有效解决方案。 我找到了一些教程,可通过修改matplotlib存储默认字体的文件夹中的一些文件来更改matplotlib的默认字体- 请参阅此博客文章-但我正在寻找一种不太激进的解决方案,因为我想使用多个我的绘图中的字体(文本,标签,轴标签等)。 问题答案: 假设您要使用C

  • 问题内容: 您可以更改JOptionPane的字体和文本大小吗?我尝试了它,只有当我在那个特定的Java类上“运行文件”时,它才起作用。如果启动整个项目,则不会更改字体。我只想更改一个特定的JOptionPane而不是全部。 这是代码: 问题答案: 真的很简单。JOption窗格不仅接受字符串,还接受组件。因此,您可以创建一个标签集并设置其字体并将其用作消息。 我不明白为什么以前没人回答这个问题

  • 问题内容: 如何增加字体大小? 问题答案: 其中fontSize是一个int。drawString的API指出x和y参数是坐标,与文本的大小无关。

  • 问题内容: 我想在Chart.JS水平条形图中将字体更改为更时髦的字体。我已经尝试了以下方法,但是都没有用: 我还读到这会起作用: …但是这段代码会去哪里,以及它应该看起来如何?我尝试了这个: …但也没有效果 对于完整图片/上下文,这是组成此图表的所有代码: 的HTML JQUERY 我什至尝试了这个: 的CSS 的HTML …但是我认为画布绘制会照顾字体的外观,因为添加字体没有区别。 更新 我试