前言
最近遇到了一個需求,就是要把大量的doc格式文件轉(zhuǎn)換為docx文件,因此就動手做了一個批量轉(zhuǎn)換的小工具。
背景
doc文件是什么?
"doc" 文件是一種常見的文件格式,通常用于存儲文本文檔。它是 Microsoft Word 文檔的文件擴(kuò)展名。"doc" 是 "document" 的縮寫,表示這是一個文檔文件。這種文件格式通常包含文本、圖像、表格、圖形等內(nèi)容,可以使用 Microsoft Word 或其他兼容的文字處理軟件進(jìn)行打開和編輯。
docx文件是什么?
"docx" 文件是 Microsoft Word 2007 及更高版本中使用的文檔文件格式的擴(kuò)展名。它是 Office Open XML (OOXML) 標(biāo)準(zhǔn)的一部分,是一種基于 XML 的開放標(biāo)準(zhǔn)格式,用于存儲文本文檔、圖像、表格、圖形等內(nèi)容。與早期的 ".doc" 格式相比,".docx" 格式具有更高的兼容性和可擴(kuò)展性,并且文件大小通常更小。由于其開放的特性,許多其他文字處理軟件也支持 ".docx" 格式。
為什么要將doc文件轉(zhuǎn)化為docx文件?
將 ".doc" 文件轉(zhuǎn)換為 ".docx" 文件的主要原因包括:
- 更先進(jìn)的格式:".docx" 使用 Office Open XML 格式,這是一種更現(xiàn)代、更有效的文件格式。它采用了基于 XML 的結(jié)構(gòu),使得文件更容易解析和處理,同時也提供了更好的兼容性和可擴(kuò)展性。
- 減小文件大小:由于 ".docx" 文件采用了更高效的壓縮技術(shù)和文件結(jié)構(gòu),相比 ".doc" 文件通常會更小,這對于存儲和傳輸文件是有利的。
- 兼容性:許多最新版本的文字處理軟件更支持 ".docx" 格式,而較舊的 ".doc" 格式可能會在一些軟件中出現(xiàn)兼容性問題。將文件轉(zhuǎn)換為 ".docx" 格式可以確保在不同平臺和軟件中的良好兼容性。
- 格式穩(wěn)定性:".docx" 格式的結(jié)構(gòu)更加穩(wěn)定,不容易出現(xiàn)文件損壞或格式錯誤的問題,從而提高了文檔的可靠性。
綜上所述,將 ".doc" 文件轉(zhuǎn)換為 ".docx" 文件可以提高文件的效率、兼容性和穩(wěn)定性,是一種值得推薦的做法。
實(shí)踐
方案使用C#通過Microsoft Office Interop實(shí)現(xiàn)將.doc文件轉(zhuǎn)換為.docx文件。
添加引用:

前提是需要電腦上安裝有word。
頁面設(shè)計如下所示:

選擇doc文件所在的文件夾:
FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
folderBrowserDialog.Description = "請選擇待轉(zhuǎn)換的doc文件所在的文件夾";
if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
{
docFolderPath = folderBrowserDialog.SelectedPath;
richTextBox1.Text += $"你選擇的待轉(zhuǎn)換的doc文件所在的文件夾是:{docFolderPath}\r\n";
}
選擇保存docx文件的文件夾:
FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
folderBrowserDialog.Description = "請選擇保存docx文件的文件夾";
if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
{
docxFolderPath = folderBrowserDialog.SelectedPath;
richTextBox1.Text += $"你選擇的保存docx文件的文件夾是:{docFolderPath}\r\n";
}
開始轉(zhuǎn)換按鈕事件處理函數(shù):
if (docFolderPath == null || docxFolderPath == null)
{
MessageBox.Show("請先選擇doc文件所在的文件夾與保存docx文件的文件夾");
}
else
{
await DocToDocx();
}
為了避免阻塞界面,使用了異步方法。
DocToDocx方法如下所示:
public async System.Threading.Tasks.Task DocToDocx()
{
await System.Threading.Tasks.Task.Run(() =>
{
GetFiles方法如下所示:
public IEnumerable<string> GetFiles(string path, string searchPattern)
{
string[] files = Directory.GetFiles(path, searchPattern);
foreach (string file in files)
{
yield return file;
}
}
這里使用了yield
關(guān)鍵字,使用yield
的好處如下:
- 延遲執(zhí)行:迭代器的執(zhí)行會被延遲,直到迭代器被消費(fèi)時才開始。這意味著如果你有一個大的數(shù)據(jù)集合需要處理,但并不需要立即處理所有數(shù)據(jù),那么使用yield可以幫助你節(jié)省內(nèi)存和計算資源。
- 簡化代碼:yield可以使你的代碼更簡潔,更易于閱讀和理解。你不需要創(chuàng)建一個臨時的集合來存儲你的結(jié)果,而是可以直接使用yield return來返回結(jié)果。
- 無需一次性生成所有結(jié)果:當(dāng)處理大量數(shù)據(jù)時,一次性生成所有結(jié)果可能會消耗大量內(nèi)存。使用yield可以在每次迭代時只生成一個結(jié)果,從而節(jié)省內(nèi)存。
實(shí)現(xiàn)原理其實(shí)很簡單,就是用新版本的word打開再保存就行了。
Document doc = wordApp.Documents.Open(docFile);
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(docFile);
string docxFileName = Path.ChangeExtension(fileNameWithoutExtension, ".docx");
string docxFilePath = Path.Combine(docxFolderPath, docxFileName);
doc.SaveAs2(docxFilePath, WdSaveFormat.wdFormatXMLDocument);
doc.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);
需要轉(zhuǎn)換的doc文件所在的文件夾:

軟件使用截圖:

實(shí)現(xiàn)效果:

實(shí)現(xiàn)了批量doc文件轉(zhuǎn)換為docx文件。
如果不熟悉C#也可以通過Python實(shí)現(xiàn)。
以下是一個文件轉(zhuǎn)換的示例代碼,經(jīng)過測試可行:
import os
import win32com.client
def convert_doc_to_docx(doc_path):
由于時間精力有限,沒有寫成批量處理的形式。
還有一種方案就是在word里寫VBA。
采用哪種方案可以根據(jù)自己的熟練度。
轉(zhuǎn)自https://www.cnblogs.com/mingupupu/p/18085637
該文章在 2025/3/19 8:53:06 編輯過