C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C# doc转docx

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

作者:mingupupup

"doc" 文件是一种常见的文件格式,通常用于存储文本文档,"docx" 文件是 Microsoft Word 2007 及更高版本中使用的文档文件格式的扩展名,下面我们就来看看如何使用C#实现批量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" 文件的主要原因包括:

综上所述,将 ".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的好处如下:

实现原理其实很简单,就是用新版本的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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文