Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/79: Рейтинг темы: голосов - 79, средняя оценка - 4.89
 Аватар для Shekloford
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 53

Как открыть файл doc или docx и записать их текст в TextBox

07.05.2014, 21:34. Показов 16434. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прежде чем огласить проблему хочу сказать, что я в курсе того, что такие темы создавались на форуме, но вменяемого ответа на вопрос я не нашел.

Итак, Win приложение. Есть button1, textBox1, OpenFileDialog.
Нужно, чтобы при нажатии кнопки, открывался openFileDialog, пользователь выбирал файл формата doc или docx. И все содержимое этого файла(Я имею ввиду лишь текст, без таблиц, шрифтов, размеров и так далее) переносился в textBox1.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.05.2014, 21:34
Ответы с готовыми решениями:

Как в TextBox или richTextBox записать текст в столбик, а не в строчку
Возникла проблема . Как в Textbox или richtextbox записать текст (объемный) в столбик , а не в строчку . Может это можно сделать без...

Как открыть doc-файл?
Дан ListBox. В нем допустим предложение Лекция №1... Как сделать так, чтобы при нажатии на Лекция №1 открывался доковский файл?

Как сохранить текст из RichTextBox в файл doc или docx?
Всем привет! Как сохранить текст из RichTextBox в файл doc или docx?

15
 Аватар для kuroiryuu
328 / 312 / 68
Регистрация: 05.11.2009
Сообщений: 712
07.05.2014, 22:17
Можете воспользоваться классами из пространства Microsoft.Office.Interop.Word
0
 Аватар для NiceGuyEddy
220 / 143 / 35
Регистрация: 25.06.2010
Сообщений: 383
07.05.2014, 22:36
Насчет фалов *.doc не знаю. Вот пример файлов *.txt:
C#
1
2
3
4
5
6
7
8
9
10
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "Word Files (*.doc, *docx)|*.doc;*docx|Text files (*.txt, *.log)|*.txt;*.log|All files (*.*)|*.*";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                FileInfo fi = new FileInfo(ofd.FileName);
                using (StreamReader sr = new StreamReader(fi.FullName))
                {
                    textBox1.Text = sr.ReadToEnd();
                }
            }
0
 Аватар для Shekloford
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 53
08.05.2014, 12:47  [ТС]
NiceGuyEddy, если я открою файл, используя ваш код, то в textBox будут занесены непонятные символы. Я полагаю - это проблема с кодировкой.
kuroiryuu, упоминание об этом было в других темах, но как этим воспользоваться я не понял.
Вопрос актуален.
0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
08.05.2014, 13:06
Цитата Сообщение от Shekloford Посмотреть сообщение
Я полагаю - это проблема с кодировкой.
Ну, Word понятия не имеет, что же у Вас за программа и почему он должен отдать Вам текст в том виде, в каком Вы сможете его прочитать. Документ Word содержит достаточно большое количество объектов помимо текста (да и текст не всегда таковым является по большому счёту). В случае с docx, разбирайте формат OOXML, дешевле всего, а вот в случае со стареньким doc будет куда больше мороки, но указанный товарищем kuroiryuu метод наиболее приемлемый в этом случае.
0
 Аватар для kuroiryuu
328 / 312 / 68
Регистрация: 05.11.2009
Сообщений: 712
08.05.2014, 15:38
вот нашёл небольшой пример у себя в исходниках по работе с Word-ом
думаю, что вы разберётесь что и как:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.XPath;
using Word = Microsoft.Office.Interop.Word;
using InfoPath = Microsoft.Office.Interop.InfoPath;
 
namespace MSOffice
{
    public class cWord : cOffice
    {
        Word.Application wordapp;
        Word.Document worddocument;
        DataTable table;
        Word.WdReplace replace = Word.WdReplace.wdReplaceOne;
 
        public cWord()
        {
            //Создаем объект Word - равносильно запуску Word
            wordapp = new Word.Application();
        }
 
        public override void OpenFile(string sTemplate, XmlDocument xmlDoc)
        {
            try
            {
                fProcess process = new fProcess();
 
                XmlNodeList xnl = xmlDoc.SelectNodes("/root[@type=\"table\"]");
                if (xnl.Count != 0)
                {
                    //Делаем его видимым
                    Object template = string.Format("{0}\\{1}", Directory.GetCurrentDirectory(), sTemplate);
                    Object newTemplate = false;
                    Object documentType = Word.WdNewDocumentType.wdNewBlankDocument;
                    Object visible = true;
 
                    //Создаем документ
                    worddocument = wordapp.Documents.Add(ref template, ref newTemplate, ref documentType, ref visible);
                    wordapp.Visible = true;
                    int tables = worddocument.Tables.Count;
                    replace = Word.WdReplace.wdReplaceAll;
                    SearchAndReplace("$YN$", DateTime.Now.Year.ToString());
                    replace = Word.WdReplace.wdReplaceOne;
                    if (tables != 0)
                    {
                        //process.Show();
                        for (int idx = 1; idx <= worddocument.Tables.Count; idx++)
                        {
                            xnl = xmlDoc.SelectNodes("//table");
                            for (int index = 0; index < xnl.Count; index++)
                            {
                                XmlNodeList xnl2 = xnl[index].SelectNodes("//row");
                                bool change = false;
                                Word.Range rng = null;
                                for (int i = 0; i < xnl2.Count; i++)
                                {
                                    if (!change)
                                    {
                                        rng = worddocument.Tables[idx].Rows[2].Range;
                                        rng.Font.Size = 12;
                                        rng.Font.Name = "New Time Romand";
                                        rng.Font.Bold = 0;
                                        rng.Select();
                                        rng.Copy();
                                        change = true;
                                    }
                                    object start = worddocument.Tables[idx].Range.End;
                                    object end = worddocument.Tables[idx].Range.End;
                                    rng = worddocument.Range(ref start, ref end);
 
                                    SearchAndReplace("##", (i + 1).ToString());
                                    for (int j = 0; j < xnl2[i].ChildNodes.Count; j++)
                                    {
                                        SearchAndReplace("$" + xnl2[i].ChildNodes[j].Attributes[0].InnerText + "$", xnl2[i].ChildNodes[j].InnerText);
 
                                    }
                                    if (i != (xnl2.Count - 1))
                                        rng.Paste();
                                }
                            }
                        }
                        CloseDoc(worddocument);
                        //process.Close();
                    }
                    xnl = xmlDoc.SelectNodes("//root");
                    for (int i = 0; i < xnl.Count; i++)
                    {
                        for (int j = 0; j < xnl[i].ChildNodes.Count; j++)
                        {
                            if (xnl[i].ChildNodes[j].Name.CompareTo("table") != 0)
                                SearchAndReplace("$" + xnl[i].ChildNodes[j].Name + "$", xnl[i].ChildNodes[j].InnerText);
                        }
                    }
                }
 
                xnl = xmlDoc.SelectNodes("/root[@type=\"single\"]");
 
                if (xnl.Count != 0)
                {
                    xnl = xmlDoc.SelectNodes("//document");
                    process.Show();
                    for (int i = 0; i < xnl.Count; i++)
                    {
                        process.pbProc.Value = (i + 1) * 100 / xnl.Count;
                        //Делаем его видимым
                        Object template = string.Format("{0}\\{1}", Directory.GetCurrentDirectory(), sTemplate);
                        Object newTemplate = false;
                        Object documentType = Word.WdNewDocumentType.wdNewBlankDocument;
                        Object visible = true;
 
                        //Создаем документ
                        worddocument = wordapp.Documents.Add(ref template, ref newTemplate, ref documentType, ref visible);
                        wordapp.Visible = true;
 
                        replace = Word.WdReplace.wdReplaceAll;
                        SearchAndReplace("$YN$", DateTime.Now.Year.ToString());
                        replace = Word.WdReplace.wdReplaceOne;
 
                        XmlNodeList xnl2 = xnl[i].SelectNodes("item[@name=\"fioStudH\"]");
                        string name = "";
                        if (xnl2.Count != 0)
                            name = xnl2[0].InnerText;
 
                        for (int j = 0; j < xnl[i].ChildNodes.Count; j++)
                        {
                            if (xnl[i].ChildNodes[j].Attributes[0].Value.CompareTo("SCode") == 0 || xnl[i].ChildNodes[j].Attributes[0].Value.CompareTo("SpecialityC") == 0)
                                replace = Word.WdReplace.wdReplaceAll;
                            else
                                replace = Word.WdReplace.wdReplaceOne;
                            SearchAndReplace("$" + xnl[i].ChildNodes[j].Attributes[0].Value + "$", xnl[i].ChildNodes[j].InnerText);
                        }
                        replace = Word.WdReplace.wdReplaceAll;
                        for (int j = 0; j < xnl[i].ChildNodes.Count; j++)
                        {
                            SearchAndReplace("$" + xnl[i].ChildNodes[j].Attributes[0].Value + "$", "");
                        }
                        xnl2 = xmlDoc.SelectNodes("/root/filename");
                        this.SaveDocument(string.Format("{0} {1}", xnl2[0].Attributes[0].Value, name));
                        CloseDoc(worddocument);
                    }
                    process.Close();
                }
 
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message);
                Close();
                return;
            }
        }
 
        public void AddDocument(string sTemplate, XmlDocument xmlDoc)
        {
 
        }
 
        private void CloseDoc(Word.Document worddocument)
        {
            Object saveChanges = Word.WdSaveOptions.wdPromptToSaveChanges;
            Object originalFormat = Type.Missing;
            Object routeDocument = Type.Missing;
            ((Word._Document)worddocument).Close(ref saveChanges, ref originalFormat, ref routeDocument);
        }
 
        public void SaveDocument(string strFileName)
        {
            Object fileName = string.Format("{1}\\Documents\\{0}.doc", strFileName, Directory.GetCurrentDirectory());
            Object fileFormat = Type.Missing;
            Object lockComments = Type.Missing;
            Object password = Type.Missing;
            Object addToRecentFiles = Type.Missing;
            Object writePassword = Type.Missing;
            Object readOnlyRecommended = Type.Missing;
            Object embedTrueTypeFonts = Type.Missing;
            Object saveNativePictureFormat = Type.Missing;
            Object saveFormsData = Type.Missing;
            Object saveAsAOCELetter = Type.Missing;
            Object encoding = Type.Missing;
            Object insertLineBreaks = Type.Missing;
            Object allowSubstitutions = Type.Missing;
            Object lineEnding = Type.Missing;
            Object addBiDiMarks = Type.Missing;
 
            worddocument.SaveAs(ref fileName, ref fileFormat, ref lockComments,
            ref password, ref addToRecentFiles, ref writePassword,
            ref readOnlyRecommended, ref embedTrueTypeFonts,
            ref saveNativePictureFormat, ref saveFormsData,
            ref saveAsAOCELetter, ref encoding, ref insertLineBreaks,
            ref allowSubstitutions, ref lineEnding, ref addBiDiMarks);
        }
 
        /// <summary>
        /// Поиск и замена текста
        /// </summary>
        public void SearchAndReplace(string find, string replace)
        {
            try
            {
                // Смещаем выделение к началу документа
                object Start = 0;
                object End = worddocument.Paragraphs[worddocument.Paragraphs.Count].Range.End;
                Word.Range rng = worddocument.Range(ref Start, ref End);
 
                Word.Find fnd = rng.Find;
                fnd.ClearFormatting();
                fnd.Text = find;
                fnd.Replacement.ClearFormatting();
                fnd.Replacement.Text = replace;
                ExecuteReplace(fnd);
            }
            catch (Exception exp)
            {
                System.Windows.Forms.MessageBox.Show(exp.Message);
                return;
            }
        }
 
        private Boolean ExecuteReplace(Word.Find find)
        {
            return ExecuteReplace(find, replace);
        }
 
        private Boolean ExecuteReplace(Word.Find find, Object replaceOption)
        {
            // Простая оболочка Find.Execute:
            Object findText = Type.Missing;
            Object matchCase = Type.Missing;
            Object matchWholeWord = Type.Missing;
            Object matchWildcards = Type.Missing;
            Object matchSoundsLike = Type.Missing;
            Object matchAllWordForms = Type.Missing;
            Object forward = Type.Missing;
            Object wrap = Type.Missing;
            Object format = Type.Missing;
            Object replaceWith = Type.Missing;
            Object replace = replaceOption;
            Object matchKashida = Type.Missing;
            Object matchDiacritics = Type.Missing;
            Object matchAlefHamza = Type.Missing;
            Object matchControl = Type.Missing;
 
            return find.Execute(ref findText, ref matchCase,
            ref matchWholeWord, ref matchWildcards, ref matchSoundsLike,
            ref matchAllWordForms, ref forward, ref wrap, ref format,
            ref replaceWith, ref replace, ref matchKashida,
            ref matchDiacritics, ref matchAlefHamza, ref matchControl);
        }
        //
        public void SetData(DataTable table)
        {
            this.table = table;
        }
 
        public override void EditFile()
        {
            throw new Exception("The method or operation is not implemented.");
        }
 
        public override void SaveFile()
        {
            throw new Exception("The method or operation is not implemented.");
        }
 
        public void Close()
        {
            // Выводим запрос на сохранение изменений
            Object saveChanges = Word.WdSaveOptions.wdPromptToSaveChanges;
            Object originalFormat = Type.Missing;
            Object routeDocument = Type.Missing;
            ((Word._Application)wordapp).Quit(ref saveChanges,
            ref originalFormat, ref routeDocument);
        }
    }
}
1
 Аватар для Shekloford
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 53
08.05.2014, 20:09  [ТС]
kuroiryuu, я так понимаю это уже готовый класс? Честно, мне сложно понять что к чему.
0
Заблокирован
09.05.2014, 12:10
C помошью класса Encoding можно изменить кодировку исходного файла при чтении
0
 Аватар для Shekloford
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 53
09.05.2014, 12:15  [ТС]
kuroiryuu, также я вижу, что это класс - наследник от другого класса. И в этом же классе, вы делаете вызов другого. Мне как новичку разобраться практически невозможно.
0
 Аватар для kuroiryuu
328 / 312 / 68
Регистрация: 05.11.2009
Сообщений: 712
13.05.2014, 01:03
Shekloford, то что там класс наследник это всё ерунда...
сама суть этого класса это как используются объекты
C#
1
2
3
4
....
Word.Application wordapp;
Word.Document worddocument;
....
в этом классе и как с их помощью осуществляется работа с файлами Word
0
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
13.05.2014, 02:02
NiceGuyEddy, txt не очем. в doc там теги форматирования , которые будут с таким подходом отображатся как крякозябры
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
13.05.2014, 03:33
Все интеропы от лукавого, есть только один способ программно работать с документом Word, перед редактированием конвертишь в rtf и он твой.
0
Заблокирован
13.05.2014, 08:28
Лучший ответ Сообщение было отмечено Shekloford как решение

Решение

При работе с офисными документами нужно стараться использовать сторонние библиотеки.
Самый большой их плюс в том, что они не зависят от офиса и не требуют наличия на компе, скажем, ворда или екзела.

Для docx есть DocX
C#
1
2
3
4
5
6
7
8
9
10
11
12
using Novacode; // предварительно добавив в проект ссылку на dll
...
DocX DocX1;
...
DocX1 = DocX.Load("путь к файлу");
...
for (int i = 0; i < DocX1.Paragraphs.Count; i++)
{
    RichTextBox1.Text += DocX1.Paragraphs[i].Text + Environment.NewLine;
}
...
DocX1.Save(); // можно ещё внести какие-то изменения в docx, скажем, добавить абзац с помощью DocX1.InsertParagraph, и сохранить.
Для xls/xlsx - NPOI.
Примеры - тут, правда, на VB.NET.
Вот здесь довольно навороченный контрол для отображения и редактирования таблиц типа Excel.

А вот с mdb/accdb - проблемы, слышал про Jackcess для джавы (почему её до сих пор не применили в OpenOffice?), а под .NET не знаю.
1
 Аватар для Shekloford
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 53
21.05.2014, 16:29  [ТС]
Все получилось, но есть кое-какие ошибки.
Вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Novacode;
using System.Windows.Forms;
using NPOI;
 
namespace textdocfiles
{
    class Program
    {
        [STAThreadAttribute]
        static void Main(string[] args)
        {
            string str = "";
            DocX DocX1;
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == DialogResult.OK)
            {
               DocX1 = DocX.Load(ofd.FileName);
               for (int i = 0; i < DocX1.Paragraphs.Count; i++)
               {
                   str += DocX1.Paragraphs[i].Text + Environment.NewLine;
               }
               Console.Write(str);
            }  
        }
    }
}
Если открыть файл с какими либо таблицами, то программа будет выдавать ошибку. Мне нужно, чтобы программа игнорировала наличие таблицы и выдавала все ее содержимое.(Не важно в каком порядке)
Я скачал библиотеку для xml, но не понимаю, что нужно подключить, для выполнение такой задачи.
0
Заблокирован
21.05.2014, 17:14
Если открыть файл с какими либо таблицами, то программа будет выдавать ошибку.
Полазайте по членам DocX1, посмотрите, что там есть, и поэкспериментируйте.
Вам дали готовую опенсорсную (!) библиотеку. Программисту этого достаточно.
0
16 / 16 / 10
Регистрация: 23.09.2014
Сообщений: 136
09.05.2015, 10:14
Цитата Сообщение от kuroiryuu Посмотреть сообщение
вот нашёл небольшой пример у себя в исходниках по работе с Word-ом
думаю, что вы разберётесь что и как:
cOffice -- не понимает...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.05.2015, 10:14
Помогаю со студенческими работами здесь

В Memo или RichEdit вставить текст из файла doc или docx
Люди помогите плиз, весь нэт обрыл. Нужно в Builder, в Memo или RichEdit вставить текст из файла doc или docx. Можно и без...

Возможно ли прочитать в консоль документ .docx или .doc, а также записать в том же формате?
Возможно ли прочитать в консоль документ .docx или .doc, а также записать в том же формате? Если да, то как это сделать?

Создание/склеивание doc\docx файла из шаблона doc\docx с заменой ключевых слов
Подскажите, как можно такое реализовать? Я узнал, что в rtf нельзя делать разрыв страницы, а просто как с текстовым файлом с doc и docx...

Как открыть doc в делфи? Или как можно написать огромный текст в делфи?
Думаю поймете. Я решил сделать сборник книг. И в Delphi добавил список книг (в виде кнопок) и при выборе я бы хотел открыть форму где был...

Получить текст из .doc (НЕ DOCX)
Необходимо достать текст из .doc файла и вывести на экран.Желательно что бы код работал в Qt. Спасибо за потраченное время. PS....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru