自己动手做一个批量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。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索 Flutter 中的 NavigationRail:使用详解

1. 介绍 在 Flutter 中&#xff0c;NavigationRail 是一个垂直的导航栏组件&#xff0c;用于在应用程序中提供导航功能。它通常用于更大屏幕空间的设备&#xff0c;如平板电脑和桌面应用程序。NavigationRail 提供了一种直观的方式来浏览应用程序的不同部分&#xff0c;并允许…

PyStructureFactor:隧道电离率中分子结构因子的 Python 代码

PyStructureFactor&#xff1a;隧道电离率中分子结构因子的 Python 代码 隧道电离是强场和阿秒科学的核心。在本文中&#xff0c;我们提出了PyStructureFactor——一个通用的Python代码&#xff0c;用于计算强激光场下常见分子的隧道电离率的结构因子。数值实现基于积分表示…

004——内存映射(基于鸿蒙和I.MAX6ULL)

目录 一、 ARM架构内存映射模型 1.1 页表项 1.2 一级页表映射过程 1.3 二级页表映射过程 1.4 cache 和 buffer 二、 鸿蒙内存映射代码学习 三、 为板子编写内存映射代码 3.1 内存地址范围 3.2 设备地址范围 一、 ARM架构内存映射模型 &#xff08;以前我以为页表机制…

使用插件将swagger文档转html或pdf

github上有maven开源插件swagger2markup将swagger文档转为.adoc格式的文档&#xff0c;另外一个maven开源插件asciidoctorj-pdf则可以将.adoc格式的文档转为html和pdf。由于GitHub访问不稳定&#xff0c;在gitee上有镜像项目。所以我就贴gitee上的项目地址了。 实现从swagger文…

局域网内的手机、平板、电脑的文件共享

在日常工作生活中&#xff0c;经常需要将文件在手机、平板、电脑间传输&#xff0c;以下介绍三种较为便捷的方法&#xff1a; 1.LocalSend 该软件是免费开源的&#xff0c;可以在局域网内的任意手机、平板、电脑间传递文件&#xff0c;并且任意一方都可以作为“发送方”和“接…

MapReduce学习问题记录

1、如何跳过对某行数据的处理 第一行数据是字段名不需要处理&#xff0c;我们知道第一行偏移量是0&#xff08;行记录的时候是从数组首地址开始&#xff0c;到了行标识符进行一次计数&#xff0c;这个计数就是行偏移量&#xff0c;从0开始&#xff09;&#xff0c;我们根据偏移…

线程池的7大参数

线程池的7大参数 一、 corePoolSize 线程池核心线程大小 核心线程永远不会销毁&#xff0c;即使他们处于空闲状态&#xff0c;除非设置了allowCoreThreadTimeOut。任务提交到线程池后&#xff0c;首先会检查当前线程数是否达到了corePoolSize&#xff0c;如果没有达到的话&…

【绘图案例-奇偶填充规则 Objective-C语言】

一、接下来,我们来学习奇偶填充规则 1.就是说,你在填充的时候,实际上,是有一些规则的, 奇偶填充规则:even-odd rule, even:偶数,odd:奇数 2.把之前的copy代码,复制粘题一份,名字改成“07-奇偶填充规则”, 把ppt里的代码复制粘贴过来, 我们来看一下这段儿代码,…

CSS(一)

一、CSS 简介 1.1 HTML 的局限性 说起 HTML&#xff0c;这其实是个非常单纯的家伙&#xff0c;他只关注内容的语义。比如 <h1> 表明这是一个大标题&#xff0c;<p> 表明这是一个段落&#xff0c;<img> 表明这儿有一个图片&#xff0c;<a> 表示此处有链…

每日一题 --- 设计链表[力扣][Go]

设计链表 题目&#xff1a;707. 设计链表 你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;next 是指向下一个节点的指针/引用。 如果是双向链表&#xff0c;则…

pytest之统一接口请求封装

pytest之统一接口请求封装 pytest的requests_util.pyrequests_util.py 接口自动化测试框架的封装yaml文件如何实现接口关联封装yaml文件如何实现动态参数的处理yaml文件如何实现文件上传有参数化时候&#xff0c;怎么实现断言yaml的数据量大怎么处理接口自动化框架的扩展&#…

FFmepg--AVFilter过滤器使用以及yuv视频裁剪

文章目录 AVFilter 流程&#xff1a;api核心代码变量yuv视频裁剪 AVFilter 流程&#xff1a; ⾸先使⽤split滤波器将input流分成两路流&#xff08;main和tmp&#xff09;&#xff0c;然后分别对两路流进⾏处理。对于tmp流&#xff0c;先经过crop滤波器进⾏裁剪处理&#xff0c…

Kotlin零基础入门到进阶实战

教程介绍 Kotlin现在是Google官方认定Android一级开发语言&#xff0c;与Java100%互通&#xff0c;并具备诸多Java尚不支持的新特性&#xff0c;每个Android程序员必备的Kotlin课程&#xff0c;每个Java程序员都需要了解的Kotlin&#xff0c;掌握kotlin可以开发Web前端、Web后…

主干网络篇 | YOLOv8更换主干网络之GhostNet

前言:Hello大家好,我是小哥谈。GhostNet是2019年由华为诺亚方舟实验室发布的轻量级网络,速度和MobileNetV3相似,但是识别的准确率比MobileNetV3高,在ImageNet ILSVRC2012分类数据集的达到了75.7%的top-1精度。该论文提除了Ghost模块,通过廉价操作生成更多的特征图。基于一…

是德科技keysight DSOX3024T示波器

181/2461/8938产品概述&#xff1a; DSOX3024T 示波器 要特性与技术指标 使用电容触摸屏进行简洁的触控操作&#xff1a; •提高调试效率 •触控设计可以简化文档记录 •使用起来就像您喜欢的智能手机或平板电脑一样简单 使用 MegaZoom IV 技术揭示偶发异常&#xff1a; •超快…

思通舆情 是一款开源免费的舆情系统 介绍

思通舆情 是一款开源免费的舆情系统。 支持本地化部署&#xff0c;支持在线体验。 支持对海量舆情数据分析和挖掘。 无论你是使用者还是共同完善的开发者&#xff0c;欢迎 pull request 或者 留言对我们提出建议。 您的支持和参与就是我们坚持开源的动力&#xff01;请 sta…

申请双软认证需要哪些材料?软件功能测试报告怎么获取?

“双软认证”是指软件产品评估和软件企业评估&#xff0c;其中需要软件测试报告。 企业申请双软认证除了获得软件企业和软件产品的认证资质&#xff0c;同时也是对企业知识产权的一种保护方式&#xff0c;更可以让企业享受国家提供给软件行业的税收优惠政策。 那么&#xff0c;…

6-191 拓扑排序

一项工程由一组子任务构成,子任务之间有的可以并行执行,有的必须在完成了其他子任务后才能执行。例如,下图表示了一项工程若干子任务之间的先后关系。 编写函数输出所有子任务的拓扑序列。 函数接口定义: Status Push_SeqStack(SeqStack &s, ElemType x)//入栈,x入到…

框架结构模态分析/动力时程分析Matlab有限元编程 【Matlab源码+PPT讲义】|梁单元|地震时程动画|结果后处理|地震弹性时程分析| 隐式动力学

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

基于springboot+vue的旅游网站

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…