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

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

選擇doc文件所在的文件夾:
// 創(chuàng)建一個(gè)新的FolderBrowserDialog
FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
// 設(shè)置FolderBrowserDialog的屬性
folderBrowserDialog.Description = "請(qǐng)選擇待轉(zhuǎn)換的doc文件所在的文件夾";
// 顯示FolderBrowserDialog,并獲取結(jié)果
if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
{
docFolderPath = folderBrowserDialog.SelectedPath;
richTextBox1.Text += $"你選擇的待轉(zhuǎn)換的doc文件所在的文件夾是:{docFolderPath}\r\n";
}
選擇保存docx文件的文件夾:
// 創(chuàng)建一個(gè)新的FolderBrowserDialog
FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
// 設(shè)置FolderBrowserDialog的屬性
folderBrowserDialog.Description = "請(qǐng)選擇保存docx文件的文件夾";
// 顯示FolderBrowserDialog,并獲取結(jié)果
if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
{
// 用戶(hù)已選擇一個(gè)文件夾,可以通過(guò)folderBrowserDialog.SelectedPath獲取所選文件夾的路徑
docxFolderPath = folderBrowserDialog.SelectedPath;
richTextBox1.Text += $"你選擇的保存docx文件的文件夾是:{docFolderPath}\r\n";
}
開(kāi)始轉(zhuǎn)換按鈕事件處理函數(shù):
if (docFolderPath == null || docxFolderPath == null)
{
MessageBox.Show("請(qǐng)先選擇doc文件所在的文件夾與保存docx文件的文件夾");
}
else
{
await DocToDocx();
}
為了避免阻塞界面,使用了異步方法。
DocToDocx方法如下所示:
public async System.Threading.Tasks.Task DocToDocx()
{
// 使用Task.Run來(lái)啟動(dòng)一個(gè)新的異步任務(wù)
await System.Threading.Tasks.Task.Run(() =>
{
// 創(chuàng)建 Word 應(yīng)用程序?qū)嵗?
Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();
int i = 1;
// 遍歷所有.doc文件
foreach (string docFile in GetFiles(docFolderPath, "*.doc"))
{
// 打開(kāi)輸入的 .doc 文件
Document doc = wordApp.Documents.Open(docFile);
// 獲取不帶擴(kuò)展名的文件名
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(docFile);
// 將擴(kuò)展名改為.docx
string docxFileName = Path.ChangeExtension(fileNameWithoutExtension, ".docx");
string docxFilePath = Path.Combine(docxFolderPath, docxFileName);
// 將 .doc 文件保存為 .docx 格式
doc.SaveAs2(docxFilePath, WdSaveFormat.wdFormatXMLDocument);
// 關(guān)閉 .doc 文件
doc.Close();
// 釋放 Document 對(duì)象的資源
System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);
// 使用Invoke方法來(lái)更新richTextBox1
richTextBox1.Invoke((Action)(() =>
{
richTextBox1.Text += $"第{i}個(gè)文件:{docFile}轉(zhuǎn)換完成 {DateTime.Now}\r\n";
// 設(shè)置插入點(diǎn)到文本的最后
richTextBox1.SelectionStart = richTextBox1.Text.Length;
// 滾動(dòng)到插入點(diǎn)
richTextBox1.ScrollToCaret();
}));
i++;
}
// 退出 Word 應(yīng)用程序
wordApp.Quit();
// 釋放資源
System.Runtime.InteropServices.Marshal.ReleaseComObject(wordApp);
// 使用Invoke方法來(lái)更新richTextBox1
richTextBox1.Invoke((Action)(() =>
{
richTextBox1.Text += $"轉(zhuǎn)換完成 {DateTime.Now}\r\n";
}));
});
GetFiles方法如下所示:
// 這個(gè)方法返回一個(gè)IEnumerable<string>,表示文件的路徑
public IEnumerable<string> GetFiles(string path, string searchPattern)
{
// 獲取文件夾下的所有文件
string[] files = Directory.GetFiles(path, searchPattern);
// 遍歷所有文件
foreach (string file in files)
{
// 返回當(dāng)前文件
yield return file;
}
}
這里使用了yield關(guān)鍵字,使用yield的好處如下:
- 延遲執(zhí)行:迭代器的執(zhí)行會(huì)被延遲,直到迭代器被消費(fèi)時(shí)才開(kāi)始。這意味著如果你有一個(gè)大的數(shù)據(jù)集合需要處理,但并不需要立即處理所有數(shù)據(jù),那么使用yield可以幫助你節(jié)省內(nèi)存和計(jì)算資源。
- 簡(jiǎn)化代碼:yield可以使你的代碼更簡(jiǎn)潔,更易于閱讀和理解。你不需要?jiǎng)?chuàng)建一個(gè)臨時(shí)的集合來(lái)存儲(chǔ)你的結(jié)果,而是可以直接使用yield return來(lái)返回結(jié)果。
- 無(wú)需一次性生成所有結(jié)果:當(dāng)處理大量數(shù)據(jù)時(shí),一次性生成所有結(jié)果可能會(huì)消耗大量?jī)?nèi)存。使用yield可以在每次迭代時(shí)只生成一個(gè)結(jié)果,從而節(jié)省內(nèi)存。
實(shí)現(xiàn)原理其實(shí)很簡(jiǎn)單,就是用新版本的word打開(kāi)再保存就行了。
// 打開(kāi)輸入的 .doc 文件 Document doc = wordApp.Documents.Open(docFile); // 獲取不帶擴(kuò)展名的文件名 string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(docFile); // 將擴(kuò)展名改為.docx string docxFileName = Path.ChangeExtension(fileNameWithoutExtension, ".docx"); string docxFilePath = Path.Combine(docxFolderPath, docxFileName); // 將 .doc 文件保存為 .docx 格式 doc.SaveAs2(docxFilePath, WdSaveFormat.wdFormatXMLDocument); // 關(guān)閉 .doc 文件 doc.Close(); // 釋放 Document 對(duì)象的資源 System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);
需要轉(zhuǎn)換的doc文件所在的文件夾:

軟件使用截圖:

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

實(shí)現(xiàn)了批量doc文件轉(zhuǎn)換為docx文件。
如果不熟悉C#也可以通過(guò)Python實(shí)現(xiàn)。
以下是一個(gè)文件轉(zhuǎn)換的示例代碼,經(jīng)過(guò)測(cè)試可行:
import os
import win32com.client
def convert_doc_to_docx(doc_path):
# 創(chuàng)建Word應(yīng)用程序?qū)ο?
word = win32com.client.Dispatch("Word.Application")
# 打開(kāi).doc文件
doc = word.Documents.Open(doc_path)
# 設(shè)置新的文件路徑
docx_path = os.path.splitext(doc_path)[0] + ".docx"
# 保存文件為.docx格式
doc.SaveAs(docx_path, FileFormat=16) # 16 represents wdFormatXMLDocument
# 關(guān)閉文檔
doc.Close()
# 關(guān)閉Word應(yīng)用程序
word.Quit()
# 使用函數(shù)
convert_doc_to_docx("Path")
由于時(shí)間精力有限,沒(méi)有寫(xiě)成批量處理的形式。
還有一種方案就是在word里寫(xiě)VBA。
采用哪種方案可以根據(jù)自己的熟練度。
到此這篇關(guān)于基于C#自制批量doc轉(zhuǎn)換為docx的小工具 的文章就介紹到這了,更多相關(guān)C# doc轉(zhuǎn)docx內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)讀取txt文件生成Word文檔
大家好,本篇文章主要講的是C#實(shí)現(xiàn)讀取txt文件生成Word文檔,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01
C#實(shí)現(xiàn)條形碼識(shí)別的解決方案分享
主流的識(shí)別庫(kù)主要有ZXing.NET和ZBar,OpenCV 4.0后加入了QR碼檢測(cè)和解碼功能,所以本文主要和大家分享了使用ZBar進(jìn)行條形碼識(shí)別的示例代碼,需要的可以參考一下2023-07-07
winform天氣預(yù)報(bào)小工具(附源碼下載)
主要原理就是利用網(wǎng)上免費(fèi)的webservice獲取天氣數(shù)據(jù),需要的朋友可以參考下2012-03-03
基于C#實(shí)現(xiàn)XML文件讀取工具類(lèi)
這篇文章主要介紹了基于C#實(shí)現(xiàn)XML文件讀取工具類(lèi),涉及C#針對(duì)XML文件各節(jié)點(diǎn)獲取的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
C#中控件動(dòng)態(tài)添加事件綁定的時(shí)機(jī)詳解
這篇文章主要給大家介紹了在C#中為控件動(dòng)態(tài)添加事件綁定的時(shí)機(jī)的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2017-06-06
.NET使用IResourceMonitor實(shí)現(xiàn)獲取資源信息
在 Microsoft.Extensions.Diagnostics.ResourceMonitoring 包提供了一系列定制 API,專(zhuān)用于監(jiān)視 .NET 應(yīng)用程序的資源利用率,本文將利用IResourceMonitor來(lái)實(shí)現(xiàn)獲取資源狀態(tài)信息,感興趣的可以了解下2024-01-01

