Есть ли способ обновить документы Word до 2010 - PullRequest
4 голосов
/ 20 сентября 2011

Сценарий : у меня есть около 14000 документов Word, которые необходимо преобразовать из «Документа Microsoft Word 97 - 2003» в «Документ Microsoft Word».Другими словами, обновлен до формата 2010 (.docx).

Вопрос : Есть ли простой способ сделать это, используя API или что-то еще?

Примечание : Мне удалось найти толькоПрограмма Microsoft, которая конвертирует документы в .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`

. Позволяет выбрать путь, а затем найти все файлы документов в подпапках.Этот код не важен, все файлы для преобразования находятся в lstFiles.Единственная проблема на данный момент заключается в том, что для преобразования даже 10 документов требуется очень много времени.Должен ли я использовать одно слово-приложение для документа вместо его повторного использования?Любые предложения?

Также он открывает слово после примерно 2 или 3 преобразований и начинает мигать, но продолжает преобразование.

EDIT3 : немного подправлен код выше, и он работаеточиститель.Требуется 1мин10сек, чтобы конвертировать 8 файлов.Учитывая, что у меня 14000, мне нужно преобразовать этот метод, это займет достаточно много времени.

EDIT4 : снова изменил код.Использует пул потоков сейчас.Кажется, работает немного быстрее.Еще нужно запустить на лучшем компьютере, чтобы конвертировать все документы.Или делайте их медленно по папкам.Кто-нибудь может придумать какой-нибудь другой способ оптимизировать это?

Ответы [ 4 ]

2 голосов
/ 21 сентября 2011

Я выполнил ваш код локально, с некоторыми незначительными правками для улучшения трассировки и синхронизации, и «всего» потребовалось 13,73 секунды, чтобы сделать 12 файлов. Это позаботится о ваших 14000 за 4 часа. Я использую Visual Studio 2010 в Windows 7 x64 с двухъядерным процессором. Возможно, вы можете просто использовать более быстрый компьютер?

Вот мой полный код, это просто форма с одной кнопкой, 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 голосов
/ 20 сентября 2011

Используйте автоматизацию слов и откройте ее и сохраните с перечислением WdSaveFormat для wdFormatDocumentDefault, которое должно быть docx

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

, или попробуйте свои силы в упомянутом выше методе Convert.В любом случае, 100% возможно и должно быть довольно просто.

Редактировать: если конвертер, опубликованный Дэниелом, работает, это намного проще, и он заслуживает всяческих похвал :):

1 голос
/ 20 сентября 2011

попробуйте это:

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);
1 голос
/ 20 сентября 2011

Вы можете использовать бесплатный конвертер файлов Office.

Здесь объясняются настройки:

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

Существует настройка списка файлов.

...