from  docx import  Document, oxml
from  docx. oxml. shared import  qn
from  docx. text. paragraph import  Paragraph
from  docx. oxml import  OxmlElement
def  get_bookmark_par_element_start ( document,  bookmark_name) : """查找标签的起始位置(所在的段落)""" doc_element =  document. part. elementbookmarks_list =  doc_element. findall( './/'  +  qn( 'w:bookmarkStart' ) ) for  bookmark in  bookmarks_list: name =  bookmark. get( qn( 'w:name' ) ) if  name ==  bookmark_name: par =  bookmark. getparent( ) if  not  isinstance ( par,  oxml. CT_P) : print ( 'par不是CT_P类型,返回2' ) return  2 else : print ( type ( par) ) return  parprint ( '没找到书签,返回1' ) return  1 
def  get_bookmark_par_element_end ( document,  bookmark_id) : doc_element =  document. part. elementbookmarks_list =  doc_element. findall( './/'  +  qn( 'w:bookmarkEnd' ) ) for  bookmark in  bookmarks_list: name =  bookmark. get( qn( 'w:id' ) ) if  name ==  bookmark_id: par =  bookmark. getparent( ) if  not  isinstance ( par, oxml. CT_P) : return  2 else : return  parreturn  1 
def  insert_paragraph_after ( paragraph,  text= "" ) : """在paragraph后添加新的段落""" new_p =  OxmlElement( "w:p" ) paragraph. _p. addnext( new_p) new_para =  Paragraph( new_p,  paragraph. _parent) print ( new_para) print ( text) new_para. add_run( text) return  new_para
def  set_bookmark_values ( document,  bookmark_name,  text_list:  list ) : """:param document::param bookmark_name::param text_list: 待添加的文本列表:return:""" bookmark_par =  get_bookmark_par_element_start( document,  bookmark_name) if  bookmark_par ==  1  or  bookmark_par== 2 : print ( '未到书签或类型错误' ) return bookmark_par_parent =  bookmark_par. getparent( ) index =  bookmark_par_parent. index( bookmark_par) for  _i,  _text in  enumerate ( text_list) : base_paragraphs =  document. paragraphs[ index +  _i] result_with_space =  " " . join( _text) insert_paragraph_after( base_paragraphs,  result_with_space)