2011-09-20 4 views
4

시나리오 : "Microsoft Word 97 - 2003 Document"에서 "Microsoft Word Document"로 변환해야하는 약 14,000 단어의 문서가 있습니다. 즉, 2010 형식 (.docx)으로 업그레이드되었습니다.2010 년 Word 문서를 업그레이드하는 방법이 있습니까

질문 : API를 사용하여이를 쉽게 할 수 있습니까?

참고 : 문서를 .docx로 변환하지만 여전히 호환 모드로 열리는 Microsoft 프로그램 만 찾을 수있었습니다. 그들이 새로운 형식으로 변환 될 수 있다면 좋을 것입니다. 이전 문서를 열 때와 동일한 기능을 제공하며 변환 할 수있는 옵션을 제공합니다.

: 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 : 약간 위의 코드로 조정하면 더 깨끗하게 실행됩니다. 그래도 8 분의 1 파일을 변환하는 데 1min10 초 걸립니다. 내가 14000을 가지고 있다고 가정하면이 방법을 변환해야하는데 상당히 오래 걸릴 것입니다.

EDIT4 : 코드를 다시 변경했습니다. 지금 스레드 풀을 사용합니다. 조금 더 빨리 달리는 것 같습니다. 모든 문서를 변환하려면 더 나은 컴퓨터에서 실행해야합니다. 또는 폴더별로 천천히하십시오. 아무도 이것을 최적화하는 다른 방법을 생각할 수 있습니까?

+0

:하지만,

여기 내 전체 코드의

, 이것은 하나의 버튼, Button1을하고 FolderBrowserDialog, FolderBrowserDialog1 그냥 한 형태이다 두 스레드 모두 내 코어를 100 % 사용하고 있다는 것을 알았 기 때문에 병렬화가 빠른 컴퓨터만큼이나이 문제를 해결할 것이라고 생각하지 않았습니다. 어떤 종류의 컴퓨터를 사용하고 있습니까? –

+0

Windows XP x86, Intel Pentium Dual CPU @ 2.00GHZ, 3.25GB RAM. 업무용 컴퓨터 ... – Gage

+0

x64 Windows 7 이외의 다른 제품과 비교하면 상당히 유사합니다. x86 버전이 x64보다 훨씬 느리거나 다른 버전의 Office 라이브러리를 사용하고 있는지 궁금합니다. "Microsoft Office 12.0 Object Library"버전 2.4.0.0과 "Microsoft Word 12.0 Object Library"버전 8.4.0.0을 사용하고 있습니다. 또한 변환중인 Word 문서의 평균 크기는 얼마입니까? 나는 나의 샘플 세트에서 가장 큰 것이 1 MB 정도라고 생각한다. –

답변

2

추적 및 타이밍이 개선되었으며 12 파일을 처리하는 데 "만"13.73 초가 걸렸습니다. 그러면 약 4 시간 안에 14,000 명이 돌볼 것입니다. 듀얼 코어 프로세서가 장착 된 Windows 7 x64에서 Visual Studio 2010을 실행하고 있습니다. 아마도 더 빠른 컴퓨터를 사용할 수 있을까요? 나는 코드의 첫 번째 버전을 실행했을 때 내가 스레드를 사용하는 방법에 대한 궁금

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 
1

무료 Office 파일 변환기를 사용할 수 있습니다.

다음은 설정에 대해 설명 :

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

은 파일 목록 설정이 있습니다.

+0

그 프로그램을 사용해 보았지만 파일을 .docx로 변환 만했으나 변환 옵션을주는 호환성 모드에서 열립니다 (의미가있는 경우) – Gage

+0

Office 2007에서 열 때 문제가 발생합니다. 2010 년에 2007 년 문서를 작성하면 동일한 프롬프트가 표시됩니다. –

+0

심지어 FullUpgradeOnOpen = 1로 설정했지만 여전히 파일의 이름을 .docx로 바꿉니다. 실제로 그것을 변환하지 않습니다. – Gage

2

를 사용하여 워드 자동화를 열고

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

을 DOCX 또는 당신이 언급 한 변환 방법에 당신의 손을 시도해야한다 wdFormatDocumentDefault에 대한 WdSaveFormat 열거으로 저장합니다. 어느 쪽이든 100 % 가능하며 상당히 쉬워야합니다.

편집 : 컨버터 다니엘이 작품을 게시하는 경우, 훨씬 쉽게 이잖아 그는 모든 신용 가치 :)

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); 
관련 문제