自己动手做一个批量doc转换为docx文件的小工具

2024-03-21 06:28

本文主要是介绍自己动手做一个批量doc转换为docx文件的小工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

最近遇到了一个需求,就是要把大量的doc格式文件转换为docx文件,因此就动手做了一个批量转换的小工具。

背景

doc文件是什么?

“doc” 文件是一种常见的文件格式,通常用于存储文本文档。它是 Microsoft Word 文档的文件扩展名。“doc” 是 “document” 的缩写,表示这是一个文档文件。这种文件格式通常包含文本、图像、表格、图形等内容,可以使用 Microsoft Word 或其他兼容的文字处理软件进行打开和编辑。

docx文件是什么?

“docx” 文件是 Microsoft Word 2007 及更高版本中使用的文档文件格式的扩展名。它是 Office Open XML (OOXML) 标准的一部分,是一种基于 XML 的开放标准格式,用于存储文本文档、图像、表格、图形等内容。与早期的 “.doc” 格式相比,“.docx” 格式具有更高的兼容性和可扩展性,并且文件大小通常更小。由于其开放的特性,许多其他文字处理软件也支持 “.docx” 格式。

为什么要将doc文件转化为docx文件?

将 “.doc” 文件转换为 “.docx” 文件的主要原因包括:

  1. 更先进的格式:“.docx” 使用 Office Open XML 格式,这是一种更现代、更有效的文件格式。它采用了基于 XML 的结构,使得文件更容易解析和处理,同时也提供了更好的兼容性和可扩展性。
  2. 减小文件大小:由于 “.docx” 文件采用了更高效的压缩技术和文件结构,相比 “.doc” 文件通常会更小,这对于存储和传输文件是有利的。
  3. 兼容性:许多最新版本的文字处理软件更支持 “.docx” 格式,而较旧的 “.doc” 格式可能会在一些软件中出现兼容性问题。将文件转换为 “.docx” 格式可以确保在不同平台和软件中的良好兼容性。
  4. 格式稳定性:“.docx” 格式的结构更加稳定,不容易出现文件损坏或格式错误的问题,从而提高了文档的可靠性。

综上所述,将 “.doc” 文件转换为 “.docx” 文件可以提高文件的效率、兼容性和稳定性,是一种值得推荐的做法。

实践

方案使用C#通过Microsoft Office Interop实现将.doc文件转换为.docx文件。

添加引用:

image-20240313204705350

前提是需要电脑上安装有word。

页面设计如下所示:

image-20240319211338214

选择doc文件所在的文件夹:

   // 创建一个新的FolderBrowserDialogFolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();// 设置FolderBrowserDialog的属性folderBrowserDialog.Description = "请选择待转换的doc文件所在的文件夹";// 显示FolderBrowserDialog,并获取结果if (folderBrowserDialog.ShowDialog() == DialogResult.OK){          docFolderPath = folderBrowserDialog.SelectedPath;richTextBox1.Text += $"你选择的待转换的doc文件所在的文件夹是:{docFolderPath}\r\n";}

选择保存docx文件的文件夹:

 // 创建一个新的FolderBrowserDialogFolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();// 设置FolderBrowserDialog的属性folderBrowserDialog.Description = "请选择保存docx文件的文件夹";// 显示FolderBrowserDialog,并获取结果if (folderBrowserDialog.ShowDialog() == DialogResult.OK){// 用户已选择一个文件夹,可以通过folderBrowserDialog.SelectedPath获取所选文件夹的路径docxFolderPath = folderBrowserDialog.SelectedPath;richTextBox1.Text += $"你选择的保存docx文件的文件夹是:{docFolderPath}\r\n";}

开始转换按钮事件处理函数:

 if (docFolderPath == null || docxFolderPath == null){MessageBox.Show("请先选择doc文件所在的文件夹与保存docx文件的文件夹");}else{await DocToDocx();}

为了避免阻塞界面,使用了异步方法。

DocToDocx方法如下所示:

  public async System.Threading.Tasks.Task DocToDocx(){// 使用Task.Run来启动一个新的异步任务await System.Threading.Tasks.Task.Run(() =>{// 创建 Word 应用程序实例Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();int i = 1;             // 遍历所有.doc文件foreach (string docFile in GetFiles(docFolderPath, "*.doc")){// 打开输入的 .doc 文件Document doc = wordApp.Documents.Open(docFile);// 获取不带扩展名的文件名string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(docFile);// 将扩展名改为.docxstring docxFileName = Path.ChangeExtension(fileNameWithoutExtension, ".docx");string docxFilePath = Path.Combine(docxFolderPath, docxFileName);// 将 .doc 文件保存为 .docx 格式doc.SaveAs2(docxFilePath, WdSaveFormat.wdFormatXMLDocument);// 关闭 .doc 文件doc.Close();// 释放 Document 对象的资源System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);// 使用Invoke方法来更新richTextBox1richTextBox1.Invoke((Action)(() =>{richTextBox1.Text += $"第{i}个文件:{docFile}转换完成 {DateTime.Now}\r\n";// 设置插入点到文本的最后richTextBox1.SelectionStart = richTextBox1.Text.Length;// 滚动到插入点richTextBox1.ScrollToCaret();}));i++;}// 退出 Word 应用程序wordApp.Quit();// 释放资源System.Runtime.InteropServices.Marshal.ReleaseComObject(wordApp);// 使用Invoke方法来更新richTextBox1richTextBox1.Invoke((Action)(() =>{richTextBox1.Text += $"转换完成 {DateTime.Now}\r\n";}));});         

GetFiles方法如下所示:

   // 这个方法返回一个IEnumerable<string>,表示文件的路径public IEnumerable<string> GetFiles(string path, string searchPattern){// 获取文件夹下的所有文件string[] files = Directory.GetFiles(path, searchPattern);// 遍历所有文件foreach (string file in files){// 返回当前文件yield return file;}}

这里使用了yield关键字,使用yield的好处如下:

  1. 延迟执行:迭代器的执行会被延迟,直到迭代器被消费时才开始。这意味着如果你有一个大的数据集合需要处理,但并不需要立即处理所有数据,那么使用yield可以帮助你节省内存和计算资源。
  2. 简化代码:yield可以使你的代码更简洁,更易于阅读和理解。你不需要创建一个临时的集合来存储你的结果,而是可以直接使用yield return来返回结果。
  3. 无需一次性生成所有结果:当处理大量数据时,一次性生成所有结果可能会消耗大量内存。使用yield可以在每次迭代时只生成一个结果,从而节省内存。

实现原理其实很简单,就是用新版本的word打开再保存就行了。

 // 打开输入的 .doc 文件Document doc = wordApp.Documents.Open(docFile);// 获取不带扩展名的文件名string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(docFile);// 将扩展名改为.docxstring docxFileName = Path.ChangeExtension(fileNameWithoutExtension, ".docx");string docxFilePath = Path.Combine(docxFolderPath, docxFileName);// 将 .doc 文件保存为 .docx 格式doc.SaveAs2(docxFilePath, WdSaveFormat.wdFormatXMLDocument);// 关闭 .doc 文件doc.Close();// 释放 Document 对象的资源System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);

需要转换的doc文件所在的文件夹:

image-20240320160856832

软件使用截图:

image-20240320163426589

实现效果:

image-20240320163450275

实现了批量doc文件转换为docx文件。

如果不熟悉C#也可以通过Python实现。

以下是一个文件转换的示例代码,经过测试可行:

import os
import win32com.clientdef convert_doc_to_docx(doc_path):# 创建Word应用程序对象word = win32com.client.Dispatch("Word.Application")# 打开.doc文件doc = word.Documents.Open(doc_path)# 设置新的文件路径docx_path = os.path.splitext(doc_path)[0] + ".docx"# 保存文件为.docx格式doc.SaveAs(docx_path, FileFormat=16)  # 16 represents wdFormatXMLDocument# 关闭文档doc.Close()# 关闭Word应用程序word.Quit()# 使用函数
convert_doc_to_docx("Path")

由于时间精力有限,没有写成批量处理的形式。

还有一种方案就是在word里写VBA。

采用哪种方案可以根据自己的熟练度。

这篇关于自己动手做一个批量doc转换为docx文件的小工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/831983

相关文章

利用Python实现Excel文件智能合并工具

《利用Python实现Excel文件智能合并工具》有时候,我们需要将多个Excel文件按照特定顺序合并成一个文件,这样可以更方便地进行后续的数据处理和分析,下面我们看看如何使用Python实现Exce... 目录运行结果为什么需要这个工具技术实现工具的核心功能代码解析使用示例工具优化与扩展有时候,我们需要将

Python+PyQt5实现文件夹结构映射工具

《Python+PyQt5实现文件夹结构映射工具》在日常工作中,我们经常需要对文件夹结构进行复制和备份,本文将带来一款基于PyQt5开发的文件夹结构映射工具,感兴趣的小伙伴可以跟随小编一起学习一下... 目录概述功能亮点展示效果软件使用步骤代码解析1. 主窗口设计(FolderCopyApp)2. 拖拽路径

Python将字符串转换为小写字母的几种常用方法

《Python将字符串转换为小写字母的几种常用方法》:本文主要介绍Python中将字符串大写字母转小写的四种方法:lower()方法简洁高效,手动ASCII转换灵活可控,str.translate... 目录一、使用内置方法 lower()(最简单)二、手动遍历 + ASCII 码转换三、使用 str.tr

Java如何将文件内容转换为MD5哈希值

《Java如何将文件内容转换为MD5哈希值》:本文主要介绍Java如何将文件内容转换为MD5哈希值的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java文件内容转换为MD5哈希值一个完整的Java示例代码代码解释注意事项总结Java文件内容转换为MD5

MySQL Workbench工具导出导入数据库方式

《MySQLWorkbench工具导出导入数据库方式》:本文主要介绍MySQLWorkbench工具导出导入数据库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录mysql Workbench工具导出导入数据库第一步 www.chinasem.cn数据库导出第二步

使用Java将实体类转换为JSON并输出到控制台的完整过程

《使用Java将实体类转换为JSON并输出到控制台的完整过程》在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用JSON格式,用Java将实体类转换为J... 在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用j

Java实现视频格式转换的完整指南

《Java实现视频格式转换的完整指南》在Java中实现视频格式的转换,通常需要借助第三方工具或库,因为视频的编解码操作复杂且性能需求较高,以下是实现视频格式转换的常用方法和步骤,需要的朋友可以参考下... 目录核心思路方法一:通过调用 FFmpeg 命令步骤示例代码说明优点方法二:使用 Jaffree(FF

C语言中的常见进制转换详解(从二进制到十六进制)

《C语言中的常见进制转换详解(从二进制到十六进制)》进制转换是计算机编程中的一个常见任务,特别是在处理低级别的数据操作时,C语言作为一门底层编程语言,在进制转换方面提供了灵活的操作方式,今天,我们将深... 目录1、进制基础2、C语言中的进制转换2.1 从十进制转换为其他进制十进制转二进制十进制转八进制十进

Oracle 通过 ROWID 批量更新表的方法

《Oracle通过ROWID批量更新表的方法》在Oracle数据库中,使用ROWID进行批量更新是一种高效的更新方法,因为它直接定位到物理行位置,避免了通过索引查找的开销,下面给大家介绍Orac... 目录oracle 通过 ROWID 批量更新表ROWID 基本概念性能优化建议性能UoTrFPH优化建议注

Pandas进行周期与时间戳转换的方法

《Pandas进行周期与时间戳转换的方法》本教程将深入讲解如何在pandas中使用to_period()和to_timestamp()方法,完成时间戳与周期之间的转换,并结合实际应用场景展示这些方法的... 目录to_period() 时间戳转周期基本操作应用示例to_timestamp() 周期转时间戳基