office2007新建.docx文档,打开后弹出转换文件对话框的解决办法

修复新建DOCX文档异常
不知是因为打开了非标准word文档改变了模板还是其他什么原因,当我鼠标右键新建一个word(.docx)文档时,然后双击打开,会弹出一个“转换文件”的对话框,有“纯文本、编码文本。。。”等选项,无论你选择了什么选项,编辑内容后保存,再打开时就遇到问题了,告诉你无法打开docx文档,因为内容有错误。后来找到一篇文章,说的是通过“开始”菜单里的Microsoft Office程序新建word文档和鼠标右键word文档,使用的模板不一样。受此启发,我试着用“开始”菜单里的Microsoft Office程序新建docx文档,发现没有出现上述问题。于是尝试修改注册表,最后解决了此问题。
通过“开始”菜单中的Microsoft Office里的word程序新建一个.docx文档,什么都不写,直接另存为winword12.docx(其他名字也可,要跟下面注册表中的值一样即可),将其放到C:\Windows\ShellNew里面。打开注册表,找到项 HKEY_CLASSES_ROOT\.docx\Word.Document.12\ShellNew,新建字符串 FileName,数值数据为 winword12.docx,确定后关闭注册表。
之后再通过鼠标右键创建docx文档,则正常了。
PS:今天打开了一个不太正常的word文档,之后我再右键创建docx文档,发现类似问题又出现了。最后这样解决了问题:弹出“转换文件”的对话框时,选择“纯文本”,随便编辑之后“保存”,弹出提示框告诉你一些字符无法保存,问你是否继续,你选择“否”可以另存副本,覆盖原来的文档。再右键新建时,一切又正常了。(由于使用Total Cmd工具导致)

参考文章:[url]http://club.excelhome.net/thread-290615-1-1.html[/url]
import sys # 操作系统模块 from PyQt5.QtGui import QColor # 导入PyQt5的QtGui模块 from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QTableWidgetItem, QTableWidget, QMessageBox # 导入PyQt5的QtWidgets模块 import os # 导入操作系统模块 import tools.common as common # 导入工具模块并设置别名为common import tools.wordtopdf as wordtopdf import tools.mergepdf as mergepdf from mainWindow import * # 导入主窗体的UI类 from pageWindow import * # 导入Word转PDF窗体的UI类 from listWindow import * # 导入统计Word文档页码窗体的UI类 from transformWindow import * # 导入提取总页码窗体的UI类 import _thread # 主窗体初始化类 class MyMainWindow(QMainWindow, Ui_MainWindow): def __init__(self): super(MyMainWindow,self).__init__() self.setupUi(self) self.setGeometry(100, 100, 1024, 600) self.setWindowTitle('Word助手') # 设置窗体的标题 # 设置窗体背景 palette = QtGui.QPalette() # 创建调色板类的对象 # 设置窗体背景自适应 palette.setBrush(self.backgroundRole(),QBrush(QPixmap("./image/bg.png").scaled(self.size(),QtCore.Qt.IgnoreAspectRatio,QtCore.Qt.SmoothTransformation))) self.setPalette(palette) self.setAutoFillBackground(True) # 设置自动填充背景 self.setFixedSize(1024,600) # 禁止显示最大化按钮及调整窗体大小 '''Word转PDF模块''' class TransformWindow(QMainWindow, Ui_TransformWindow): filelist = [] def __init__(self): super(TransformWindow,self).__init__() self.setupUi(self) self.showLoding.setText("") # 设置显示转换进度标签不显示内容 self.showLoding.setMinimumWidth(100) # 设置Label标签的最小宽度 self.multipleExecute.clicked.connect( self.multipleExecuteClick) #批量转换按钮绑定槽函数 self.singleExecute.clicked.connect(self.singleExecuteClick) # 合为一个PDF按钮绑定槽函数 self.sourcebrowseButton.clicked.connect(self.sourcebrowseClick) # 选择源文件夹按钮绑定槽函数 self.targetbrowseButton.clicked.connect(self.targetbrowseClick) # 选择目标文件夹按钮绑定槽函数 self.listpdf.itemDoubleClicked.connect(self.itemdoubleClick) # 为列表项的双击事件绑定槽函数 # 自定义打开子窗体的方法 def open(self): self.__init__() self.show() # 显示子窗体 def sourcebrowseClick(self): # 单击浏览源文件夹按钮所触发的方法 # 打开选择文件夹的对话框 dir_path = QFileDialog.getExistingDirectory(self, "请选择源文件目录", r"./test/doc") if dir_path == "": # 处理没有选择路径的情况,这里为直接返回 return self.sourcepath.setText(dir_path) # 将获取到的文件夹路径添加到文本框控件中 self.listword.clear() # 清空列表 global filelist # 定义全局变量 filelist = common.getfilenames(dir_path,[],'.doc') # 获取Word文档路径 self.listword.addItems(filelist) # 将获取到的Word文件路径添加到列表控件中 def targetbrowseClick(self): # 单击浏览目标文件夹按钮所触发的方法 dir_path = QFileDialog.getExistingDirectory(self, "请选择目标文件目录", r"./test/pdf") self.targetpath.setText(dir_path) def itemdoubleClick(self,item): # 处理双击列表项触发的方法 if os.path.exists(item.text()): os.startfile(item.text()) # 打开文件 else: QMessageBox.information(self, "温馨提示:", "不是有效的文件名!", QMessageBox.Yes) def multipleExecuteClick(self): #批量转换按钮触发的方法 # 判断是否选择了源文件,如果没有选择则弹出提示框告知 if self.listword.count() == 0: QMessageBox.information(self, "温馨提示:", "没有要转换Word文档!", QMessageBox.Yes) return targetpath = self.targetpath.text() # 获取目标文件夹 # 判断是否选择了目标文件,如果没有选择则弹出提示框告知 if not os.path.exists(targetpath): QMessageBox.information(self, "温馨提示:", "请选择正确的目标路径!", QMessageBox.Yes) return self.listpdf.clear() # 清空结果列表 self.showLoding.setMovie(self.gif) # 设置gif图片 self.gif.start() # 启动图片,实现等待gif图片的显示 _thread.start_new_thread(self.mExecute, ()) # 开启新线程执行批量转PDF # 实现批量Word转PDF操作的方法 def mExecute(self): targetpath = self.targetpath.text() # 获取目标文件夹 valueList = wordtopdf.wordtopdf(filelist,targetpath) # 实现将Word文档批量转换为PDF if(valueList != -1): self.showLoding.clear() # 清除进度条 self.listpdf.addItems(valueList) # 将转换后的PDF路径显示在目标列表中 # 合为一个PDF按钮所触发的方法 def singleExecuteClick(self): # 判断是否选择了源文件,如果没有选择则弹出提示框告知 if self.listword.count() == 0: QMessageBox.information(self, "温馨提示:", "没有要转换Word文档!", QMessageBox.Yes) return # 判断是否选择了目标文件夹,如果没有选择则弹出提示框告知 if not os.path.exists(self.targetpath.text()): QMessageBox.information(self, "温馨提示:", "请选择正确的目标路径!", QMessageBox.Yes) return self.listpdf.clear() # 清空结果列表 self.showLoding.setMovie(self.gif) # 设置gif图片 self.gif.start() # 启动图片,实现等待gif图片的显示 _thread.start_new_thread(self.sExecute,()) # 开启新线程执行多个Word合为一个PDF # 实现合为一个PDF文件操作的方法 def sExecute(self): targetpath = self.targetpath.text() # 获取目标路径 valueList = wordtopdf.wordtopdf(filelist, targetpath) # 将多个Word文档转换为PDF文件 if(valueList != -1): mergepdf.mergefiles(targetpath, 'merged.pdf', True) # 将多个PDF文件合并为一个PDF文件 self.showLoding.clear() # 清除进度条 temp = [os.path.join(targetpath , 'merged.pdf')] # 组合PDF文件路径 self.listpdf.addItems( temp) # 将PDF文件路径显示到结果列表中 for file in valueList: # 遍历临时生成的PDF文件列表 os.remove(file) # 删除PDF文件 '''统计Word文档页码模块''' class PageWindow(QMainWindow, Ui_PageWindow): filelist = [] # Word文件路径列表 def __init__(self): super(PageWindow,self).__init__() self.setupUi(self) self.pagetable.setColumnWidth(0,600) # 设置第一列的宽度 self.pagetable.setColumnWidth(1,100) # 设置第二列的宽度 self.pagetable.setStyleSheet("background-color: lightblue" "(spread:pad,stop:0.823 rgba(255, 255, 255, 204), stop:1 rgba(255, 255, 255, 204));" "selection-background-color:lightblue;") headItem = self.pagetable.horizontalHeaderItem(0) # 获得水平方向表头的Item对象 headItem.setBackground(QColor(0, 60, 10)) # 设置单元格背景颜色 headItem.setForeground(QColor(200, 111, 30)) # 设置文字颜色 headItem = self.pagetable.horizontalHeaderItem(1) # 获得水平方向表头的Item对象 headItem.setBackground(QColor(0, 60, 10)) # 设置单元格背景颜色 headItem.setForeground(QColor(200, 111, 30)) # 设置文字颜色 self.pagetable.setEditTriggers(QTableWidget.NoEditTriggers) self.pagetable.setSelectionBehavior(QTableWidget.SelectRows) self.pagetable.setSelectionMode(QTableWidget.SingleSelection) self.pagetable.setAlternatingRowColors(True) self.totalpage.setMinimumWidth(100) # 设置Label标签的最小宽度 self.browseButton.clicked.connect(self.sourcebrowseClick) # 选择源路径 self.executeButton.clicked.connect(self.executeClick) # 开始统计按钮的事件绑定 # 自定义打开子窗体的方法 def open(self): self.__init__() self.show() # 显示子窗体 def sourcebrowseClick(self): dir_path = QFileDialog.getExistingDirectory(self, "请选择源文件目录", r"./test/doc") if dir_path != "": # 判断已经选择了源文件目录 self.sourcepath.setText(dir_path) self.listword.clear() # 清空列表 global filelist filelist = common.getfilenames(dir_path,[],'.doc') # 获取Word文档 self.listword.addItems(filelist) def executeClick(self): #开始统计按钮的自定义事件 if self.listword.count() == 0: QMessageBox.information(self, "温馨提示:", "没有要统计页码的Word文档!", QMessageBox.Yes) return self.totalpage.setText("") self.totalpage.setMovie(self.gif) # 设置gif图片 self.label_2.setText("正在统计:") self.gif.start() # 启动图片,实现等待gif图片的显示 _thread.start_new_thread(self.execute,()) # 开启新线程执行统计页码 # 统计页码 def execute(self): valueList = [] valueList = wordtopdf.wordtopdf1(filelist) # if valueList != []: # self.totalpage.clear() # 转换完毕就将等待gif图片清理掉 totalPages = str(valueList[0]) # 总页数 self.label_2.setText("合计页码:") self.totalpage.setText(totalPages) # 显示统计出来的页码 print("行数:",len(valueList[1])) self.pagetable.setRowCount(len(valueList[1])) # 指定行数 resultList = valueList[1] # 获取统计结果 for i in range(self.pagetable.rowCount()): for j in range(self.pagetable.columnCount()): content = resultList[i][j] # 获取一个单元格的内容 newItem = QTableWidgetItem(content) # 转换为一个单元格对象 self.pagetable.setItem(i, j, newItem) # 显示在单元格中 '''提取总目录模块''' class ListWindow(QMainWindow, Ui_ListWindow): def __init__(self): super(ListWindow,self).__init__() self.setupUi(self) self.browseButton.clicked.connect(self.sourcebrowseClick) # 选择源路径 self.executeButton.clicked.connect( self.getListClick) #按钮事件绑定 self.openButton.clicked.connect(self.openButtonClick) # 为打开文件按钮绑定事件 # 自定义打开子窗体的方法 def open(self): self.__init__() self.show() # 显示子窗体 def sourcebrowseClick(self): dir_path = QFileDialog.getExistingDirectory(self, "请选择源文件目录", r"./test/doc") if dir_path != "": # 判断已经选择了源文件目录 self.sourcepath.setText(dir_path) self.listword.clear() # 清空列表 global filelist filelist = common.getfilenames(dir_path,[],'.doc') # 获取Word文档 self.listword.addItems(filelist) def getListClick(self): #子窗体自定义事件 if self.listword.count() == 0: QMessageBox.information(self, "温馨提示:", "没有要提取目录的Word文档!", QMessageBox.Yes) return self.listfile.setText("") self.listfile.setMovie(self.gif) # 设置gif图片 self.gif.start() # 启动图片,实现等待gif图片的显示 _thread.start_new_thread(self.getList,()) # 开启新线程执行统计页码 # 提取目录 def getList(self): sourcepath = self. sourcepath.text() # 获取源路径 if not os.path.exists(sourcepath): # 判断是否选择了源目录 QMessageBox.information(self,"温馨提示:","请先选择Word文档所在的文件夹!",QMessageBox.Yes) return targetpath = os.path.join(sourcepath, "pdf") # 根据源路径生成目标目录 if not os.path.exists(targetpath): # 判断目录是否存在,不存在则创建 os.makedirs(targetpath) # 创建目录 valueList = wordtopdf.wordtopdf(filelist, targetpath) if(valueList != -1): mergepdf.mergefiles(targetpath, 'merged.pdf', True) # 合并PDF temp = [os.path.join(targetpath , 'merged.pdf')] # 生成合并后的PDF文件的路径 for file in valueList: # 遍历临时生成的PDF文件列表 os.remove(file) # 删除PDF文件 isList = self.checkBox.isChecked() # 指定是否带目录 resultvalue=wordtopdf.getPdfOutlines(temp[0],targetpath,isList) # 提取目录 os.remove(temp[0]) # 删除合并后的PDF文件 if valueList != []: self.listfile.clear() # 转换完毕就将等待gif图片清理掉 self.listfile.setText(resultvalue) # 将生成的目录文件路径显示到页面中 # 自定义打开子窗体的方法 def open(self): self.__init__() self.show() # 显示子窗体 # 打开文件按钮触发的事件函数 def openButtonClick(self): if self.listfile.text() == "还未提取...": QMessageBox.information(self,"温馨提示:","还没有提取目录,请先单击【开始提取】按钮!",QMessageBox.Yes) else: os.startfile(self.listfile.text()) # 打开文件 if __name__ == '__main__': app = QApplication(sys.argv) # 创建GUI对象 main = MyMainWindow() # 创建主窗体ui类对象 qmovie = QtGui.QMovie('image/loding.gif') transformWindow = TransformWindow() # 创建Word转PDF窗体对象 transformWindow.gif = qmovie # 加载gif图片 main.actionWord_PDF.triggered.connect(transformWindow.open) #为Toolbar上的Word转PDF按钮指定连接槽函数 pagewindow = PageWindow() # 创建统计Word文档页码窗体对象 pagewindow.gif = qmovie # 加载gif图片 main.action_Word.triggered.connect(pagewindow.open) #为Toolbar上的统计Word文档页码按钮指定连接槽函数 listwindow = ListWindow() # 创建提取总目录窗体对象 listwindow.gif = qmovie # 加载gif图片 main.action_list.triggered.connect(listwindow.open) #为Toolbar上的提取总目录按钮指定连接槽函数 main.show() # 显示主窗体 sys.exit(app.exec_()) # 除非退出程序关闭窗体,否则一直运行 显示库没有注册
最新发布
10-15
你遇到的错误: > **“显示库没有注册”**(常见英文提示:`Class not registered` 或 `COM object with CLSID {...} is not registered`) 这个错误出现在你的代码调用了 `wordtopdf.wordtopdf()` 方法,试图通过 **Windows COM 接口调用 Microsoft Word** 将 `.doc` 文件转换为 PDF 时。 --- ### 🔍 错误原因分析 ``` Class not registered ``` 意味着: 👉 **系统找不到或无法加载 Microsoft Word 的 COM 组件**。 这通常是因为以下原因之一: | 原因 | 说明 | |------|------| | ❌ 未安装 Microsoft Office Word | 程序依赖 Word 软件本身进行文档转换 | | ⚠️ 安装的是“精简版 / 免费版 / WPS” | 这些软件不提供完整的 COM 接口支持 | | 🧱 Office 安装损坏或注册失败 | COM 类未正确写入 Windows 注册表 | | 💻 32位/64位架构不匹配 | Python 和 Office 位数不同可能导致加载失败 | --- ### ✅ 解决方法 #### ✅ 方法一:确认已安装 **完整版 Microsoft Office Word** - 必须是正版或标准安装的 **Microsoft Office**(如 Office 2016、2019、365) - 不支持: - WPS Office - Office Viewer - 只安装了 Word Online 或网页版 - “绿色版”、“免安装版”Office 🔧 检查方式: 1. 打开开始菜单 → 搜索 “Word” 2. 是否能正常打开 `Microsoft Word` 3. 打开后查看版本信息:文件 → 账户 → 关于 Word > 如果没有,去官网下载并安装 [Microsoft Office](https://www.microsoft.com/zh-cn/microsoft-365) --- #### ✅ 方法二:修复 Office 注册(重新注册 COM 组件) 以管理员身份运行命令提示符,并执行以下操作: ##### 步骤 1:关闭所有 Office 程序 确保 Word、Excel 等全部关闭。 ##### 步骤 2:进入 Office 安装目录 常见的路径如下(根据你电脑实际情况选择): ```cmd # 64位系统常见路径 C:\Program Files\Microsoft Office\root\Office16\ # 或 32位 C:\Program Files (x86)\Microsoft Office\root\Office16\ ``` 进入该目录: ```cmd cd "C:\Program Files\Microsoft Office\root\Office16" ``` > 注意:使用双引号包裹带空格路径。 ##### 步骤 3:重新注册 Word 运行命令: ```cmd regsvr32 /i msword.olb ``` 如果成功,会弹出:“DllRegisterServer 和 DllInstall 成功。” 📌 提示:某些系统上可能需要启用“开发者模式”或管理员权限才能执行。 --- #### ✅ 方法三:检查 Python 与 Office 架构是否一致 | 项目 | 必须匹配 | |------|---------| | Python 是 32 位? | Office 也必须是 32 位 | | Python 是 64 位? | Office 最好也是 64 位 | ⚠️ 混合使用会导致 COM 调用失败! 🔍 查看 Python 位数: 在命令行运行: ```python import platform print(platform.architecture()) ``` 输出示例: - `('64bit', 'WindowsPE')` → 64位 Python - `('32bit', 'WindowsPE')` → 32位 Python 建议统一使用 **64位 + 64位 Office** 或 **32位 + 32位 Office** --- #### ✅ 方法四:测试 COM 是否可用(Python 测试脚本) 新建一个 `test_word.py` 文件,内容如下: ```python import comtypes.client try: word = comtypes.client.CreateObject("Word.Application") print("✅ Word COM 对象创建成功!") word.Quit() except Exception as e: print("❌ 创建失败:", e) ``` 运行它: ```bash python test_word.py ``` - 如果成功打印 ✅,说明环境没问题。 - 如果报错 `Class not registered`,说明 Word COM 未注册或未安装。 --- ### 🛠️ 替代方案(无需 Office) 如果你无法安装 Office,可以考虑以下替代方法: | 方案 | 实现方式 | |------|----------| | 使用 **LibreOffice + unoconv** | 开源办公套件,支持命令行转 PDF:<br>`pip install unoconv` | | 使用 **docx2pdf** 库(仅限 `.docx`) | `pip install docx2pdf`,基于 macOS/Linux/Windows 上的 Word | | 在线 API 转换服务 | 如 Aspose.PDF、CloudConvert(需网络) | 但注意:这些都需要额外配置,且不能完美兼容 `.doc` 格式。 --- ### ✅ 总结:你现在应该做的事 1. ✅ 确认电脑上安装了 **Microsoft Office Word** 2. ✅ 不要用 WPS 替代 3. ✅ 用管理员命令行运行:`regsvr32 /i msword.olb` 重新注册 4. ✅ 检查 Python 和 Office 是否同为 32 位或 64 位 5. ✅ 运行测试脚本验证 COM 是否可用 完成以上步骤后,再运行主程序,就不会出现“库没有注册”的问题了。 --- 这是“Word助手”能否正常工作的核心依赖,请务必解决此问题!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值