import ezodf def write_data_to_ods_template(template_path, output_path, sheet_name="Tests", data=None): """ 向指定的 .ods 模板文件中写入数据,并保存为新文件。 参数: template_path: 模板文件路径,例如:"template.ods" output_path: 输出文件路径,例如:"output.ods" sheet_name: 工作表名称,默认为 "Tests" data: 二维列表,表示要写入的数据,例如: [ ["张三", "25", "北京"], ["李四", "30", "上海"] ] """ if data is None: data = [{'binOveron': 'no', 'binReprobe': 'no', 'binType': 'bad', 'hardBin': '2', 'hardBinName': 'OS_failed', 'lslFt': '-150', 'lslQA': '-150', 'lslTypFt': 'GE', 'lslTypQA': 'GE', 'softBin': '2000', 'softBinName': 'OS_PS_failed', 'testInstName': '**.OS_PS.ptdGroup[VDD]', 'testName': 'ptd', 'testNumber': '20000100', 'testRemarks': '', 'unitFt': 'uA', 'unitQA': 'uA', 'uslFt': '10000', 'uslQA': '10000', 'uslTypFt': 'LE', 'uslTypQA': 'LE'}, {'binOveron': 'no', 'binReprobe': 'no', 'binType': 'bad', 'hardBin': '2', 'hardBinName': 'OS_failed', 'lslFt': '-150', 'lslQA': '-150', 'lslTypFt': 'GE', 'lslTypQA': 'GE', 'softBin': '2000', 'softBinName': 'OS_PS_failed', 'testInstName': '**.OS_PS.ptdGroup[VDD_AVS]', 'testName': 'ptd', 'testNumber': '20000200', 'testRemarks': '', 'unitFt': 'uA', 'unitQA': 'uA', 'uslFt': '10000', 'uslQA': '10000', 'uslTypFt': 'LE', 'uslTypQA': 'LE'}, {'binOveron': 'no', 'binReprobe': 'no', 'binType': 'bad', 'hardBin': '2', 'hardBinName': 'OS_failed', 'lslFt': '-150', 'lslQA': '-150', 'lslTypFt': 'GE', 'lslTypQA': 'GE', 'softBin': '2000', 'softBinName': 'OS_PS_failed', 'testInstName': '**.OS_PS.ptdGroup[VDD_FIX_0V7]', 'testName': 'ptd', 'testNumber': '20000300', 'testRemarks': '', 'unitFt': 'uA', 'unitQA': 'uA', 'uslFt': '10000', 'uslQA': '10000', 'uslTypFt': 'LE', 'uslTypQA': 'LE'}, {'binOveron': 'no', 'binReprobe': 'no', 'binType': 'bad', 'hardBin': '2', 'hardBinName': 'OS_failed', 'lslFt': '-150', 'lslQA': '-150', 'lslTypFt': 'GE', 'lslTypQA': 'GE', 'softBin': '2000', 'softBinName': 'OS_PS_failed', 'testInstName': '**.OS_PS.ptdGroup[VDDLV_PLL]', 'testName': 'ptd', 'testNumber': '20000400', 'testRemarks': '', 'unitFt': 'uA', 'unitQA': 'uA', 'uslFt': '10000', 'uslQA': '10000', 'uslTypFt': 'LE', 'uslTypQA': 'LE'}] # 打开模板文件 doc = ezodf.opendoc(template_path) # 获取指定工作表 try: sheet = doc.sheets[sheet_name] except KeyError: raise ValueError(f"工作表 '{sheet_name}' 不存在于模板中。") # 设置第2行(索引为1),第E列(索引为4)的值为 "80C" # sheet[1, 4].set_value("80C") # 行索引从0开始,所以第2行是索引1,E列是索引4 # 写入数据到从第3行开始的位置(跳过前两行) for row_idx, row_data in enumerate(data): for col_idx, value in enumerate(row_data): sheet[row_idx + 2, col_idx].set_value(value) # 从第3行开始写入数据 # 保存为新文件(也可以覆盖原文件) doc.saveas(output_path) print(f"数据已成功写入至:{output_path}") # 执行函数 if __name__ == "__main__": write_data_to_ods_template( "C:/Users/lwx1431831/Desktop/ods/ods_template.ods", "C:/Users/lwx1431831/Desktop/ods/out.ods" ) 这段代码我希望当列为0时,写入testInstName的值,当列为1时,写入testName的值
时间: 2025-06-30 17:15:19 浏览: 4
你希望在写入数据时,**仅在特定列(例如第0列和第1列)写入指定字段的值**,而不是将整条字典的所有键都写入。目前你的代码使用了 `for col_idx, value in enumerate(row_data):`,它实际上遍历的是字典的键名,这并不是你想要的方式。
---
### ✅ 正确做法:
- 不要直接遍历 `row_data` 的键。
- 明确指定:
- 第 0 列写入 `testInstName`
- 第 1 列写入 `testName`
---
### ✅ 修改后的完整函数示例
```python
import ezodf
def write_data_to_ods_template(template_path, output_path, sheet_name="Tests", data=None):
"""
向指定的 .ods 模板文件中写入数据,并保存为新文件。
参数:
template_path: 模板文件路径,例如:"template.ods"
output_path: 输出文件路径,例如:"output.ods"
sheet_name: 工作表名称,默认为 "Tests"
data: 字典列表,表示要写入的数据
"""
if data is None:
data = [
{
'binOveron': 'no', 'binReprobe': 'no', 'binType': 'bad', 'hardBin': '2',
'hardBinName': 'OS_failed', 'lslFt': '-150', 'lslQA': '-150',
'lslTypFt': 'GE', 'lslTypQA': 'GE', 'softBin': '2000',
'softBinName': 'OS_PS_failed', 'testInstName': '**.OS_PS.ptdGroup[VDD]',
'testName': 'ptd', 'testNumber': '20000100', 'testRemarks': '',
'unitFt': 'uA', 'unitQA': 'uA', 'uslFt': '10000', 'uslQA': '10000',
'uslTypFt': 'LE', 'uslTypQA': 'LE'
},
{
'binOveron': 'no', 'binReprobe': 'no', 'binType': 'bad', 'hardBin': '2',
'hardBinName': 'OS_failed', 'lslFt': '-150', 'lslQA': '-150',
'lslTypFt': 'GE', 'lslTypQA': 'GE', 'softBin': '2000',
'softBinName': 'OS_PS_failed', 'testInstName': '**.OS_PS.ptdGroup[VDD_AVS]',
'testName': 'ptd', 'testNumber': '20000200', 'testRemarks': '',
'unitFt': 'uA', 'unitQA': 'uA', 'uslFt': '10000', 'uslQA': '10000',
'uslTypFt': 'LE', 'uslTypQA': 'LE'
}
]
# 打开模板文件
doc = ezodf.opendoc(template_path)
# 获取指定工作表
try:
sheet = doc.sheets[sheet_name]
except KeyError:
raise ValueError(f"工作表 '{sheet_name}' 不存在于模板中。")
# 写入数据到从第3行开始的位置(跳过前两行)
for row_idx, item in enumerate(data):
sheet[row_idx + 2, 0].set_value(item.get('testInstName', '')) # 第0列:testInstName
sheet[row_idx + 2, 1].set_value(item.get('testName', '')) # 第1列:testName
# 保存为新文件(也可以覆盖原文件)
doc.saveas(output_path)
print(f"数据已成功写入至:{output_path}")
# 执行函数
if __name__ == "__main__":
write_data_to_ods_template(
template_path="C:/Users/lwx1431831/Desktop/ods/ods_template.ods",
output_path="C:/Users/lwx1431831/Desktop/ods/out.ods"
)
```
---
### 🧠 错误原因分析:
- 原代码中的 `for col_idx, value in enumerate(row_data)` 实际上是遍历字典的键(如 `'testInstName'`, `'testName'` 等),而非对应的值。
- 因此你在写入单元格时其实是在写入字符串(键名),而不是它们的值。
---
### ✅ 关键点总结:
| 目标 | 实现方式 |
|------|----------|
| 只写入某些列 | 手动选择字段赋值给特定列 |
| 避免写入所有字段 | 不使用 `enumerate(row_data)` |
| 安全获取字段值 | 使用 `.get(key, default)` 方法防止 KeyError |
---
###
阅读全文
相关推荐


















