C # Word SaveAs RPC сервер недоступен - PullRequest
0 голосов
/ 03 января 2019
private void CreateDocument(string date, string name, string phone, string father_name, string address, string village, string post, string taluka, string city, string district, string pincode, string product, int price)
        {
string currentPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
            // Get the Word application object.
            Word._Application word_app = new Word.Application();

                // Make Word visible (optional).
                word_app.Visible = true;

                // Create the Word document.
                object missing = Type.Missing;
                Word._Document word_doc = word_app.Documents.Add(
                    ref missing, ref missing, ref missing, ref missing);

                // Create a header paragraph.
                Word.Paragraph para = word_doc.Paragraphs.Add(ref missing);
                //para.Range.Text = "Chrysanthemum Curve";
                object style_name = "Heading 1";
                para.Range.set_Style(ref style_name);
                para.Range.InsertParagraphAfter();

            // Add more text.
                  para.Range.Text = "";
                para.Range.InsertParagraphAfter();

                // Save the current font and start using Courier New.
                string old_font = para.Range.Font.Name;
                para.Range.Font.Name = "Courier New";

            // Add the equations.
            para.Range.Font.Bold = 1;
            para.Range.Font.Size = 16;
                para.Range.Text = "EXPRESS PARCEL WITH COD" +"\v" + "ADVANCE PAYMENT" + "\v" + "CODE NO 560023100235" + "\v" + "BOOKING AT PBC BG 560046" + "\v" + "COD FOR RS " + price + "/ -" + "\v" + "PLEASE COLLECT CASH " + price + "/-" + "\v" + "(" + NumberToWords(price) + ")" + "\v" + "BILLER 5792" + Environment.NewLine + Environment.NewLine + Environment.NewLine;


                // Start a new paragraph and then
                // switch back to the original font.
                para.Range.InsertParagraphAfter();
            para.Range.Font.Name = "Courier New";
            para.Range.Font.Bold = 1;
            para.Range.Font.Size = 16;
            para.Range.Text = "TO\v" + name + father_name + "\v" + address + "\v" + village + "\v" + post + "\v" + taluka + "\v" + city + "\v" + district + "\v" + "PINCODE-" + pincode + "\v" + "MOBILE-" + phone + Environment.NewLine+Environment.NewLine;


            // Start a new paragraph and then
            // switch back to the original font.
            para.Range.InsertParagraphAfter();
            para.Range.Font.Name = "Times New Roman";
            para.Range.Font.Size = 12;
            para.Range.Text = "FROM" + "\v" + "AVK SHOPPING PVT LTD" + "\v" + "NO U16, BHUVANESHWARINAGAR" + "\v" + "MAGADI ROAD BANGALORE - 23" + Environment.NewLine+Environment.NewLine+ Environment.NewLine+ Environment.NewLine;

            // Start a new paragraph and then
            // switch back to the original font.           para.Range.InsertParagraphAfter();
            para.Range.Font.Name = "Times New Roman";
            para.Range.Font.Size = 12;
            para.Range.Text = "PARCEL CONTAINS" + " (" + product + ") " + "AND  THE PARCEL DO" + "\v" + "NOT CONTAIN ANY DANGEROUS ARTICLE PROHIBITED BY" + "\v" + "POSTAL REGULATIONS";


            Thread.Sleep(10000);
            //if(!(File.Exists(@currentPath + name + date + ".docx")))
            //{

            //}
            //else
            //{
            //    //File.Create(@currentPath + name + date + ".docx");

            //}
            string filename = name + "-" + phone + "-" + ".docx";
            MessageBox.Show(currentPath);
            object ob = @currentPath + filename;
            word_doc.SaveAs2(ref ob);
                MessageBox.Show("Document created successfully !");

            // Close.

            Marshal.ReleaseComObject(word_doc);
            Marshal.ReleaseComObject(word_app);
         }

Приведенный выше код работает хорошо, но иногда при word_doc.SaveAs2(ref ob); ошибка его выдачи Сервер RPC недоступен.(Исключение из HRESULT: 0x800706BA) ' Я уже проверил несколько предложений, но ни одно из них не решило мою проблему с rpc.

Кроме того, после создания файла .docx он открывается автоматически.Я не хочу открывать .docx после того, как он создал файл, потому что мой инструмент создает 100 файлов одновременно.Если откроется каждый документ, мой компьютер будет использовать столько ресурсов.(Просто я хочу сохранить файл без вывода сообщений).

Это windowsforms - vs2017, который я использую.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Когда вы столкнулись с этим исключением, закрыли ли вы документ?Это разрывает связь с Word.Поскольку вы сталкиваетесь с этим время от времени, а не постоянно (и вы заявляете, что не хотите, чтобы документы открывались в первую очередь), я подозреваю, что это именно так.

Для чего это стоит, я бы порекомендовалвообще не использовать Word для автоматизации, а просто использовать zip-файл XML, который напрямую составляет файлы docx.Если вы не хотите явно поддерживать версии Microsoft Word до 2007 года, я не знаю, почему вы не смогли сделать это, учитывая ограничения, которые вы опубликовали.Когда мы осуществили этот переход в 2007 году, для документов, для создания которых через автоматизацию потребовалось 45 минут, потребовалось 15 секунд на одном и том же оборудовании, в основном потому, что объекты автоматизации должны учитывать столько всего, что находится за пределами вашего конкретного варианта использования.

0 голосов
/ 03 января 2019

Если вы неправильно освободите все COM-объекты, сгенерированные в коде, то это может произойти, когда код выполняется более одного раза, не выходя из области видимости.Ошибка указывает на то, что объект Application (RPC-сервер) все еще используется и, следовательно, не может быть создан

Код, например, теряет объект para.Таким образом, para может «блокировать» объект word_app.

При использовании C # также неплохо использовать конкретные объекты вместо точечной нотации, чтобы они также могли быть явно освобождены.(Это также более эффективно.) Например, вместо para.Range.Font

Word.Range paraRange = para.Range;
Word.Font paraFont = paraRange.Font;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...