Hướng dẫn python-docx set table column width - python-docx đặt chiều rộng cột bảng

Câu trả lời ngắn: Đặt chiều rộng ô riêng lẻ.

for cell in table.columns[0].cells:
    cell.width = Inches(0.5)

python-docx thực hiện những gì bạn bảo nó làm khi bạn đặt chiều rộng cột. Vấn đề là từ đó bỏ qua nó. Các máy khách khác, như LibreOffice, tôn trọng cài đặt chiều rộng cột.

Một tệp .docx ở định dạng XML (do đó là hậu tố 'X' trong phần mở rộng tệp). Từ vựng XML cho các bảng có một vị trí cho chiều rộng cột và một vị trí cho chiều rộng ô. Ai chú ý đến những gì hơi bực tức khi nói đến chi tiết này. Một mẫu số chung là mọi người đều tôn trọng các chiều rộng rõ ràng được đặt ở cấp độ ô riêng lẻ. Nó không có nhiều ý nghĩa với tôi, nhưng đây là những gì nó cần để làm cho nó hoạt động. Có thể có ý nghĩa khi có một chức năng trong chương trình của bạn chăm sóc các chi tiết:

def set_col_widths(table):
    widths = (Inches(1), Inches(2), Inches(1.5))
    for row in table.rows:
        for idx, width in enumerate(widths):
            row.cells[idx].width = width

Điều này sẽ phức tạp hơn một chút nếu bảng của bạn đã hợp nhất các ô, đó thực sự có thể là lý do từ bỏ qua chiều rộng cột; Họ mơ hồ trong một số tình huống tế bào hợp nhất nhất định.

Sự sắp hàng

Word cho phép một bảng được căn chỉnh giữa các lề trang bên trái, phải hoặc trung tâm.

Thuộc tính Đọc/Viết Table.alignment Chỉ định căn chỉnh cho một bảng:

>>> table = document.add_table(rows=2, cols=2)
>>> table.alignment
None
>>> table.alignment = WD_TABLE_ALIGNMENT.RIGHT
>>> table.alignment
RIGHT (2)

Autofit¶

Word có hai thuật toán để đặt ra một bảng, chiều rộng cố định hoặc tự động. Mặc định là tự động. Word sẽ điều chỉnh chiều rộng cột trong bảng tự động dựa trên nội dung ô. Một bảng chiều rộng cố định giữ lại chiều rộng cột của nó bất kể nội dung. Thuật toán sẽ điều chỉnh chiều rộng cột theo tỷ lệ khi tổng chiều rộng của bảng vượt quá chiều rộng trang.

Thuộc tính Read/Write

def set_col_widths(table):
    widths = (Inches(1), Inches(2), Inches(1.5))
    for row in table.rows:
        for idx, width in enumerate(widths):
            row.cells[idx].width = width
0 chỉ định thuật toán nào được sử dụng:

>>> table = document.add_table(rows=2, cols=2)
>>> table.allow_autofit
True
>>> table.allow_autofit = False
>>> table.allow_autofit
False

Mẫu vật XML¶

XML sau đại diện cho bảng 2x2:


  
     w:val="TableGrid"/>
     w:type="auto" w:w="0"/>
     w:val="right"/>
     w:firstColumn="1" w:firstRow="1" w:lastColumn="0"
               w:lastRow="0" w:noHBand="0" w:noVBand="1" w:val="04A0"/>
  
  
     w:w="4788"/>
     w:w="4788"/>
  
  
    
      
         w:type="dxa" w:w="4788"/>
      
      
    
    
      
         w:type="dxa" w:w="4788"/>
      
      
    
  
  
    
      
         w:type="dxa" w:w="4788"/>
      
      
    
    
      
         w:type="dxa" w:w="4788"/>
      
      
    
  

Hành vi bố cục

Tự động-Layout khiến chiều rộng cột thực tế vừa không thể đoán trước và không ổn định. Các thay đổi đối với nội dung có thể làm cho bố cục bảng thay đổi.

Ngữ nghĩa của ct_tblwidth phần tử

ví dụ.

def set_col_widths(table):
    widths = (Inches(1), Inches(2), Inches(1.5))
    for row in table.rows:
        for idx, width in enumerate(widths):
            row.cells[idx].width = width
1:

 w:w="42.4mm"/>

 w:w="1800" w:type="dxa"/>

 w:w="20%" w:type="pct"/>

 w:w="0" w:type="auto"/>

 w:type="nil"/>


ST_MeasurementOrPercent
|
+-- ST_DecimalNumberOrPercent
|   |
|   +-- ST_UnqualifiedPercentage
|   |   |
|   |   +-- XsdInteger e.g. '1440'
|   |
|   +-- ST_Percentage e.g. '-07.43%'
|
+-- ST_UniversalMeasure  e.g. '-04.34mm'

Định nghĩa lược đồ

 name="CT_Tbl">  
  
        ref="EG_RangeMarkupElements"        minOccurs="0" maxOccurs="unbounded"/>
     name="tblPr"       type="CT_TblPr"/>
     name="tblGrid"     type="CT_TblGrid"/>
                                           minOccurs="0" maxOccurs="unbounded">
       name="tr"        type="CT_Row"/>
       name="customXml" type="CT_CustomXmlRow"/>
       name="sdt"       type="CT_SdtRow"/>
          ref="EG_RunLevelElts"             minOccurs="0" maxOccurs="unbounded"/>
    
  


 name="CT_TblPr">  
  
     name="tblStyle"            type="CT_String"        minOccurs="0"/>
     name="tblpPr"              type="CT_TblPPr"        minOccurs="0"/>
     name="tblOverlap"          type="CT_TblOverlap"    minOccurs="0"/>
     name="bidiVisual"          type="CT_OnOff"         minOccurs="0"/>
     name="tblStyleRowBandSize" type="CT_DecimalNumber" minOccurs="0"/>
     name="tblStyleColBandSize" type="CT_DecimalNumber" minOccurs="0"/>
     name="tblW"                type="CT_TblWidth"      minOccurs="0"/>
     name="jc"                  type="CT_JcTable"       minOccurs="0"/>
     name="tblCellSpacing"      type="CT_TblWidth"      minOccurs="0"/>
     name="tblInd"              type="CT_TblWidth"      minOccurs="0"/>
     name="tblBorders"          type="CT_TblBorders"    minOccurs="0"/>
     name="shd"                 type="CT_Shd"           minOccurs="0"/>
     name="tblLayout"           type="CT_TblLayoutType" minOccurs="0"/>
     name="tblCellMar"          type="CT_TblCellMar"    minOccurs="0"/>
     name="tblLook"             type="CT_TblLook"       minOccurs="0"/>
     name="tblCaption"          type="CT_String"        minOccurs="0"/>
     name="tblDescription"      type="CT_String"        minOccurs="0"/>
     name="tblPrChange"         type="CT_TblPrChange"   minOccurs="0"/>
  



 name="CT_JcTable">
   name="val" type="ST_JcTable" use="required"/>


 name="ST_JcTable">
   base="xsd:string">
     value="center"/>
     value="end"/>
     value="left"/>
     value="right"/>
     value="start"/>
  




 name="CT_TblWidth">
   name="w"    type="ST_MeasurementOrPercent"/>
   name="type" type="ST_TblWidth"/>


 name="ST_MeasurementOrPercent">
   memberTypes="ST_DecimalNumberOrPercent s:ST_UniversalMeasure"/>


 name="ST_DecimalNumberOrPercent">
   memberTypes="ST_UnqualifiedPercentage s:ST_Percentage"/>


 name="ST_UniversalMeasure">
   base="xsd:string">
     value="-?[0-9]+(\.[0-9]+)?(mm|cm|in|pt|pc|pi)"/>
  


 name="ST_UnqualifiedPercentage">
   base="xsd:integer"/>


 name="ST_Percentage">
   base="xsd:string">
     value="-?[0-9]+(\.[0-9]+)?%"/>
  


 name="ST_TblWidth">
   base="xsd:string">
     value="nil"/>
     value="pct"/>
     value="dxa"/>
     value="auto"/>
  




 name="CT_TblLayoutType">
   name="type" type="ST_TblLayoutType"/>


 name="ST_TblLayoutType">
   base="xsd:string">
     value="fixed"/>
     value="autofit"/>
  




 name="CT_TblLook">
   name="firstRow"    type="s:ST_OnOff"/>
   name="lastRow"     type="s:ST_OnOff"/>
   name="firstColumn" type="s:ST_OnOff"/>
   name="lastColumn"  type="s:ST_OnOff"/>
   name="noHBand"     type="s:ST_OnOff"/>
   name="noVBand"     type="s:ST_OnOff"/>
   name="val"         type="ST_ShortHexNumber"/>