0

我正在使用python-docx创建和写入 docx 文件。我的应用程序一次只写一个单词。我用了

p.add_run(res.decode('unicode_escape'));    

写 unicode 单词,一次一个。但是,每当中间/中间有一个空白字符时,add_run()就会惨遭失败,我会连接单词。

我试过以下:

  1. repr(res)有效,但它会输出不必要的 '(quote) 字符
  2. res = r'\x20'没有效果
  3. res = ''' '''没有效果
  4. res = r' ' 没有效果

whitespace我使用上面的表达式来分配一个res变量,然后尝试将它附加到当前段落
p.add_run(res)

最后我改变了我写文本的方式。我没有写单个单词/块,而是收集了一个完整的行,然后将其写入文档。

虽然我已经解决了这个问题,但我仍然想深入了解这种行为的原因。

4

1 回答 1

1

运行是具有相同字符格式的字符序列。通常,您会将共享相同格式的所有文本写入同一运行,以避免在不需要的地方产生运行“容器”开销(每个大约 20 个字节)。因此,您最终得到的解决方案听起来像是推荐的方法。

但是解决缺少的空白问题,如果你想要“玛丽有一只小羊羔”。并且全部使用相同的字体(考虑粗体或斜体与常规字体不同),您将使用:

p.add_run("Mary had a little lamb.")

如果你这样做:

p.add_run("Mary")
p.add_run("had")
p.add_run("a")
p.add_run("little")
p.add_run("lamb.")

你会得到你想要的,即“Maryhadalittlelamb.”,因为你没有提供你想要的前导和/或尾随空格。添加运行并不会尝试找出您想要空格的位置,它只是按照您的要求进行操作。

相反,如果您这样做了:

p.add_run("Mary ")
p.add_run("had")
p.add_run(" a ")
p.add_run("little")
p.add_run(" lamb.")

你会得到“玛丽有一只小羊羔”。

如果您发布实际输入和特定意外输出的示例,也许我可以提供更多解释。

关于 20 字节的开销,添加包含文本 'foo' 和 'bar' 的单独运行会生成如下 XML:

<w:r>
  <w:t>foo</w:t>
</w:r>
<w:r>
  <w:t>bar</w:t>
</w:r>

而包含文本 'foobar' 的单次运行会生成此 XML,如果您忽略用于在此处进行漂亮打印的换行符和缩进空格(将在保​​存时删除),则会缩短 22 个字符:

<w:r>
  <w:t>foobar</w:t>
</w:r>

其中一些会被压缩,因为 .docx 文件是一个 Zip 档案,我想这只是我的工程习惯,尽量减少浪费,这会让我寻找更经济的解决方案 :)

于 2015-03-18T04:50:55.737 回答