2013-09-01 19 views
11


Próbuję odczytać dokument tekstowy przy użyciu C#. Jestem w stanie uzyskać cały tekst, ale chcę móc czytać linię wiersz po linii i na liście i wiązać do widoku siatki. Obecnie mój kod zwraca listę tylko jednego elementu z całym tekstem (nie linia po linii zgodnie z życzeniem). Korzystam z biblioteki Microsoft.Office.Interop.Word, aby odczytać plik. Poniżej znajduje się mój kod:Odczytaj z wiersza dokumentu słowa wierszem

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

Czy to wszystko z kodu, który jest wymieniony powyżej. W najbliższy weekend zamierzam rozpocząć pracę nad projektem, który zostanie odczytany w pliku tekstowym, a następnie usunięty zostanie cały kod między podwójnymi quotami i wstawi się zmienną "A", powiedział. Następnie muszę zastąpić część po przecinku "A", B. dla pisarza, który chce zrobić kilka statystyk na swoim kodzie. Wezwę mój kod, żeby wszyscy mogli go zobaczyć. Czy istnieje jakiś specjalny import, który należy zrobić? –

+1

Używałbym lekkiej biblioteki, takiej jak DocX http://docx.codeplex.com. – Hamdi

+0

@ Hamam dzięki nie wiedziałem o tym. Próbowałem i na pewno jest prosty w użyciu w przeciwieństwie do Interop. Jeszcze raz dziękuję. –

Odpowiedz

17

Ok. Znalazłem rozwiązanie here.


Ostateczny kod jest następujący:

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

W metodzie open @ code pokazuje, że ścieżka nie jest poprawna, a część "COMException nie była obsługiwana" –

+0

Strasznym pomysłem jest użycie Office Interop z ASP.NET lub innej technologii serwera. Te interfejsy API zostały napisane do użytku w aplikacji komputerowej do automatyzacji pakietu Office (pakietu aplikacji komputerowych). Aplikacje serwerowe różnią się pod wieloma względami, dlatego bardzo trudno jest używać Office Interop w nich. Jest również nieobsługiwany przez firmę Microsoft i może naruszać licencję Office. Zobacz [Rozważania na temat automatyzacji biur po stronie serwera] (http://support.microsoft.com/kb/257757) –

6

Powyższy kod jest poprawny, ale to jest zbyt powolny. Poprawiłem kod i jest znacznie szybszy niż powyższy.

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

Co powiesz na to yo. Pobierz wszystkie słowa z dokumentu i podziel je na zwrot lub cokolwiek jest dla ciebie lepsze. Następnie zamień na listę

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

to \ r \ a, ale \ r nie, \ n – thang