Как быстро загрузить содержимое ворд документа в richtextbox?
Имеется следующий код который работает, но загрузка в richtextbox происходит довольно долго (от 5 до 10 секунд). Так же имеется проблема с закрытием этого документа. Ведь даже если закрыть приложение документы которые использовались для чтения не закрываются.
Microsoft.Office.Interop.Word.Application wordObject = new Microsoft.Office.Interop.Word.Application();
object File = @path; //Путь к файлу записанный в переменную
object nullobject = System.Reflection.Missing.Value;
Microsoft.Office.Interop.Word.Application wordobject = new Microsoft.Office.Interop.Word.Application();
wordobject.DisplayAlerts = Microsoft.Office.Interop.Word.WdAlertLevel.wdAlertsNone;
Microsoft.Office.Interop.Word._Document docs = wordObject.Documents.Open(ref File, ref nullobject, ref nullobject, ref nullobject, ref nullobject, ref nullobject, ref nullobject, ref nullobject, ref nullobject, ref nullobject, ref nullobject, ref nullobject, ref nullobject, ref nullobject, ref nullobject, ref nullobject);
docs.ActiveWindow.Selection.WholeStory();
docs.ActiveWindow.Selection.Copy();
richTextBox1.Paste();
docs.Close(ref nullobject, ref nullobject, ref nullobject);
wordObject.Quit(); //По идее здесь документ должен закрываться, но ничего подобного.
Уже недели 2 пытаюсь хоть что то найти, но всё никак. Буду благодарен если поможете решить эту проблему.
Ответы (2 шт):
Попробуйте так, может будет быстрее
private void ButtonOpen_Click(object sender, EventArgs e)
{
if (_openFileDialog.ShowDialog() != DialogResult.OK
|| _openFileDialog.FileName.Length == 0)
return;
//открываем word & document
Microsoft.Office.Interop.Word.Application word
= new Microsoft.Office.Interop.Word.Application();
word.Visible = false;
object miss = System.Reflection.Missing.Value;
object path = _openFileDialog.FileName;
object readOnly = true;
Document document = word.Documents.Open(ref path, ref miss,
ref readOnly, ref miss, ref miss, ref miss, ref miss,
ref miss, ref miss, ref miss, ref miss, ref miss,
ref miss, ref miss, ref miss, ref miss);
//имя и путь ко временному файлу
string tempFile = System.IO.Path.GetTempFileName();
//сохраняем во временный файл в формате RTF
document.SaveAs2(tempFile, Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatRTF);
//закрываем документ и word
document.Close(ref miss, ref miss, ref miss);
document = null;
word.Quit(ref miss, ref miss, ref miss);
word = null;
//загружаем из временного файла данные
_richTextBoxOutput.LoadFile(tempFile);
//удаляем временный файл
System.IO.File.Delete(tempFile);
}
Запуск и закрытие Word - дело не быстрое, даже в автоматическом режиме. Единственное, что я у вас нашел - это то что вы запускаете 2 экземпляра Word, при чем один закрываете, а второй - нет. Обратите внимание на 2 переменные wordObject и wordobject. Как я понял, это опечатка.
Далее, чтобы не "морозить" ваше приложение, пока Word думает, я вынес обработку в отдельный поток. Работает немного быстрее, чем ваш вариант, и в диспетчере больше не остается запущенного ворда. Все закрывается как надо. У меня 2-3 секунды вставка идет.
private async void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
try
{
await Task.Run(() =>
{
object file = @path;
object nullobject = Missing.Value;
Microsoft.Office.Interop.Word.Application wordObject = new Microsoft.Office.Interop.Word.Application
{
DisplayAlerts = Microsoft.Office.Interop.Word.WdAlertLevel.wdAlertsNone
};
Microsoft.Office.Interop.Word._Document docs = wordObject.Documents.Open(ref file, ref nullobject, ref nullobject, ref nullobject, ref nullobject, ref nullobject, ref nullobject, ref nullobject, ref nullobject, ref nullobject, ref nullobject, ref nullobject, ref nullobject, ref nullobject, ref nullobject, ref nullobject);
docs.ActiveWindow.Selection.WholeStory();
docs.ActiveWindow.Selection.Copy();
this.Invoke((Action)(() => richTextBox1.Paste()));
docs.Close(ref nullobject, ref nullobject, ref nullobject);
wordObject.Quit();
});
MessageBox.Show("Done");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
button1.Enabled = true;
}
Через Interop быстрее вряд-ли получится.