Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/27: Рейтинг темы: голосов - 27, средняя оценка - 4.56
Shekloford
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 53
1

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

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

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

Итак, Win приложение. Есть button1, textBox1, OpenFileDialog.
Нужно, чтобы при нажатии кнопки, открывался openFileDialog, пользователь выбирал файл формата doc или docx. И все содержимое этого файла(Я имею ввиду лишь текст, без таблиц, шрифтов, размеров и так далее) переносился в textBox1.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2014, 21:34
Ответы с готовыми решениями:

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

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

Как на С# перевести текст или экспортировать в расширение .doc (ms word) ?
Как на "Си шарпе" перевести текст или экспортировать в расширение .doc....

Как записать текст в textbox из переменой?
Есть textbox1, в котором набирается текст. Есть textbox2 в котором выводится...

Как записать текст в textBox (трудности перевода)?
Как записать текст в textBox (трудности перевода)? Уважаемые форумчане,...

15
kuroiryuu
320 / 304 / 68
Регистрация: 05.11.2009
Сообщений: 712
Завершенные тесты: 2
07.05.2014, 22:17 2
Можете воспользоваться классами из пространства Microsoft.Office.Interop.Word
0
NiceGuyEddy
214 / 137 / 35
Регистрация: 25.06.2010
Сообщений: 383
Завершенные тесты: 2
07.05.2014, 22:36 3
Насчет фалов *.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  [ТС] 4
NiceGuyEddy, если я открою файл, используя ваш код, то в textBox будут занесены непонятные символы. Я полагаю - это проблема с кодировкой.
kuroiryuu, упоминание об этом было в других темах, но как этим воспользоваться я не понял.
Вопрос актуален.
0
Spawn
972 / 870 / 353
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
08.05.2014, 13:06 5
Цитата Сообщение от Shekloford Посмотреть сообщение
Я полагаю - это проблема с кодировкой.
Ну, Word понятия не имеет, что же у Вас за программа и почему он должен отдать Вам текст в том виде, в каком Вы сможете его прочитать. Документ Word содержит достаточно большое количество объектов помимо текста (да и текст не всегда таковым является по большому счёту). В случае с docx, разбирайте формат OOXML, дешевле всего, а вот в случае со стареньким doc будет куда больше мороки, но указанный товарищем kuroiryuu метод наиболее приемлемый в этом случае.
0
kuroiryuu
320 / 304 / 68
Регистрация: 05.11.2009
Сообщений: 712
Завершенные тесты: 2
08.05.2014, 15:38 6
вот нашёл небольшой пример у себя в исходниках по работе с 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  [ТС] 7
kuroiryuu, я так понимаю это уже готовый класс? Честно, мне сложно понять что к чему.
0
ImFine
Заблокирован
09.05.2014, 12:10 8
C помошью класса Encoding можно изменить кодировку исходного файла при чтении
0
Shekloford
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 53
09.05.2014, 12:15  [ТС] 9
kuroiryuu, также я вижу, что это класс - наследник от другого класса. И в этом же классе, вы делаете вызов другого. Мне как новичку разобраться практически невозможно.
0
kuroiryuu
320 / 304 / 68
Регистрация: 05.11.2009
Сообщений: 712
Завершенные тесты: 2
13.05.2014, 01:03 10
Shekloford, то что там класс наследник это всё ерунда...
сама суть этого класса это как используются объекты
C#
1
2
3
4
....
Word.Application wordapp;
Word.Document worddocument;
....
в этом классе и как с их помощью осуществляется работа с файлами Word
0
Metall_Version
2119 / 1256 / 516
Регистрация: 04.03.2014
Сообщений: 4,094
Завершенные тесты: 2
13.05.2014, 02:02 11
NiceGuyEddy, txt не очем. в doc там теги форматирования , которые будут с таким подходом отображатся как крякозябры
0
DataPlanner
153 / 183 / 49
Регистрация: 25.11.2013
Сообщений: 978
13.05.2014, 03:33 12
Все интеропы от лукавого, есть только один способ программно работать с документом Word, перед редактированием конвертишь в rtf и он твой.
0
Водяной Змей
Заблокирован
13.05.2014, 08:28 13
Лучший ответ Сообщение было отмечено 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  [ТС] 14
Все получилось, но есть кое-какие ошибки.
Вот код:
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 15
Если открыть файл с какими либо таблицами, то программа будет выдавать ошибку.
Полазайте по членам DocX1, посмотрите, что там есть, и поэкспериментируйте.
Вам дали готовую опенсорсную (!) библиотеку. Программисту этого достаточно.
0
Neptyn
16 / 16 / 10
Регистрация: 23.09.2014
Сообщений: 133
09.05.2015, 10:14 16
Цитата Сообщение от kuroiryuu Посмотреть сообщение
вот нашёл небольшой пример у себя в исходниках по работе с Word-ом
думаю, что вы разберётесь что и как:
cOffice -- не понимает...
0
09.05.2015, 10:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2015, 10:14

Открыть файл (например, doc) в окне своего приложения
Привет всем. открываю файлы таким способом:...

Как найти и выделить текст в RichTextBox или TextBox?
Уважаемый всем, очень пожалуйста как сделать поиск например слово БОГ получить...

Как записать текст в файл?
Запутался с потоками и прошу помощи. Есть текстовый файл, мне его нужно целиком...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru