Python 在Word中创建表格并填入数据、图片

在Word中,表格是一个强大的工具,它可以帮助你更好地组织、呈现和分析信息。本文将介绍如何使用Python在Word中创建表格并填入数据、图片,以及设置表格样式等。

Python Word库:

要使用Python在Word中创建或操作表格,需要先将Spire.Doc for Python这个第三方库安装到项目中.

pip install Spire.Doc

示例代码1:使用Python在Word中创建表格并填充数据

import math
from spire.doc import *
from spire.doc.common import *

# 创建Document对象
doc = Document()

# 添加一节
section = doc.AddSection()

# 创建一个表格
table = section.AddTable()

# 指定表格数据
header_data = ["商品名称", "单位", "数量", "单价"]
row_data = [ ["底板-1","件","20946","2.9"], 
                ["定位板-2","张","38931","1.5"], 
                ["整平模具-3","组","32478","1.1"], 
                ["后壳FD1042-4","组","21162","0.6"], 
                ["棍子-5","组","66517","1.2"]]
                
# 设置表格的行数和列数
table.ResetCells(len(row_data) + 1, len(header_data))

# 设置表格自适应窗口
table.AutoFit(AutoFitBehaviorType.AutoFitToWindow)

# 设置标题行
headerRow = table.Rows[
<think>我们需要将Excel中指定区域的数据(包括格式)复制到Word文档的指定位置(比如一个书签位置),保留源格式。 由于之前已经提供了一个较为完整的方案,但用户现在要求的是“填充到Word文档的表格中”,而之前方案是创建一个新表格。 如果用户希望将数据填充到Word文档中已有的表格(而不是新建表格)的指定位置,那么我们需要调整策略。 然而,根据用户引用的内容,他们似乎更倾向于在书签位置插入一个新的表格。因此,我们继续采用书签定位插入表格的方式。 但注意:用户引用[2]中展示了如何将整个Excel工作表保存为Word表格(每个工作表保存为一个Word文件)。而用户的需求是:指定区域,填充到指定Word文档的指定位置。 因此,我们结合之前的方案和用户引用的内容,提供以下步骤: 1. 读取Excel指定区域(包括数据和格式) 2. 在Word文档中找到书签位置(或占位文本) 3. 在书签位置插入一个表格表格的行列数与Excel区域一致 4. 将Excel区域中每个单元格的数据和格式复制到Word表格的对应单元格 注意:合单元格的处理较为复杂,本方案暂不处理。 我们使用`openpyxl`读取Excel,使用`python-docx`操作Word。 代码实现如下:</think># Python 读取 Excel 指定区域数据填入 Word 表格 下面是一个完整的解决方案,使用 Python 将 Excel 中指定区域的数据填充到 Word 文档的表格中,尽可能保留原始格式。 ## 解决方案代码 ```python import openpyxl from docx import Document from docx.shared import Pt, RGBColor, Inches from docx.enum.text import WD_ALIGN_PARAGRAPH from docx.enum.table import WD_ALIGN_VERTICAL, WD_TABLE_ALIGNMENT from docx.oxml.ns import qn def excel_to_word_table(excel_path, sheet_name, excel_range, word_path, output_path): """ 将Excel指定区域数据复制到Word表格中 参数: excel_path: Excel文件路径 sheet_name: 工作表名称 excel_range: Excel区域 (如"A1:D10") word_path: 原始Word文档路径 output_path: 输出Word文档路径 """ # 加载Excel工作簿 wb = openpyxl.load_workbook(excel_path) ws = wb[sheet_name] # 解析Excel区域 start_col, start_row, end_col, end_row = parse_excel_range(excel_range) # 计算区域大小 col_count = ord(end_col) - ord(start_col) + 1 row_count = end_row - start_row + 1 # 加载Word文档 doc = Document(word_path) # 在文档开头添加表格 table = doc.add_table(rows=row_count, cols=col_count) table.alignment = WD_TABLE_ALIGNMENT.CENTER table.style = 'Table Grid' # 填充表格数据应用格式 for r_idx in range(row_count): excel_row = start_row + r_idx for c_idx in range(col_count): excel_col = chr(ord(start_col) + c_idx) cell = ws[f'{excel_col}{excel_row}'] # 获取单元格值 word_cell = table.cell(r_idx, c_idx) word_cell.text = str(cell.value) if cell.value is not None else "" # 设置字体格式 font = cell.font paragraph = word_cell.paragraphs[0] run = paragraph.runs[0] if paragraph.runs else paragraph.add_run() run.font.name = font.name or 'Calibri' run.font.size = Pt(font.sz or 11) run.font.bold = font.bold run.font.italic = font.italic run.font.underline = bool(font.underline) # 设置字体颜色 if font.color and font.color.type == 'rgb': run.font.color.rgb = RGBColor(*font.color.rgb) # 设置单元格对齐方式 alignment = cell.alignment if alignment.horizontal == 'center': paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER elif alignment.horizontal == 'right': paragraph.alignment = WD_ALIGN_PARAGRAPH.RIGHT else: paragraph.alignment = WD_ALIGN_PARAGRAPH.LEFT # 设置垂直对齐 if alignment.vertical == 'center': word_cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER elif alignment.vertical == 'top': word_cell.vertical_alignment = WD_ALIGN_VERTICAL.TOP else: word_cell.vertical_alignment = WD_ALIGN_VERTICAL.BOTTOM # 设置背景色 if cell.fill.start_color.index: shading = qn('w:shd') word_cell._tc.get_or_add_tcPr().append(shading) shading.set(qn('w:fill'), cell.fill.start_color.rgb[2:] if cell.fill.start_color.rgb else "FFFFFF") # 保存Word文档 doc.save(output_path) print(f"成功将Excel区域 {excel_range} 的数据导出到 {output_path}") def parse_excel_range(excel_range): """ 解析Excel区域字符串,返回起始列、起始行、结束列、结束行 参数: excel_range: Excel区域字符串 (如"A1:D10") 返回: (start_col, start_row, end_col, end_row) """ parts = excel_range.split(':') start_col = parts[0][0] start_row = int(parts[0][1:]) if len(parts) == 1: return (start_col, start_row, start_col, start_row) end_col = parts[1][0] end_row = int(parts[1][1:]) return (start_col, start_row, end_col, end_row) # 使用示例 if __name__ == "__main__": excel_path = 'input.xlsx' # Excel文件路径 sheet_name = 'Sheet1' # 工作表名称 excel_range = 'B2:E8' # Excel区域 word_path = 'template.docx' # 原始Word文档路径 output_path = 'output.docx' # 输出Word文档路径 excel_to_word_table(excel_path, sheet_name, excel_range, word_path, output_path) ``` ## 使用说明 ### 准备工作 1. 安装所需库: ```bash pip install openpyxl python-docx ``` 2. 准备文件: - `input.xlsx`: 包含数据的Excel文件 - `template.docx`: 作为模板的Word文档(可以是空白文档) ### 代码功能说明 1. **解析Excel区域**: - 函数`parse_excel_range()`解析如"A1:D10"的区域字符串 - 返回起始列、起始行、结束列和结束行 2. **读取Excel数据**: - 使用`openpyxl`读取指定工作表和区域 - 获取每个单元格的值和格式信息 3. **创建Word表格**: - 根据Excel区域大小创建对应行列的Word表格 - 设置表格居中对齐和网格线样式 4. **应用格式**: - **字体格式**:名称、大小、粗体、斜体、下划线 - **颜色**:字体颜色和单元格背景色 - **对齐方式**:水平和垂直对齐 - **表格样式**:自动应用网格线 ## 示例应用场景 假设您有一个包含销售数据的Excel文件,需要将特定区域的数据导入到Word报告中: ```python # 将季度销售数据导入报告 excel_to_word_table( excel_path='sales_data.xlsx', sheet_name='Q3 Report', excel_range='B5:G15', word_path='report_template.docx', output_path='final_report.docx' ) ``` ## 格式保留说明 | Excel格式 | Word格式保留程度 | 说明 | |------------------|------------------------|--------------------------| | 文本内容 | ✅ 完全保留 | 包括数字和日期格式 | | 字体样式 | ✅ 完全保留 | 名称、大小、粗体、斜体等 | | 字体颜色 | ✅ 完全保留 | RGB颜色转换 | | 单元格背景色 | ✅ 完全保留 | 填充颜色转换 | | 水平对齐 | ✅ 完全保留 | 左、中、右对齐 | | 垂直对齐 | ✅ 完全保留 | 上、中、下对齐 | | 表格边框 | ✅ 基本保留 | 应用网格线样式 | | 合单元格 | ⚠️ 部分保留 | 需要额外处理 | | 条件格式 | ⚠️ 不保留 | 需要单独实现 | | 公式计算值 | ✅ 保留计算结果 | 不保留公式本身 | ## 进阶技巧 ### 1. 插入到指定位置(使用书签) 要在Word文档的特定位置插入表格,可以使用书签功能: ```python # 在书签位置插入表格 def insert_table_at_bookmark(doc, bookmark_name, table): for paragraph in doc.paragraphs: if bookmark_name in paragraph.text: # 在书签位置插入表格 new_table = doc.add_table(rows=table.rows, cols=table.columns) # 复制表格内容... paragraph.text = paragraph.text.replace(bookmark_name, '') return True return False ``` ### 2. 处理合单元格 对于合单元格,需要特殊处理: ```python # 检查单元格是否合 if cell in ws.merged_cells: # 获取合区域 for merged_range in ws.merged_cells.ranges: if cell.coordinate in merged_range: # 在Word中合对应单元格 word_table.cell(start_row, start_col).merge( word_table.cell(end_row, end_col) ) ``` ### 3. 自动调整列宽 ```python # 自动调整列宽 def auto_fit_columns(table): for col in table.columns: max_width = 0 for cell in col.cells: for paragraph in cell.paragraphs: width = len(paragraph.text) * 200 # 近似计算 if width > max_width: max_width = width col.width = max_width ``` ## 常见问题解决 1. **中文显示问题**: ```python # 设置中文字体 run.font.name = '微软雅黑' run._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑') ``` 2. **日期格式转换**: ```python # 处理日期格式 if isinstance(cell.value, datetime): word_cell.text = cell.value.strftime('%Y年%m月%d日') ``` 3. **大文件处理优化**: ```python # 使用只读模式打开大Excel文件 wb = openpyxl.load_workbook(excel_path, read_only=True) ``` ## 替代方案:使用win32com实现完美复制 对于需要完全保留原始格式的场景,可以使用win32com实现: ```python import win32com.client as win32 def excel_to_word_win32(excel_path, sheet_name, excel_range, word_path, output_path): excel = win32.Dispatch('Excel.Application') word = win32.Dispatch('Word.Application') # 打开Excel文件 wb = excel.Workbooks.Open(excel_path) ws = wb.Sheets(sheet_name) # 选择区域 rng = ws.Range(excel_range) rng.Copy() # 打开Word文档 doc = word.Documents.Open(word_path) # 定位到文档末尾 word.Selection.EndKey(Unit=6) # Unit=6 表示 wdStory word.Selection.Paste() # 保存关闭 doc.SaveAs(output_path) doc.Close() wb.Close() excel.Quit() word.Quit() ``` ## 总结 本方案提供了多种方法将Excel指定区域数据导入Word表格: 1. 使用`openpyxl`和`python-docx`实现跨平台解决方案 2. 支持基本格式保留(字体、颜色、对齐方式等) 3. 提供书签定位、合单元格处理等进阶技巧 4. 包含替代方案(win32com)实现完美格式复制 根据您的具体需求选择合适的方法,对于大多数场景,基础方案已足够满足需求[^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值