简单代码可以在Quicker里面运行并输出结果,用AI写了如下代码,代码目的是“将Word文档里面的表格批量导入到Excel里面”,代码已经可以在Python里面运行并得到结果,但是不知道如何放进Quick里面,研究了好几天,希望有大神指导下
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
export_word_tables.py
批量把指定目录下所有 .docx 中的表格导出到单个 Excel 文件(一 Word 一 Sheet)
import os
import re
from pathlib import Path
from docx import Document
from openpyxl import Workbook
from openpyxl.utils import get_column_letter
# ------------------------------------------------------------
# 1. 配置
'''if len(sys.argv) >= 3:
SEARCH_DIR = sys.argv[1]
OUTPUT_FILE = sys.argv[2]
'''
filePath ='K:\\桌面文件 - 副本\\1'
#filePath_name = '\\导出来的word表格.xlsx'
SEARCH_DIR = filePath # 要扫描的目录;可改成 r"D:\docs" 等
#Excel_file_name = filePath + filePath_name
OUTPUT_FILE = filePath + '\\导出来的word表格.xlsx'
# 2. 工具函数
def sanitize_sheet_name(name: str, max_len: 31) -> str:
Excel Sheet 名不能含 \ / ? * [ ] : 且 <=31 字符
name = re.sub(r"[\\/*?:\[\]]", "_", name)
return name[:max_len]
def docx_tables_to_sheet(doc_path: Path, ws):
把一个 docx 里的所有表格写到 ws 工作表
doc = Document(doc_path)
if not doc.tables:
return False # 没有表格
current_row = 1
for tbl_idx, table in enumerate(doc.tables, 1):
# 表头:表格 1、表格 2 ...
ws.cell(row=current_row, column=1, value=f"表格 {tbl_idx}")
ws.cell(row=current_row, column=1).font = ws.cell(row=1, column=1).font.copy(bold=True)
current_row += 1
# 写数据
for r, row in enumerate(table.rows, current_row):
for c, cell in enumerate(row.cells, 1):
# 合并单元格会重复,取第一个 text
text = re.sub(r"\s+", " ", cell.text).strip()
ws.cell(row=r, column=c, value=text)
current_row = r + 1 # 跳过已写行
return True
# 3. 主流程
def main():
wb = Workbook()
# 删除默认空 Sheet
if "Sheet" in wb.sheetnames:
std = wb["Sheet"]
wb.remove(std)
search_path = Path(SEARCH_DIR).resolve()
docx_files = search_path.rglob("*.docx")
for docx_file in docx_files:
sheet_name = sanitize_sheet_name(docx_file.stem, 31)
# 避免重名
counter = 1
original = sheet_name
while sheet_name in wb.sheetnames:
sheet_name = f"{original}_{counter}"
counter += 1
ws = wb.create_sheet(title=sheet_name)
written = docx_tables_to_sheet(docx_file, ws)
if not written:
wb.remove(ws) # 没表格就删掉空 Sheet
continue
# 自动列宽(简单版)
for col in ws.iter_cols():
max_len = max(len(str(cell.value or "")) for cell in col)
ws.column_dimensions[get_column_letter(col[0].column)].width = min(max_len + 2, 50)
if not wb.sheetnames:
print("未在任何 .docx 中发现表格,未生成文件。")
return
wb.save(OUTPUT_FILE)
print(f"完成!已生成 {OUTPUT_FILE},共 {len(wb.sheetnames)} 个 Sheet。")
if __name__ == "__main__":
main()
你的py版本是多少,Quicker和py是多少位的(64位/32位)?
PY是3.12.10,QK是1.44.22,简单代码可以在QK里面运行望大神指导下,我的那个代码放入Quicker里面如何才能运行
1.如果py的简单代码可以运行,那你的py环境就是正常的,可以使用2.你把代码中所有打印输出的代码,都删除了,qk里面不能打印输出,如:print("未在任何 .docx 中发现表格,未生成文件。")后再试试
还是不行,我再放一个截图,第3条评论的截图
你现在的问题是什么呢,1.代码无法运行成功2.1、word文档的路径,2、输出Excel的路径,这两个不知道如何传进Python代码里面,使得可以在Quicke里面使用, 但代码可以运行成功
问题是2;代码单独在Python里面可以运行并得到想要的表格。就是不知道如何制作成Quicker动作
https://getquicker.net/Sharedaction?code=0dac8cea-c7c3-4a2b-bec6-08ddcd652bdf这是一个简单的py测试,向TXT文件写入内容,新建一个空白的TXT文件就行,你参考一下
好的,感谢感谢
https://getquicker.net/kc/help/doc/pythonscript 可以用这个模块运行py代码。
嗯嗯,这个说明也是研究了好几天,感觉应该是接近了胜利,但是就是不知道怎么得不到想要的结果,我刚刚把握的代码放进去了,希望大神帮忙解答下,目前是QK-PY-QK-输出到Word同路径,这个步骤不知道怎么操作
或者也可以用运行脚本,相当于执行python.exe 代码.py 。 通过文本插值把路径插值到py代码里。
运行脚本模块 - Quicker
代码原来的使用方法就是:把代码放在需要导出word所有表格的文档同路径下面,然后双击,就在同路径里面生成的一个Excel文件,里面包含所有表格。这里面有两个变量,1、word文档的路径,2、输出Excel的路径,这两个不知道如何传进Python代码里面,使得可以在Quicke里面使用
好的,我再学习下文本插值命令,感谢感谢
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
export_word_tables.py
批量把指定目录下所有 .docx 中的表格导出到单个 Excel 文件(一 Word 一 Sheet)
"""
import os
import re
from pathlib import Path
from docx import Document
from openpyxl import Workbook
from openpyxl.utils import get_column_letter
# ------------------------------------------------------------
# 1. 配置
# ------------------------------------------------------------
'''if len(sys.argv) >= 3:
SEARCH_DIR = sys.argv[1]
OUTPUT_FILE = sys.argv[2]
'''
filePath ='K:\\桌面文件 - 副本\\1'
#filePath_name = '\\导出来的word表格.xlsx'
SEARCH_DIR = filePath # 要扫描的目录;可改成 r"D:\docs" 等
#Excel_file_name = filePath + filePath_name
OUTPUT_FILE = filePath + '\\导出来的word表格.xlsx'
# ------------------------------------------------------------
# 2. 工具函数
# ------------------------------------------------------------
def sanitize_sheet_name(name: str, max_len: 31) -> str:
"""
Excel Sheet 名不能含 \ / ? * [ ] : 且 <=31 字符
"""
name = re.sub(r"[\\/*?:\[\]]", "_", name)
return name[:max_len]
def docx_tables_to_sheet(doc_path: Path, ws):
"""
把一个 docx 里的所有表格写到 ws 工作表
"""
doc = Document(doc_path)
if not doc.tables:
return False # 没有表格
current_row = 1
for tbl_idx, table in enumerate(doc.tables, 1):
# 表头:表格 1、表格 2 ...
ws.cell(row=current_row, column=1, value=f"表格 {tbl_idx}")
ws.cell(row=current_row, column=1).font = ws.cell(row=1, column=1).font.copy(bold=True)
current_row += 1
# 写数据
for r, row in enumerate(table.rows, current_row):
for c, cell in enumerate(row.cells, 1):
# 合并单元格会重复,取第一个 text
text = re.sub(r"\s+", " ", cell.text).strip()
ws.cell(row=r, column=c, value=text)
current_row = r + 1 # 跳过已写行
return True
# ------------------------------------------------------------
# 3. 主流程
# ------------------------------------------------------------
def main():
wb = Workbook()
# 删除默认空 Sheet
if "Sheet" in wb.sheetnames:
std = wb["Sheet"]
wb.remove(std)
search_path = Path(SEARCH_DIR).resolve()
docx_files = search_path.rglob("*.docx")
for docx_file in docx_files:
sheet_name = sanitize_sheet_name(docx_file.stem, 31)
# 避免重名
counter = 1
original = sheet_name
while sheet_name in wb.sheetnames:
sheet_name = f"{original}_{counter}"
counter += 1
ws = wb.create_sheet(title=sheet_name)
written = docx_tables_to_sheet(docx_file, ws)
if not written:
wb.remove(ws) # 没表格就删掉空 Sheet
continue
# 自动列宽(简单版)
for col in ws.iter_cols():
max_len = max(len(str(cell.value or "")) for cell in col)
ws.column_dimensions[get_column_letter(col[0].column)].width = min(max_len + 2, 50)
if not wb.sheetnames:
print("未在任何 .docx 中发现表格,未生成文件。")
return
wb.save(OUTPUT_FILE)
print(f"完成!已生成 {OUTPUT_FILE},共 {len(wb.sheetnames)} 个 Sheet。")
# ------------------------------------------------------------
if __name__ == "__main__":
main()