当前位置: 代码网 > it编程>编程语言>C# > 基于C#自制批量doc转换为docx的小工具

基于C#自制批量doc转换为docx的小工具

2024年05月18日 C# 我要评论
前言最近遇到了一个需求,就是要把大量的doc格式文件转换为docx文件,因此就动手做了一个批量转换的小工具。背景doc文件是什么"doc" 文件是一种常见的文件格式,通常用于存储文

前言

最近遇到了一个需求,就是要把大量的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" 文件的主要原因包括:

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

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

实践

方案使用c#通过microsoft office interop实现将.doc文件转换为.docx文件。

添加引用:

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

页面设计如下所示:

选择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的好处如下:

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

软件使用截图:

实现效果:

实现了批量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。

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

到此这篇关于基于c#自制批量doc转换为docx的小工具 的文章就介绍到这了,更多相关c# doc转docx内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com