[英]C# Word SaveAs RPC server is unavailable
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。
如果您沒有正確釋放代碼中生成的所有COM對象,則在不超出范圍的情況下執行代碼多次時可能會發生這種情況。 該錯誤表明Application
對象(RPC服務器)仍在使用中,因此無法實例化
例如,代碼使對象para
孤。 因此para
可以“阻止” word_app
對象。
使用C#時,最好使用特定的對象而不是點號,以便也可以顯式地釋放它們。 (它也更有效。)例如,代替para.Range.Font
Word.Range paraRange = para.Range;
Word.Font paraFont = paraRange.Font;
遇到此異常時,您是否關閉了文檔? 這將切斷與Word的連接。 由於您偶爾會遇到這種情況,而不是始終如一地遇到這種情況(並且您聲明首先不希望打開文檔),我懷疑是這種情況。
對於它的價值,我建議完全不要使用Word自動化,而應該使用直接構成docx文件的壓縮XML。 除非您必須明確支持2007年之前的Microsoft Word版本,否則由於發布的限制,我不知道為什么您不能這樣做。 當我們在2007年進行過渡時,在同一硬件上通過自動化創建需要45分鍾的文檔花費了15秒,這在很大程度上是因為自動化對象必須考慮您特定用例之外的許多事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.