场景:我有大约14000个word文档需要从“Microsoft Word 97 - 2003 Document”转换为“Microsoft Word Document”。换句话说,升级到2010格式(.docx)。
问题:使用API或其他方法有一种简单的方法吗?
注意:我只能找到一个将文档转换为.docx的微软程序,但它们仍然在兼容模式下打开。如果它们可以转换为新格式会很好。打开旧文档时可以获得相同的功能,并且可以选择转换它。
修改:刚刚找到http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word._document.convert.aspx,了解如何使用它。
EDIT2 :这是我目前转换文件的功能
Private Sub btnConvert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConvert.Click
FolderBrowserDialog1.ShowDialog()
Dim mainThread As Thread
If Not String.IsNullOrEmpty(FolderBrowserDialog1.SelectedPath) Then
lstFiles.Clear()
DirSearch(FolderBrowserDialog1.SelectedPath)
ThreadPool.SetMaxThreads(1, 1)
lstFiles.RemoveAll(Function(y) y.Contains(".docx"))
TextBox1.Text += "Conversion started at " & DateTime.Now().ToString & Environment.NewLine
For Each x In lstFiles
ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf ConvertDoc), x)
Next
End If
End Sub
Private Sub ConvertDoc(ByVal path As String)
Dim word As New Microsoft.Office.Interop.Word.Application
Dim doc As Microsoft.Office.Interop.Word.Document
word.Visible = False
Try
Debug.Print(path)
doc = word.Documents.Open(path, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing)
doc.Convert()
Catch ex As Exception
''do nothing
Finally
doc.Close()
word.Quit()
End Try
End Sub`
它允许我选择路径,然后查找子文件夹中的所有doc文件。该代码并不重要,所有转换文件都在lstFiles中。目前唯一的问题是转换甚至只需要10个文档需要很长时间。我应该为每个文档使用一个单词应用程序而不是重用它吗?有什么建议吗?
此外,它会在大约2或3次转换后打开字词并开始闪烁,但会继续转换。
EDIT3 :调整到稍高的代码,它运行更干净。需要1分10秒来转换8个文件。考虑到我有14000我需要转换这个方法需要相当长的时间。
EDIT4 :再次更改了代码。现在使用线程池。似乎跑得快一点。仍需要在更好的计算机上运行才能转换所有文档。或者按文件夹慢慢来做。谁能想到任何其他方式来优化这个?
答案 0 :(得分:2)
使用word自动化并打开它并使用wdFormatDocumentDefault的WdSaveFormat枚举保存它,该枚举应为docx
或尝试使用您提到的Convert方法。无论哪种方式100%可能,应该相当容易。
编辑:如果转换器丹尼尔发布的作品,这更容易,他值得所有的功劳:)
答案 1 :(得分:2)
我在本地运行您的代码,只进行了一些小的编辑以改进跟踪和计时,并且“仅”花了13.73秒来完成12个文件。这将在大约4小时内照顾你的14,000。我在Windows 7 x64上使用双核处理器运行Visual Studio 2010。也许你可以使用更快的电脑?
这是我的完整代码,这只是一个带有单个按钮的表单,Button1和FolderBrowserDialog,FolderBrowserDialog1:
Imports System.IO
Public Class Form1
Dim lstFiles As List(Of String) = New List(Of String)
Private Sub DirSearch(path As String)
Dim thingies = From file In Directory.GetFiles(path) Where file.EndsWith(".doc") Select file
lstFiles.AddRange(thingies)
For Each subdir As String In Directory.GetDirectories(path)
DirSearch(subdir)
Next
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
FolderBrowserDialog1.ShowDialog()
If Not String.IsNullOrEmpty(FolderBrowserDialog1.SelectedPath) Then
lstFiles.Clear()
DirSearch(FolderBrowserDialog1.SelectedPath)
Dim word As New Microsoft.Office.Interop.Word.Application
Dim doc As Microsoft.Office.Interop.Word.Document
lstFiles.RemoveAll(Function(y) y.Contains(".docx"))
Dim startTime As DateTime = DateTime.Now
Debug.Print("Timer started at " & DateTime.Now().ToString & Environment.NewLine)
For Each x In lstFiles
word.Visible = False
Debug.Print(x + Environment.NewLine)
doc = word.Documents.Open(x)
doc.Convert()
doc.Close()
Next
word.Quit()
Dim endTime As DateTime = DateTime.Now
Debug.Print("Took " & endTime.Subtract(startTime).TotalSeconds & " to process " & lstFiles.Count & " documents" & Environment.NewLine)
End If
End Sub
End Class
答案 2 :(得分:1)
答案 3 :(得分:1)
试试这个:
using Microsoft.Office.Interop
Microsoft.Office.Interop.Word.ApplicationClass word = new ApplicationClass();
object nullvalue = Type.Missing;
object filee = filename;
object file2 = String.Format("{0}{1}", filepath, "convertedfile.doc");
Microsoft.Office.Interop.Word.Document doc = word.Documents.Open(ref filee, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue);
doc.SaveAs(ref file2, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue, ref nullvalue);