Word2Excel/
│
├── input.docx
├── word_nested_table_to_excel.py
├── output.xlsx
└── README.txt
from docx import Document
from openpyxl import Workbook
from openpyxl.styles import Font
from openpyxl.utils import get_column_letter
WORD_FILE="input.docx"
OUTPUT_FILE="output.xlsx"
doc=Document(WORD_FILE)
wb=Workbook()
ws=wb.active
out_row=1
def first_run(cell):
for p in cell.paragraphs:
for r in p.runs:
if r.text:
return r
return None
def write_table(tbl, level):
global out_row
ws.cell(out_row,1).value=f"Level {level} Table"
ws.cell(out_row,1).font=Font(bold=True)
out_row+=1
for r,row in enumerate(tbl.rows):
for c,cell in enumerate(row.cells):
txt="".join(run.text for p in cell.paragraphs for run in p.runs)
ec=ws.cell(out_row+r,c+1)
ec.value=txt
run=first_run(cell)
if run:
color=None
try:
if run.font.color and run.font.color.rgb:
color=str(run.font.color.rgb)
except:
pass
ec.font=Font(
name=run.font.name,
size=run.font.size.pt if run.font.size else None,
bold=run.font.bold,
italic=run.font.italic,
underline="single" if run.font.underline else None,
color=color
)
out_row+=len(tbl.rows)+2
def walk(tbl, level=0):
write_table(tbl, level)
for row in tbl.rows:
for cell in row.cells:
for nt in cell.tables:
walk(nt, level+1)
for t in doc.tables:
walk(t)
for col in ws.columns:
m=0
for cell in col:
if cell.value:
m=max(m,len(str(cell.value)))
ws.column_dimensions[get_column_letter(col[0].column)].width=min(max(m+2,10),60)
wb.save(OUTPUT_FILE)
print("Done:",OUTPUT_FILE)
留言
張貼留言