• Привет, Гость!
  • Войти
  • Регистрация
  • Записи
  • Форумы
  • Люди
  • Файлы
  • Работа
  • Технологии

COMExeption при копипэйсте в Word, С#

Все форумы  Поиск  Правила  Помощь 
 Активные темы  Темы без ответов
Привет, гость! Войти
Форумы GotDotNet.Ru » Office System » COMExeption при копипэйсте в Word, С#
Страницы: 1
RSS
COMExeption при копипэйсте в Word, С#, Ошибка при копировании содержимого одного документа в другой
dragon24
Сообщений: 4 Регистрация: 06.07.2009
#1
31.01.2010 22:34
Доброго времени суток всем.
Моя задача состоит в том, чтобы сформировать программно несколько различных документов ("маленькие документы") и потом их объединить в один большой. Я сначала создаю один большой документ, потом по одному маленькому (создала, скопипэйстила в большой, убила). Вроде бы логично, чтобы в памяти не висело 10 документов, которые надо потом склеить, я по одному добавляю.
Но при этом возникает ошибка:
"Метод или свойство недоступны, поскольку буфер обмена пуст или содержит неверные данные.", на функции PasteAndFormat(). При этом вставка содержимого маленького документа производится со всем форматированием, в определённое место в большом документе: в закладку. Код:
WordApp = new ApplicationClass();
//Создание нового большого документа на основе шаблона
object template = "C:\\TEMP\\myTemplate.dotx";
Document bigDoc = WordApp.Documents.Add(ref template, ref missing, ref missing, ref missing);
...
//Создание многих маленьких
foreach (var item in collection)
	{
        //Создаю маленький документ
        Document smallDoc =  WordApp.Documents.Add(ref template, ref missing, ref missing, ref missing);
        //Формирую программно содержимое документа
        ...
        //Копипэйст в большой документ
        if (Doc.Bookmarks.Exists((string)bmkName))
            {
                var range = Doc.Bookmarks.get_Item(ref bmkName).Range;
                if(range==null) continue;
                newDoc.Content.Copy();//Копирую содержимое маленького документа в clipboard
                range.PasteAndFormat(WdRecoveryType.wdFormatOriginalFormatting);//Вставляю в большой документ
                object start = range.Start;
                object end = range.Start;
                object newRange = Doc.Range(ref start, ref end);
                Doc.Bookmarks.Add((string)bmkName, ref newRange);//Пересоздаю букмарк для последующей вставки
            }
            object s = WdSaveOptions.wdDoNotSaveChanges;
            newDoc.Application.Quit(ref s, ref missing, ref missing);//Закрываю маленький документ и его app
	}

При этом если в маленьком документе только немножко текста, то всё ОК, но если картика и много надписей (сложный документ), то выкидывает ошибку.
Плиз, нужен совет как исправить.
 
 
dragon24
Сообщений: 4 Регистрация: 06.07.2009
#2
31.01.2010 22:41
Код конечно там немного сложнее, разнесён на несколько функций и пр., но дело не в этом.
Скорее всего, из буфера обмена не успевает скопироваться всё, а я уже убила процесс, где были нужные данные. Раньше был код, который работал медленнее, и всё было в порядке, проблемы начались когда оптимизнула и мой код начал работать быстрее, но копирование и вставка не успевают теперь.
Может кто подскажет как поступить? Не хочется искусственно замедлять типа Thread.Sleep(), чтобы буфер обмена успевал всё сделать. =)
 
 
Kreol
Сообщений: 53 Регистрация: 15.03.2007
#3
02.02.2010 17:42
Цитата
dragon24:
:) ну как вариант, если с маленькими все хорошо, то разбивай документ на пополам и вставляй частями. Может так будет работать, хотя тогда в оптимизации не было смысла, вииграв 10 сек. потеряла контроль над процессом.
 
 
Kreol
Сообщений: 53 Регистрация: 15.03.2007
#4
02.02.2010 17:58
по сути оптимизация в основном тутсует код и убирает ненужные переменные, глобальными они не стают,
однако могут внутренние переменные просто исчезнуть, если оптимизатор так посчитает нужным.
чтобы этого не происходило нужные тебе переменные объявляешь как
volatile
ну и тип конечно не забудь.
например
voaltile int xyz

посмотри гугль тынць
И еще раз говорю посиди в отладчике :)
 
 
Kreol
Сообщений: 53 Регистрация: 15.03.2007
#5
02.02.2010 18:14
К.... :) Значит еще пару советов. 1 проверяй данные в буфере на совместимость раз.
проверь переполнение массивов и переменных. Скорее всего проблема в этом.
Цитата
может за конец массива гдето доступ происходит
или переполнение переменной

Цитата
у тебя счетчик допустим итн а ты в него лонг зафигачил
тоже частенько у мня бывает
скажи пусть все пременные на диапазоны проверит
нет ли переполнения
седня токо с таким ипался
пока инт - все нормально
как токо стало больше - все
а потому что результат операции не привел к нужному
а он приводил по умолчанию к лонг

Также проверь размер буфера. У тебя например на машине стоит 2гига оператвы а на другой гиг.
Возможно он не фиксированный.
 
 
 
Страницы: 1
Форумы GotDotNet.Ru » Office System » COMExeption при копипэйсте в Word, С#
О сайте   Свяжитесь с нами   Конфиденциальность   Версия для печати
Работает на 1С-Битрикс: Управление сайтом ASP.NET  |  Хостинг на Parking.Ru