Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.03.2018, 10:26   #1
fanat_96
Пользователь
 
Регистрация: 09.04.2016
Сообщений: 81
По умолчанию Ошибка Сервер RPC недоступен при повторном обращении к Word

Здравствуйте. Есть код, который из DataTable и полей формы создает вордовский документ на основе определенного шаблона. Но почему-то после повторного нажатия на кнопку сохранения вылетает ошибка "Сервер RPC недоступен. (Исключение из HRESULT: 0x800706BA)" на строчке кода:
Код:
document = application.Documents.Add(ref templatePathObj, ref missingObj, ref missingObj, ref missingObj);
Некоторые переменные пришлось объявить глобально, т.к. они почему-то не распознавались в блоке try-catch, если объявлять их локально. Полный код функции:

Код:
DataTable dt_fasad = new DataTable();

Word._Document document;
Word._Application application = new Word.Application();
Object trueObj = true;
Object falseObj = false;
object missingObj = Missing.Value;
object templatePathObj;

private void button2_Click(object sender, EventArgs e)
{
    
    try
    {
        string documentpath = Application.StartupPath.ToString() + "\\act.docx";
        missingObj = Missing.Value;
        templatePathObj = documentpath;
        document = application.Documents.Add(ref templatePathObj, ref missingObj, ref missingObj, ref missingObj);

        
        object bookmarkObj_fio = "z1";
        object bookmarkObj_fioCopy = "z3";
        object bookmarkObj_unp = "z2";
        object bookmarkObj_adres = "z4";
        object bookmarkObj_rs = "z6";
        object bookmarkObj_sum = "z7";
        object bookmarkObj_data = "zData";

        Word.Range bookmarkRange_fio = document.Bookmarks.get_Item(ref bookmarkObj_fio).Range;
        Word.Range bookmarkRange_fioCopy = document.Bookmarks.get_Item(ref bookmarkObj_fioCopy).Range;
        Word.Range bookmarkRange_unp = document.Bookmarks.get_Item(ref bookmarkObj_unp).Range;
        Word.Range bookmarkRange_adres = document.Bookmarks.get_Item(ref bookmarkObj_adres).Range;
        Word.Range bookmarkRange_rs = document.Bookmarks.get_Item(ref bookmarkObj_rs).Range;
        Word.Range bookmarkRange_sum = document.Bookmarks.get_Item(ref bookmarkObj_sum).Range;
        Word.Range bookmarkRange_data = document.Bookmarks.get_Item(ref bookmarkObj_data).Range;

       
        bookmarkRange_fio.Text = textBox2.Text;
        bookmarkRange_unp.Text = textBox3.Text;
        bookmarkRange_fioCopy.Text = textBox2.Text;
        bookmarkRange_fioCopy.Bold = 1;
        bookmarkRange_adres.Text = textBox5.Text;
        bookmarkRange_rs.Text = textBox4.Text;
        bookmarkRange_data.Text = DateTime.Today.ToString("dd.MM.yyyy");

        double summ = 0;
        
        var dtres = dt_fasad.AsEnumerable()
           .GroupBy(t => new
           {
               Id = t.Field<int>("Картридж")
           })
           .Select(g => new
           {
               g.Key.Id,
               Value = String.Join(", ", g.Select(i => i.Field<string>("Проведенные_работы")))
           }).ToList();

        var sumres = dt_fasad.AsEnumerable()
           .GroupBy(t => new
           {
               Id = t.Field<int>("Картридж")
           })
           .Select(g => new
           {
               g.Key.Id,
               Value = g.Sum(s => (s.Field<double>("Общая_цена")))
           }).ToList();

        var res2 =
            from r in dt_fasad.AsEnumerable()
            group r by r["Марка"] into g
            select new
            {
                p = g.Key
            };

        
        int ik = 2;
        int ir = 2;
        Word.Table _table = document.Tables[1]; 
        _table.AllowAutoFit = true;

        foreach (var zap in dtres)
        {
            _table.Rows.Add(ref missingObj);
            Word.Range _currentRange = _table.Cell(ik, 3).Range;
            Word.Range _currentRangeNumb = _table.Cell(ik, 1).Range;
            Word.Range _currentRangeId = _table.Cell(ik, 2).Range;

            _currentRange.Text = zap.Value.ToString();
            _currentRangeNumb.Text = Convert.ToString(ik - 1);
            _currentRangeId.Text = zap.Id.ToString();
            _table.Rows[ik].SetHeight(35, Word.WdRowHeightRule.wdRowHeightAuto);
            ik++;
        }

        foreach (var sumchik in sumres)
        {
            Word.Range _currentRangeCena = _table.Cell(ir, 4).Range;
            Word.Range _currentRangeCenaNoNDS = _table.Cell(ir, 5).Range;
            Word.Range _currentRangeNDS = _table.Cell(ir, 6).Range;
            Word.Range _currentRangeSummaNDS = _table.Cell(ir, 7).Range;
            Word.Range _currentRangeCenaNDS = _table.Cell(ir, 8).Range;

            _currentRangeCena.Text = Math.Round(sumchik.Value, 2).ToString();
            _currentRangeCenaNoNDS.Text = Math.Round(sumchik.Value, 2).ToString();
            summ += Math.Round(sumchik.Value, 2);
            _currentRangeNDS.Text = "Без НДС";
            _currentRangeSummaNDS.Text = "-";
            _currentRangeCenaNDS.Text = Math.Round(sumchik.Value, 2).ToString();
            ir++;

        }
        _table.Rows.Add(ref missingObj);
        _table.Rows[ik].Height = 15;
        _table.Columns[1].SetWidth(25, Word.WdRulerStyle.wdAdjustProportional);
        _table.Columns[2].SetWidth(40, Word.WdRulerStyle.wdAdjustProportional);
        _table.Columns[3].SetWidth(200, Word.WdRulerStyle.wdAdjustProportional);
        _table.Columns[4].SetWidth(30, Word.WdRulerStyle.wdAdjustProportional);
        _table.Columns[5].SetWidth(55, Word.WdRulerStyle.wdAdjustProportional);

        _table.Rows[ik].Cells[2].Merge(_table.Rows[ik].Cells[3]);

        Word.Range _currentObsh = _table.Cell(ik, 2).Range;
        Word.Range _currentCenaObs = _table.Cell(ik, 3).Range;
        Word.Range _currentCenaNoNDS = _table.Cell(ik, 4).Range;
        Word.Range _currentNDSProc = _table.Cell(ik, 5).Range;
        Word.Range _currentSumNDS = _table.Cell(ik, 6).Range;
        Word.Range _currentSOBSHSUm = _table.Cell(ik, 7).Range;

        _currentObsh.Text = "Итого";
        _currentObsh.Bold = 1;

        _currentCenaObs.Text = Math.Round(summ, 2).ToString();
        _currentCenaNoNDS.Text = Math.Round(summ, 2).ToString();
        _currentNDSProc.Text = "x";
        _currentSumNDS.Text = "-";
        _currentSOBSHSUm.Text = Math.Round(summ, 2).ToString();

        bookmarkRange_sum.Text = RusCurrency.Str(summ, "BYN");
        bookmarkRange_sum.Bold = 1;

    
        SaveFileDialog saveFileDialog1 = new SaveFileDialog();
        saveFileDialog1.FileName = "act_na_pechat";
        saveFileDialog1.DefaultExt = ".docx";
        saveFileDialog1.Filter = "Word Documents|*.docx";
        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
            document.SaveAs(saveFileDialog1.FileName, ref missingObj, ref missingObj, ref missingObj, ref missingObj, ref missingObj,
        ref missingObj, ref missingObj, ref missingObj, ref missingObj, ref missingObj,
        ref missingObj, ref missingObj, ref missingObj, ref missingObj, ref missingObj);
        }
        document.Close(Word.WdSaveOptions.wdDoNotSaveChanges);
        application.Quit();
    }
    catch (Exception ex)
    {
        MessageBox.Show("Текст ошибки: "+ ex.Message);
        document.Close(ref falseObj, ref missingObj, ref missingObj);
        application.Quit(ref missingObj, ref missingObj, ref missingObj);
        document = null;
        application = null;
    }
}
Подскажите, пожалуйста, где я мог допустить ошибку. Первый раз работаю с word и по коду должно быть понятно, что нахватался всего по чуть-чуть где только возможно)
fanat_96 вне форума Ответить с цитированием
Старый 02.03.2018, 11:23   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от fanat_96 Посмотреть сообщение
Некоторые переменные пришлось объявить глобально
Вот тут Вас засада и подстерегла. Вы объявляете объект глобально и тут же его создаёте. Один раз. А при нажатии на кнопку - закрываете и убиваете.
Black Fregat вне форума Ответить с цитированием
Старый 02.03.2018, 11:30   #3
fanat_96
Пользователь
 
Регистрация: 09.04.2016
Сообщений: 81
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Вот тут Вас засада и подстерегла. Вы объявляете объект глобально и тут же его создаёте. Один раз. А при нажатии на кнопку - закрываете и убиваете.
А как мне тогда лучше объекты раскидать? Просто если во время печати акта вылетит какая ошибка, то может случиться так, что word будет висеть открытым, в чем я убедился уже разок, когда открыл диспетчер, а там порядка 10 его экземпляров запущено. А так перехват ошибки в catch позволяет его наверняка закрыть.
если переменную document перекинуть внутрь try, то в catch ее не видно.
fanat_96 вне форума Ответить с цитированием
Старый 02.03.2018, 12:40   #4
fanat_96
Пользователь
 
Регистрация: 09.04.2016
Сообщений: 81
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Один раз
я правильно понимаю, что можно
Код:
Word._Application application = new Word.Application();
заменить на
Код:
Word._Application application;
а в блоке try добавить:
Код:
application = new Word.Application();
Вроде как работает, но не уверен, что именно так нужно)
fanat_96 вне форума Ответить с цитированием
Старый 02.03.2018, 12:49   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от fanat_96 Посмотреть сообщение
Есть код, который из DataTable и полей формы создает вордовский документ на основе определенного шаблона
Возьмите библиотеку для формата 2007+ офиса (docx) и не парьтесь с COM и запуском целого офиса.

Например https://github.com/xceedsoftware/DocX
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 02.03.2018 в 12:55.
Alex11223 вне форума Ответить с цитированием
Старый 02.03.2018, 12:50   #6
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от fanat_96 Посмотреть сообщение
Вроде как работает
И прекрасно
Black Fregat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при повторном вызове хранимой процедуры. dimorik PHP 12 10.11.2013 21:40
Ошибка при повторном Insert после CancelUpdates Romowski БД в Delphi 12 06.02.2013 14:44
Delphi. Программа взаимодействия с MS Word выдаёт ошибку "сервер RPC недоступен" CAID Помощь студентам 0 20.04.2011 13:11
Как это устранить? ..Win32 Error. Code: 1722. Сервер RPC недоступен viktor982 Общие вопросы Delphi 2 21.11.2009 20:44
Сервер RPC недоступен malevich Работа с сетью в Delphi 3 29.02.2008 20:49