2013-09-01 4 views
11


C#을 사용하여 단어 문서를 읽으려고합니다. 모든 텍스트를 가져올 수 있지만 및 을 목록에 저장하고 gridview에 바인딩하여 행을 읽을 수 있기를 원합니다. 현재 내 코드는 모든 텍스트가있는 한 항목의 목록을 반환합니다 (원하는대로 줄별로 정렬하지 않음). 파일을 읽으려면 Microsoft.Office.Interop.Word 라이브러리를 사용하고 있습니다. 아래 코드는 지금까지입니다.Word 문서에서 한 줄씩 읽음

Application word = new Application(); 
    Document doc = new Document(); 

    object fileName = path; 
    // Define an object to pass to the API for missing parameters 
    object missing = System.Type.Missing; 
    doc = word.Documents.Open(ref fileName, 
      ref missing, ref missing, ref missing, ref missing, 
      ref missing, ref missing, ref missing, ref missing, 
      ref missing, ref missing, ref missing, ref missing, 
      ref missing, ref missing, ref missing); 

    String read = string.Empty; 
    List<string> data = new List<string>(); 
    foreach (Range tmpRange in doc.StoryRanges) 
    { 
     //read += tmpRange.Text + "<br>"; 
     data.Add(tmpRange.Text); 
    } 
    ((_Document)doc).Close(); 
    ((_Application)word).Quit(); 

    GridView1.DataSource = data; 
    GridView1.DataBind(); 
+0

위에 나열된 코드가 모두 있습니까? 이번 주말에 프로젝트에서 시작하여 단어 파일을 읽은 다음 큰 따옴표 사이에있는 코드를 모두 꺼내서 변수 "A"를 삽입 할 것입니다. 그런 다음 나는 쉼표 뒤에있는 부분을 "A"로 바꿔야합니다. B. 그의 코드에 대한 통계를 작성하려는 작가에게. 나는 모두를 위해 나의 코드를 올릴 것이다. 특별 수입품이 있습니까? –

+1

DocX http://docx.codeplex.com과 같은 경량 라이브러리를 사용합니다. – Hamdi

+0

@Hamdi 덕분에 나는 그 사실을 알지 못했습니다. 노력했지만 확실히 Interop와 반대로 사용하기 쉽습니다. 다시 한번 감사합니다. –

답변

17

Ok. 솔루션 here을 찾았습니다.

Application word = new Application(); 
    Document doc = new Document(); 

    object fileName = path; 
    // Define an object to pass to the API for missing parameters 
    object missing = System.Type.Missing; 
    doc = word.Documents.Open(ref fileName, 
      ref missing, ref missing, ref missing, ref missing, 
      ref missing, ref missing, ref missing, ref missing, 
      ref missing, ref missing, ref missing, ref missing, 
      ref missing, ref missing, ref missing); 

    String read = string.Empty; 
    List<string> data = new List<string>(); 
    for (int i = 0; i < doc.Paragraphs.Count; i++) 
    { 
     string temp = doc.Paragraphs[i + 1].Range.Text.Trim(); 
     if (temp != string.Empty) 
      data.Add(temp); 
    } 
    ((_Document)doc).Close(); 
    ((_Application)word).Quit(); 

    GridView1.DataSource = data; 
    GridView1.DataBind(); 
+0

내 코드 @ open 메서드에서 해당 경로가 유효하지 않고 일부 'COMException이 처리되지 않았습니다'를 나타냅니다. –

+0

ASP.NET이나 다른 서버 기술에서 Office Interop을 사용하는 것은 끔찍한 생각입니다. 이 API는 데스크톱 응용 프로그램 (Office 응용 프로그램 제품군)을 자동화하기 위해 작성되었습니다. 서버 응용 프로그램은 여러면에서 서로 다르므로 Office Interop을 사용하는 것이 매우 바람직하지 않습니다. 또한 Microsoft에서 지원하지 않으며 Office 라이선스를 위반할 수도 있습니다. [서버 측 서버 자동화 고려 사항] (http://support.microsoft.com/kb/257757/ko) –

6

위의 코드는 정확하지만 너무 느린 다음과 같이


마지막 코드입니다. 코드를 개선했으며 위 코드보다 훨씬 빠릅니다.

List<string> data = new List<string>(); 
Application app = new Application(); 
Document doc = app.Documents.Open(ref readFromPath); 

foreach (Paragraph objParagraph in doc.Paragraphs) 
    data.Add(objParagraph.Range.Text.Trim()); 

((_Document)doc).Close(); 
((_Application)app).Quit(); 
1

어때? 의사가 작성한 모든 단어를 가져 와서 나눠 주면됩니다. 그런 다음 목록으로 바꿈

List<string> lines = doc.Content.Text.Split('\n').ToList(); 
+1

\ r \ a이지만 \ r 할 것입니다. \ n – thang

관련 문제