自己动手做一个批量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文件所在的文件夹:

   // 创建一个新的FolderBrowserDialog
   FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();

   // 设置FolderBrowserDialog的属性
   folderBrowserDialog.Description = "请选择待转换的doc文件所在的文件夹";

   // 显示FolderBrowserDialog,并获取结果
   if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
   {          
       docFolderPath = folderBrowserDialog.SelectedPath;
       richTextBox1.Text += $"你选择的待转换的doc文件所在的文件夹是:{docFolderPath}\r\n";
   }

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

 // 创建一个新的FolderBrowserDialog
 FolderBrowserDialog 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);

              // 将扩展名改为.docx
              string 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方法来更新richTextBox1
              richTextBox1.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方法来更新richTextBox1
          richTextBox1.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);

 // 将扩展名改为.docx
 string 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.client

def 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。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

前言:Hello大家好,我是小哥谈。Swin Transformer是一种基于Transformer架构的图像分类模型,与传统的Transformer模型不同,Swin Transformer通过引入分层的窗口机制来处理图像,从而解决了传统Transformer在处理大尺寸图像时的计算和内存开销问题。Swin Transformer的核心思…

【算法】环形纸牌均分问题

104. 货仓选址 - AcWing题库 有n家商店&#xff0c;求把货仓建在哪能使得货仓到每个点的距离总和最小&#xff0c;输出最短的距离总和。 首先&#xff0c;我们看只有两个点的情况&#xff0c;在这种情况下我们选[1,2]的任何一个位置都是一样的&#xff0c;总和就是这段区间的长…

利用sealos安装k8s集群

1. 环境准备 准备三台干净&#xff08;未安装过k8s环境&#xff09;的虚拟机 # 所有的主机都要配置主机名和域名映射 # 设置主机名 hostnamectl set-hostname k8s-master01 # vim /etc/hosts 192.168.59.201 k8s-master01 192.168.59.202 k8s-worker01 192.168.59.203 k8…

01. 如何配置ESP32环境?如何开发ESP32?

0. 前言 此文章收录于《ESP32学习笔记》专栏&#xff0c;此专栏会结合实际项目记录作者学习ESP32的过程&#xff0c;争取每篇文章能够将细节讲明白&#xff0c;会应用。 1. 安装IDE&#xff1a;Thonny 后续项目中我们都是使用pythont语言&#xff0c;而thonny工具能很好的支撑E…

Mongodb入门到入土,安装到实战,外包半年学习的成果

这是我参与「第四届青训营 」笔记创作活动的的第27天&#xff0c;今天主要记录前端进阶必须掌握内容Mongodb数据库,从搭建环境到运行数据库,然后使用MongodB; 一、文章内容 数据库基础知识关系型数据库和非关系型数据库为什么学习Mongodb数据库环境搭建及运行MongodbMongodb命…

React生命周期新旧对比

组件从创建到死亡&#xff0c;会经过一些特定的阶段React组件中包含一系列钩子函数{生命周期回调函数}&#xff0c;会在特定的时刻调用我们在定义组件的时候&#xff0c;会在特定的声明周期回调函数中&#xff0c;做特定的工作。旧生命周期总结 旧的生命周期分为三个阶段 1 初…

Nacos部署(三)Docker部署Nacos2.3单机环境

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; Nacos部署&#xff08;三&#xff09;Docker部署Nacos2.3单机环境 ⏱️…

SQLiteC/C++接口详细介绍sqlite3_stmt类(六)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;五&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;七&#xff09; 17. sqlite3_clear_bindings函数 sqlite3_clear_bindings函…

从零开始学习在VUE3中使用canvas(五):globalCompositeOperation(图形混合)

一、简介 通过设置混合模式来改变图像重叠区域的显示方式。 const ctx canvas.getContext("2d");ctx.globalCompositeOperation "source-over"; 二、属性介绍 source-over 这是默认的复合操作。将源图像绘制到目标图像上&#xff0c;保留目标图像的不透…

通过jsDelivr实现Github的图床CDN加速

最近小伙伴们是否发现访问我的个人博客http://xiejava.ishareread.com/图片显示特别快了&#xff1f; 我的博客的图片是放在github上的&#xff0c;众所周知的原因&#xff0c;github访问不是很快&#xff0c;尤其是hexo博客用github做图床经常图片刷不出来。一直想换图床&…

牛客NC108 最大正方形【中等 动态规划 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/0058c4092cec44c2975e38223f10470e 思路 动态规划: 先初始化第一行和第一列。然后其他单元格依赖自己的上边&#xff0c;左边和左上角参考答案Java import java.util.*;public class Solution {/*** 代码中的类…

【Docker】golang操作容器使用rename动态更新容器的名字

【Docker】golang操作容器使用rename动态更新容器的名字 大家好 我是寸铁&#x1f44a; 总结了一篇golang操作容器使用rename动态更新容器的名字✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 今天遇到一个新的需求&#xff0c;要动态改变运行中的容器名字。 可以考虑先把…

OpenLayers基础教程——WebGLPoints中要素样式的设置方法解析

1、前言 前一篇博客介绍了如何在OpenLayers中使用WebGLPoints加载海量数据点的方法&#xff0c;这篇博客就来介绍一下WebGLPoints图层的样式设置问题。 2、样式运算符 在VectorLayer图层中&#xff0c;我们只需要创建一个ol.style.Style对象即可&#xff0c;WebGLPoints则不…

静态综合实验

一.搭建拓扑结构 1.根据拓扑结构可以把网段分成14个网段&#xff0c;根据192.168.1.0/24可以划分出ip地址和环回地址 其中环回r1分别是 192.168.1.32/27 192.168.1.32/28 192.168.1.48/28 2.划分完后如图&#xff1a; 二.配置IP地址 注意&#xff1a;为了避免错误&#…

业务服务:xss攻击

文章目录 前言一、使用注解预防1. 添加依赖2. 自定义注解3. 自定义校验逻辑4. 使用 二、使用过滤器1. 添加配置2. 创建配置类3. 创建过滤器4. 创建过滤器类5. 使用 前言 xss攻击时安全领域中非常常见的一种方法&#xff0c;保证我们的系统安全是非常重要的 xss攻击简单来说就…

JavaSE:实现象棋游戏

文章目录 1. 每日一言2. 游戏内容介绍3. 代码介绍4. 全部代码4.1 MainFream4.2 GamePanel4.3 ChessFactory4.4 Bing4.5 Boss4.6 Che4.7 Chess4.8 Ma4.9 Pao4.10 Shi4.11 Xiang 结语 1. 每日一言 Every cloud has a silver lining. 天无绝人之路。 2. 游戏内容介绍 象棋是一种…

‘str‘ object has no attribute ‘decode‘

跑别人代码的时候遇到一个问题 print(f"{gpu_device_name.decode(utf-8)} is allocated sucessfully at location: {gpu_device_location}")结果就报错了 解决问题如下 aa "adfd"aa.decode(utf-8)结果如下 aa "adfd" aa.encode().decode(ut…

初识进程的地址空间、页表

一、&#x1f31f;问题引入 &#x1f6a9;代码一&#xff1a; #include<stdio.h>#include<unistd.h>int g_val100;int main(){pid_t idfork();if(id0){//子进程while(1){printf("I am a child pid:%d ppid:%d g_val:%d\n",getpid(),getppid(),g_val);…

# Maven Bom 的使用

Maven Bom 的使用 文章目录 Maven Bom 的使用概述BOM特点优点缺点 MavenMaven 安装安装步骤settingx.ml常用仓库地址Idea 使用maven常见坑 SpringBoot 项目Bom使用案例项目结构主项目 zerocode-back-servezc-dependency&#xff08;第三方jar管理&#xff09;子模块zc-serve子模…

【保姆级教程】YOLOv8目标检测:训练自己的数据集

一、YOLOV8环境准备 1.1 下载安装最新的YOLOv8代码 仓库地址&#xff1a; https://github.com/ultralytics/ultralytics1.2 配置环境 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple二、数据准备 2.1 安装labelme标注软件 pip install label…