python-docx


pip install python-docx 注意不要直接下載docx包

 

from docx import Document
from docx.shared import RGBColor,Inches,Pt,Length
from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_TAB_ALIGNMENT, WD_TAB_LEADER  # 會有紅色下划線報異常,不過可以正常使用
from docx.oxml.ns import qn
from docx.oxml import OxmlElement

document = Document()

# ===============================段落操作================================
document.add_heading('This is my title', 0)  # 添加標題,但是這個標題下面會有一個橫線

# 設置字體
document.styles['Normal'].font.name = u'黑體'  # 可換成word里面任意字體
p = document.add_paragraph()

# 設置文字對齊方式
p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER  # 段落文字居中設置
# print(p.paragraph_format.alignment) # 打印對齊方式

# 設置段落的顏色及字體大小
run = p.add_run(u'我添加的段落文字')
run.font.color.rgb = RGBColor(54, 95, 145)  # 顏色設置,這里是用RGB顏色
run.font.size = Pt(36)  # 字體大小設置,和word里面的字號相對應

# ==========縮進 默認左側=========
paragraph = document.add_paragraph()
paragraph.add_run(
    'Indentation is specified using a Length value, such as Inches, Pt, or Cm. Negative values are valid and cause the paragraph to overlap the margin by the specified amount. A value of None indicates the indentation value is inherited from the style hierarchy. Assigning None to an indentation property removes any directly-applied indentation setting and restores inheritance from the style hierarchy:')
paragraph_format = paragraph.paragraph_format
# print(paragraph_format.left_indent)
# paragraph_format.left_indent = Inches(0.5) # 設置為0.5 單位是cm,默認數字為正,向右縮進,為負,則向左移
# print(paragraph_format.left_indent)
# print(paragraph_format.left_indent.inches)

# 右側縮進
# print(paragraph_format.right_indent)
paragraph_format.right_indent = Pt(24)
# print(paragraph_format.right_indent)
# print(paragraph_format.right_indent.pt) # 注意:此時是小寫

# 首行縮進
# print(paragraph_format.first_line_indent)
paragraph_format.first_line_indent = Inches(0.25)
# print(paragraph_format.first_line_indent)
# print(paragraph_format.first_line_indent.inches)

# ==========制表符==========
"""
制表符停止確定段落文本中制表符的呈現。
特別是,它指定了選項卡字符后面的文本將
開始的位置,它將如何與該位置對齊。
"""
tab_stops = paragraph_format.tab_stops
tab_stop = tab_stops.add_tab_stop(Inches(1.5))
# print(tab_stop.position)
# print(tab_stop.position.inches)

# 默認左對齊,但可以通過提供WD_TAB對准枚舉領導字符默認為空格,但可以通過提供WD_TAB領導枚舉
tab_stop = tab_stops.add_tab_stop(Inches(1.5), WD_TAB_ALIGNMENT.RIGHT, WD_TAB_LEADER.DOTS)  # leader為前導符
# print("alignment:",tab_stop.alignment,',leader:',tab_stop.leader)

# ==========段落間距==========
# print(paragraph_format.space_before,paragraph_format.space_after)
paragraph_format.space_before = Pt(18) # 單位:磅
# print(paragraph_format.space_before.pt)
paragraph_format.space_after = Pt(12)
# print(paragraph_format.space_after.pt)

# ==========行距==========
# print(paragraph_format.line_spacing)
# print(paragraph_format.line_spacing_rule)
paragraph_format.line_spacing = Pt(18) # 固定值18磅
# print(paragraph_format.line_spacing)
# print(paragraph_format.line_spacing_rule)
# paragraph_format.line_spacing = 1.75 # 1.75倍行間距
# print(paragraph_format.line_spacing)
# print(paragraph_format.line_spacing_rule)

# ==========分頁==========
"""
keep_together導致整個段落出現在同一頁上,如果否則會在兩頁之間中斷,則在段落之前發出一個分頁。

keep_with_next將段落保存在與下一段相同的頁面上。例如,這可以用於將節標題保持在與節的第一段相同的頁面上。

page_break_before使段落放置在新頁的頂部。這可以在章節標題中使用,以確保章節從新頁面開始。

widow_control斷開一頁,以避免將段落的第一行或最后一行與段落的其余部分放在單獨的頁面上。
"""
# print(paragraph_format.keep_together)
paragraph_format.keep_with_next = True
# print(paragraph_format.keep_with_next)
paragraph_format.page_break_before = False
# print(paragraph_format.page_break_before)


# ===============================添加圖片================================
pic = document.add_picture('1.jpg', width=Inches(1.5))  # 圖片和python文件不在同一個文件夾下面的時候,要補全文件地址
# 圖片默認左對齊,要使圖片居中對齊還需要創鍵一個新的對象
last_paragraph = document.paragraphs[-1]  # 段落屬性,在這里代表每一行,一共三行,-1為最后一行
last_paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER  # 圖片居中設置

# ===============================添加表格=================================
rows = 3
cols = 3
table = document.add_table(rows=rows, cols=cols, style="Table Grid")  # 添加2行3列的表格
"""
表格的style有很多種,默認情況下表格是沒有邊框的,
Table Grid格式是普通的黑色邊框表格,更多表格樣式
可以百度。但是,我們很多時候希望對表格進行更為漂
亮的修改,比如自定義表格某一列的寬度,表格的高度。
"""

# 設置表格寬度
# table.autofit = False # 關閉表格的自適應寬度,其實與下面兩條語句共同執行的話,這條語句可以省略
# col = table.columns[0] # 獲取表格第1列
# col.width = Inches(3)  # 設置表格第1列寬度為Inches(5) 默認情況下表格是自動適應文檔寬度

# 設置表格高度
for i in range(rows):  # 遍歷表格的所有行
    tr = table.rows[i]._tr  # 獲取表格的每一行
    trPr = tr.get_or_add_trPr()  # 獲取或添加表行屬性
    trHeight = OxmlElement('w:trHeight')  # 獲取高度屬性
    trHeight.set(qn('w:val'), "450")  # 設置高度
    trPr.append(trHeight)  # 給表格添加高度屬性,表格的每一行進行高度設置,450這個值可以任意修改

# 向表格中添加文字
arr = [u'序號', u'類型', u'詳情描述']
arr2 = ['1', 'python', '列表']
arr3 = ['2', 'java', '數組']


# heading_cells = table.rows[0].cells  # 將表格的第一行設置為表頭
# row2 = table.rows[1].cells
# for i in range(cols):  # cols為表格的列數
#
#
#
#     # 表頭
#     p = heading_cells[i].paragraphs[0]  # 利用段落功能添加文字
#     run = p.add_run(arr[i])  # 把表頭放在一個數組里面的,這樣方便賦值
#     p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER  # 居中設置,默認是左對齊
#
#     # 內容第一行
#     r2 = row2[i].paragraphs[0]
#     r2.add_run(arr2[i])
#     r2.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER  # 居中設置,默認是左對齊


# 封裝成函數
def insert_data(num, cols, list):
    """
    :param num: 表格的第幾行
    :param cols: 表格列數
    :param list: 數據
    :return:
    """
    row = table.rows[num - 1].cells  # 獲取到表格的某一行
    for i in range(cols):  # 遍歷表格列數
        r = row[i].paragraphs[0]
        r.add_run(list[i])
        r.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER  # 居中設置,默認是左對齊


insert_data(1, cols, arr)
insert_data(2, cols, arr2)
insert_data(3, cols, arr3)

# 下面兩個不推薦使用,這樣會造成表格格式的混亂
# 直接給表中的某一個單元格賦值
# table.cell(1, 1).text = 'c'  # 在表格的i行j列設置文字,默認文字在表格中是左對齊
# table.cell(1, 2).text = '數組(難)'

# 在表格最下方添加行
# table.add_row()


document.save('test.docx')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM