【问题标题】:C# Word SaveAs RPC server is unavailableC# Word SaveAs RPC 服务器不可用
【发布时间】:2019-01-04 10:37:40
【问题描述】:
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);its 给出错误 RPC 服务器不可用。 (HRESULT 例外:0x800706BA)' 我已经检查了一些建议,但没有一个解决了我的 rpc 问题。

一旦创建 .docx 文件,它就会自动打开。我不想在创建文件后打开 .docx,因为我的工具一次创建 100 个文件。如果每个文档都打开,我的电脑将使用这么多资源。 (只是我想静默保存文件)。

这是我正在使用的 windowsforms - vs2017。

【问题讨论】:

  • 请花点时间查看有关在help center 中提问的网站规则。只允许一个问题/问题。在 问题中提出您的第二个问题。请检查您是否正确标记它 - 阅读有关标记用途的标记信息。
  • 这段代码运行的上下文是什么? WPF?窗体?网络项目?
  • 是windows窗体。

标签: c# ms-word


【解决方案1】:

如果您没有正确释放代码中生成的所有 COM 对象,那么当代码多次执行而没有超出范围时,就会发生这种情况。该错误表示Application对象(RPC Server)仍在使用中,因此无法实例化

例如,代码孤立对象para。所以para 可以“阻止”word_app 对象。

在使用 C# 时,使用特定对象而不是点表示法也是一个好主意,这样它们也可以被显式释放。 (它也更有效。)例如,而不是para.Range.Font

Word.Range paraRange = para.Range;
Word.Font paraFont = paraRange.Font;

【讨论】:

  • 我试过你的建议还是同样的问题。也试过 Close(ref save_changes, ref missing, ref missing);和 .quick 函数仍然是同样的问题。
【解决方案2】:

当你遇到这个异常时,你关闭了文档吗?这将切断与 Word 的连接。由于您偶尔而不是经常遇到这种情况(并且您声明您不希望文档首先打开)我怀疑是这种情况。

对于它的价值,我建议根本不使用 Word 自动化,而只使用直接组成 docx 文件的压缩 XML。除非您必须明确支持 Microsoft Word 2007 之前的版本,否则鉴于您发布的限制,我不知道您为什么不能这样做。当我们在 2007 年进行这种转变时,需要 45 分钟才能通过自动化创建的文档在同一硬件上需要 15 秒,这主要是因为自动化对象必须考虑您特定用例之外的许多事情。

【讨论】:

  • 无论文档是打开还是关闭,与Word的连接都不会被切断。查看代码,很明显文档没有关闭,Word 应用程序也没有退出。就可见性而言,结果是 Word 应用程序打开且文档可见。 Marshal.ReleaseComObject 是切断连接的原因 - 但并非所有 COM 对象都被释放。
猜你喜欢
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
相关资源
最近更新 更多