Hướng dẫn python-docx remove paragraph - python-docx xóa đoạn

Tôi có một tệp DOCX và tôi cần xóa tất cả nội dung khỏi một dòng nhất định.

Từ những gì tôi có thể thấy tôi có thể lặp lại trên các đoạn văn hoặc bảng.

Tuy nhiên, tôi nghĩ rằng tôi cần một số yếu tố phổ quát để lặp lại để xóa tất cả nội dung khỏi một điểm cụ thể (phần tử) trong tài liệu.

Tiếp theo tôi muốn kiểm tra xem phần tử này là một đoạn văn hoặc bảng để thực hiện mã xóa có liên quan.

Tôi đã tìm thấy mã này trong các vấn đề của GitHub để xóa một đoạn văn (dường như không hoạt động nữa):

def delete_paragraph(paragraph):
    p = paragraph._element
    p.getparent().remove(p)
    paragraph._p = paragraph._element = None

Nhưng tôi vẫn có thể xóa đoạn văn chạy:

runs = paragraph.runs
for run in runs:
    run.text = ""
    r = run._r
    r.getparent().remove(r)

Không được kiểm tra, nhưng tôi đã thấy mã để xóa nội dung bảng ở đâu đó.

Vì vậy, có thể thực hiện một hành động như vậy?

Mô tả thay thế về những gì tôi muốn đạt được là chia tài liệu hiện có theo dòng với Tag Ex. spit here.

Tôi đang cố gắng tự động hóa việc tạo các tệp .docx (wordml) với sự trợ giúp của python-docx (https://github.com/mikemaccana/python-docx). Kịch bản hiện tại của tôi tạo TOC theo cách thủ công với vòng lặp sau:

for chapter in myChapters:
    body.append(paragraph(chapter.text, style='ListNumber'))

Có ai biết cách sử dụng chức năng TOC "từ tích hợp", điều này tự động thêm chỉ mục và cũng tạo ra các liên kết đoạn văn cho các chương riêng lẻ không?

Cảm ơn rất nhiều!

Đã hỏi ngày 3 tháng 9 năm 2013 lúc 15:17Sep 3, 2013 at 15:17

Thách thức chính là một TOC được hiển thị phụ thuộc vào phân trang để biết số trang nào sẽ đặt cho mỗi tiêu đề. Phân trang là một chức năng được cung cấp bởi động cơ bố cục, một phần mềm rất phức tạp được tích hợp trong máy khách từ. Viết một công cụ bố trí trang bằng Python có lẽ không phải là một ý tưởng tốt, chắc chắn không phải là một dự án tôi dự định sẽ sớm thực hiện bất cứ lúc nào :)

TOC bao gồm hai phần:

  1. Yếu tố chỉ định vị trí TOC và những thứ như mức độ tiêu đề bao gồm.
  2. Nội dung TOC, tiêu đề và số trang có thể hiển thị thực tế với các dòng chấm kết nối chúng.

Tạo yếu tố là khá đơn giản và tương đối thấp. Tạo nội dung hiển thị thực tế, ít nhất là nếu bạn muốn các số trang bao gồm, yêu cầu công cụ bố cục từ.

Đây là những tùy chọn:

  1. Chỉ cần thêm thẻ và một vài bit khác để báo hiệu từ TOC cần được cập nhật. Khi tài liệu được mở lần đầu tiên, một hộp thoại xuất hiện nói rằng các liên kết cần phải được làm mới. Người dùng nhấp vào Có và Bob là chú của bạn. Nếu người dùng nhấp vào không, tiêu đề TOC sẽ không có nội dung bên dưới và TOC có thể được cập nhật thủ công.

  2. Thêm thẻ và sau đó tham gia một máy khách Word, bằng C# hoặc Visual Basic so với thư viện tự động hóa Word, để mở và lưu tệp; Tất cả các trường (bao gồm cả trường TOC) được cập nhật.

  3. Thực hiện cùng một phía máy chủ nếu bạn có một thể hiện SharePoint hoặc bất cứ điều gì có thể làm điều đó với các dịch vụ tự động hóa Word.

  4. Tạo một macro Autoopen trong tài liệu tự động chạy cập nhật trường khi tài liệu được mở. Có lẽ sẽ không vượt qua nhiều người kiểm tra virus và sẽ không hoạt động trên các cửa sổ bị khóa xây dựng phổ biến trong môi trường công ty.

Đây là một bộ screencasts rất đẹp của Eric White giải thích tất cả các chi tiết đầy lông

Nhà vật lý điên

Huy hiệu vàng 100k2424 gold badges163 silver badges246 bronze badges

Đã trả lời ngày 3 tháng 9 năm 2013 lúc 23:27Sep 3, 2013 at 23:27

1

Xin lỗi vì đã thêm bình luận vào một bài viết cũ, nhưng tôi nghĩ nó có thể hữu ích. Đây không phải là giải pháp của tôi, nhưng nó đã được tìm thấy ở đó: https://github.com/python-openxml/python-docx/issues/36 Cảm ơn https://github.com/mustash và https: // github. com/scanny

    from docx.oxml.ns import qn
    from docx.oxml import OxmlElement

    paragraph = self.document.add_paragraph()
    run = paragraph.add_run()
    fldChar = OxmlElement('w:fldChar')  # creates a new element
    fldChar.set(qn('w:fldCharType'), 'begin')  # sets attribute on element
    instrText = OxmlElement('w:instrText')
    instrText.set(qn('xml:space'), 'preserve')  # sets attribute on element
    instrText.text = 'TOC \\o "1-3" \\h \\z \\u'   # change 1-3 depending on heading levels you need

    fldChar2 = OxmlElement('w:fldChar')
    fldChar2.set(qn('w:fldCharType'), 'separate')
    fldChar3 = OxmlElement('w:t')
    fldChar3.text = "Right-click to update field."
    fldChar2.append(fldChar3)

    fldChar4 = OxmlElement('w:fldChar')
    fldChar4.set(qn('w:fldCharType'), 'end')

    r_element = run._r
    r_element.append(fldChar)
    r_element.append(instrText)
    r_element.append(fldChar2)
    r_element.append(fldChar4)
    p_element = paragraph._p

Đã trả lời ngày 5 tháng 2 năm 2018 lúc 12:09Feb 5, 2018 at 12:09

5

@Mawg // Cập nhật TOC

Có cùng một vấn đề để cập nhật TOC và googled cho nó. Không phải mã của tôi, nhưng nó hoạt động:

word = win32com.client.DispatchEx("Word.Application")
doc = word.Documents.Open(input_file_name)
doc.TablesOfContents(1).Update()
doc.Close(SaveChanges=True)
word.Quit()

Đã trả lời ngày 14 tháng 3 năm 2019 lúc 11:34Mar 14, 2019 at 11:34

1

Để tạo bảng nội dung tự động trong Word bằng Python:

#First set directory where you want to save the file

import os
os.chdir("D:/")

#Now import required packages

import docx
from docx import Document
from docx.oxml.ns import qn
from docx.oxml import OxmlElement

#Initialising document to make word file using python

document = Document()

#Code for making Table of Contents

paragraph = document.add_paragraph()
run = paragraph.add_run()
fldChar = OxmlElement('w:fldChar')  # creates a new element
fldChar.set(qn('w:fldCharType'), 'begin')  # sets attribute on element
instrText = OxmlElement('w:instrText')
instrText.set(qn('xml:space'), 'preserve')  # sets attribute on element
instrText.text = 'TOC \\o "1-3" \\h \\z \\u'   # change 1-3 depending on heading levels you need

fldChar2 = OxmlElement('w:fldChar')
fldChar2.set(qn('w:fldCharType'), 'separate')
fldChar3 = OxmlElement('w:t')
fldChar3.text = "Right-click to update field."
fldChar2.append(fldChar3)

fldChar4 = OxmlElement('w:fldChar')
fldChar4.set(qn('w:fldCharType'), 'end')

r_element = run._r
r_element.append(fldChar)
r_element.append(instrText)
r_element.append(fldChar2)
r_element.append(fldChar4)
p_element = paragraph._p

#Giving headings that need to be included in Table of contents

document.add_heading("Network Connectivity")
document.add_heading("Weather Stations")

#Saving the word file by giving name to the file

name = "mdh2"
document.save(name+".docx")

#Now check word file which got created

#Select "Right-click to update field text"
#Now right click and then select update field option
#and then click on update entire table

#Now,You will find Automatic Table of Contents 

#Cảm ơn

Đã trả lời ngày 4 tháng 12 năm 2019 lúc 7:08Dec 4, 2019 at 7:08

3