Преобразование файлов doc в файлы docx в C#
В этом примере показано, как написать программу на C# для автоматического преобразования файлов doc в файлы docx.
В предыдущей версии Windows, когда я дважды щелкнул файл .doc, я получил это сообщение об ошибке:
Ошибка
В настоящее время операционная система не настроена для запуска этого приложения.
Р>
Это исправлено в последних версиях Windows, но каждый раз, когда это происходило, я задавался вопросом, почему Microsoft решила, что Word не понимает файлы .doc по умолчанию. Возможно, это было «побудить» людей переходить к файлам .docx.
Более новый формат .docx предлагает больше возможностей (хотя я не уверен, что это такое), поэтому имеет смысл конвертировать файлы doc в файлы docx.
Эта программа преобразует все файлы .doc в каталог в файлы .docx. Программа включает ссылку на Microsoft.Office.Interop.Word 12.0.0.0, чтобы разрешить ей манипулировать файлами Microsoft Word. Чтобы добавить такую ссылку, откройте меню «Проект» и выберите «Добавить ссылку». На вкладке .NET выберите самую последнюю версию записи Microsoft.Office.Interop.Word и нажмите «ОК».
Чтобы упростить использование классов, определенных в этой библиотеке, программа включает в себя следующую инструкцию using:
using Word = Microsoft.Office.Interop.Word;
Это позволяет программе использовать префикс Word для указания классов в библиотеке.
Если вы вводите или выбираете путь к каталогу и нажимаете кнопку «Преобразовать», выполняется следующий код.
private void btnConvert_Click(object sender, EventArgs e) { Word._Application word_app = new Word.ApplicationClass(); object missing = System.Reflection.Missing.Value; object save_changes = false; int num_converted = 0; lstFiles.Items.Clear(); DirectoryInfo dir_info = new DirectoryInfo(txtDirectory.Text); foreach (FileInfo file_info in dir_info.GetFiles("*.doc")) { if (file_info.Extension.ToLower() == ".docx") continue; int name_length = file_info.FullName.Length - file_info.Extension.Length; string new_filename = file_info.FullName.Substring(0, name_length) + ".docx"; if (File.Exists(new_filename)) { lstFiles.Items.Add("Skipped " + file_info.Name); } else { lstFiles.Items.Add("Converted " + file_info.Name); num_converted++; object filename = file_info.FullName; object confirm_conversions = false; object read_only = true; object add_to_recent_files = false; object format = 0; Word._Document word_doc = word_app.Documents.Open(ref filename, ref confirm_conversions, ref read_only, ref add_to_recent_files, ref missing, ref missing, ref missing, ref missing, ref missing, ref format, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); filename = new_filename; object file_format = Word.WdSaveFormat.wdFormatDocumentDefault; word_doc.SaveAs(ref filename, ref file_format, 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); word_doc.Close(ref save_changes, ref missing, ref missing); } } word_app.Quit(ref save_changes, ref missing, ref missing); int num_skipped = lstFiles.Items.Count - num_converted; MessageBox.Show("Converted " + num_converted.ToString() + " files.\n" + "Skipped " + num_skipped.ToString() + " files.", "Done", MessageBoxButtons.OK, MessageBoxIcon.Information); }
Этот код создает объект приложения Word для работы с Word. Затем он определяет пару переменных, которые он может передать методам Word. Эти методы принимают почти каждый параметр по ссылке (с ключевым словом ref), поэтому значения должны храниться в переменных, которые затем можно передать по ссылке. Переменные должны иметь правильные типы (object), или ссылки не будут работать.
Вероятно, самым важным и запутанным значением является System.Reflection.Missing.Value. Если вы хотите опустить параметр в один из методов Word, вы не можете просто передать null в этот метод. Вместо этого вы должны передать это специальное значение по ссылке.
Создав два значения, код создает объект DirectoryInfo, представляющий каталог, который вы ввели в текстовое поле, и использует его метод GetFiles для перечисления файлов, соответствующих шаблону *. doc в каталоге.
Если расширение файла .docx, программа использует оператор continue, чтобы пропустить файл и продолжить цикл.
Затем код вычисляет имя файла с расширением, установленным в .docx. Если этот файл уже существует, программа добавляет оператор, говорящий, что он пропустил файл в форме ListBox формы. Если файл .docx не существует, программа добавляет сообщение о том, что оно преобразует файл, а затем начинает выполнять настоящую работу.
Затем код вычисляет имя файла с расширением, установленным в .docx. Если этот файл уже существует, программа добавляет оператор, говорящий, что он пропустил файл в форме ListBox формы. Если файл .docx не существует, программа добавляет сообщение о том, что оно преобразует файл, а затем начинает выполнять настоящую работу.
...
После обработки всех файлов программа закрывает сервер приложений Word и отображает сообщение, сообщающее, сколько файлов было преобразовано и пропущено.