有没有办法将word文档升级到2010年

时间:2011-09-20 14:58:10

标签: c# vb.net ms-word upgrade docx

场景:我有大约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 :再次更改了代码。现在使用线程池。似乎跑得快一点。仍需要在更好的计算机上运行才能转换所有文档。或者按文件夹慢慢来做。谁能想到任何其他方式来优化这个?

4 个答案:

答案 0 :(得分:2)

使用word自动化并打开它并使用wdFormatDocumentDefault的WdSaveFormat枚举保存它,该枚举应为docx

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.wdsaveformat%28v=office.14%29.aspx

或尝试使用您提到的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)

您可以使用免费的Office文件转换器。

这里解释了设置:

http://technet.microsoft.com/en-us/library/cc179019.aspx

有文件列表设置。

答案 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);