python-docx的粗体,下划线和迭代

时间:2018-12-05 18:45:04

标签: python ascii python-docx

我正在编写一个程序,以从ASCII文件中获取数据并将数据放置在Word文档中的适当位置,并仅使特定单词加粗并加下划线。我是Python的新手,但是我在Matlab编程方面拥有丰富的经验。我的代码是:

#IMPORT ASCII DATA AND MAKE IT USEABLE
#Alternatively Pandas - gives better table display results
import pandas as pd
data = pd.read_csv('203792_M-51_Niles_control_SD_ACSF.txt', sep=",", 
header=None)
#print data
#data[1][3]  gives value at particular data points within matrix
i=len(data[1])
print 'Number of Points imported =', i
#IMPORT WORD DOCUMENT
import docx  #Opens Python Word document tool
from docx import Document  #Invokes Document command from docx
document = Document('test_iteration.docx')  #Imports Word Document to Modify
t = len(document.paragraphs)  #gives the number of lines in document
print 'Total Number of lines =', t
#for paragraph in document.paragraphs:
   # print(para.text)  #Prints the text in the entire document
font = document.styles['Normal'].font
font.name = 'Arial'
from docx.shared import Pt
font.size = Pt(8)
#font.bold = True
#font.underline = True
for paragraph in document.paragraphs:
    if 'NORTHING:' in paragraph.text:
        #print paragraph.text
        paragraph.text = 'NORTHING: \t',  str(data[1][0])
        print paragraph.text   
    elif 'EASTING:' in paragraph.text:
        #print paragraph.text
        paragraph.text = 'EASTING: \t', str(data[2][0])
        print paragraph.text
    elif 'ELEV:' in paragraph.text:
        #print paragraph.text
        paragraph.text = 'ELEV: \t', str(data[3][0])
        print paragraph.text
    elif 'CSF:' in paragraph.text:
        #print paragraph.text
        paragraph.text = 'CSF: \t', str(data[8][0])
        print paragraph.text
    elif 'STD. DEV.:' in paragraph.text:
        #print paragraph.text
        paragraph.text = 'STD. DEV.: ', 'N: ', str(data[5][0]), '\t E: ', 
str(data[6][0]), '\t EL: ', str(data[7][0])
    print paragraph.text
#for paragraph in document.paragraphs:
   #print(paragraph.text)  #Prints the text in the entire document
#document.save('test1_save.docx') #Saves as Word Document after Modification

我的问题是如何仅使“ NORTHING:”加粗并带有下划线:

    paragraph.text = 'NORTHING: \t',  str(data[1][0])
    print paragraph.text 

因此,我编写了一个伪的“查找并替换”命令,如果要替换的所有值都完全相同,则该命令很好用。但是,我需要用ASCII文件的第二个数组中的值替换第二段中的值,并用第三个数组中的值替换第三段..etc。 (我必须使用查找和替换,因为要使文档的格式高级以使我可以在程序中复制,除非有一个程序可以读取Word文件并将程序写回Python脚本...对它进行反向工程)

我仍在学习,因此代码对您而言似乎很粗糙。我只是想自动完成无聊的复制和粘贴过程。

1 个答案:

答案 0 :(得分:1)

未经测试,但是假设python-docx与python-pptx类似(应该是,它是由同一位开发人员维护的,并且粗略地查看了文档说明它与PPT / DOC文件的交互方式是相同的,使用相同的方法,等等。

为了操作段落或单词的子字符串,您需要使用run对象:

https://python-docx.readthedocs.io/en/latest/api/text.html#run-objects

实际上,这看起来像:

for paragraph in document.paragraphs:
    if 'NORTHING:' in paragraph.text:
        paragraph.clear()
        run = paragraph.add_run()
        run.text = 'NORTHING: \t'
        run.font.bold = True
        run.font.underline = True
        run = paragraph.add_run()
        run.text = str(data[1][0])    

从概念上讲,您需要为要操作的段落/文本的每个 part 创建一个run实例。因此,首先我们使用粗体字体创建一个run,然后添加另一个运行(我认为不会是粗体/下划线,但是如果只是将其设置为False)。

注意:最好将所有import语句放在模块顶部。

这可以通过使用诸如字典之类的映射对象进行一些优化,您可以使用该映射对象将匹配值(“ NORTHING”)与keys相关联,并将段落文本的其余部分与{{1}相关联}。 还未经测试

values