首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 操作 Word 將 RichTextBox 內容貼上:剪貼板異常的根因與兩種穩健方案

     編輯:程式設計綜合問答

錯誤分析

代碼使用 `rtxbContent.ClipboardCopy()` (應為 `Copy()`) 後緊接 `_wordRange.Paste()` 報「剪貼板為空」。原因:

  1. 方法名錯誤:`RichTextBox` 無 `ClipboardCopy()` 方法,正確是 `Copy()`。若編譯通過,說明有擴展方法或拼寫錯誤導致未真正複製。
  2. 跨執行緒/進程剪貼板競爭**:WinForms `Copy()` 寫入剪貼板為**異步/延遲渲染**。緊接的 Word COM 自動化 `Paste()` 可能在資料真正寫入剪貼板前執行,讀到空內容。
  3. Word COM 執行緒模型**:Word 在 STA 執行緒,剪貼板操作需在同一 STA 或正確封送。

方案一:避開剪貼板,直接插入 RTF/文字 (推薦、最穩健)

// 1. 獲取 RichTextBox RTF 內容
string rtf = rtxbContent.Rtf; // 包含格式
// 或純文字: string text = rtxbContent.Text;

// 2. 使用 Word Range.InsertFile 或 PasteSpecial (需臨時文件)
// 更簡單: 直接插入格式化文字 (需解析 RTF 或用 ContentControl)
// 此處示範: 存為臨時 .rtf 文件, Word 打開插入
string tempRtf = Path.Combine(Path.GetTempPath(), "rtb_content.rtf");
File.WriteAllText(tempRtf, rtf);

Word.Document doc = app.Documents.Add();
doc.Content.InsertFile(tempRtf); // 保留格式插入
// 後續儲存 docx...
File.Delete(tempRtf);

方案二:修正剪貼板時序 (若必須用 Paste)

rtxbContent.SelectAll();
rtxbContent.Copy(); // 正確方法

// 關鍵: 等待剪貼板數據就緒
Thread.Sleep(100); // 簡單粗暴
// 或更優雅: 使用 Clipboard.GetDataObject() 輪詢檢查
int retries = 10;
while (retries-- > 0 && Clipboard.GetDataObject()?.GetData(DataFormats.Rtf) == null)
    Thread.Sleep(50);

_wordDoc.Activate();
Word.Range range = _wordDoc.Content;
range.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
range.Paste(); // 此時剪貼板已有數據

// 清理
Clipboard.Clear();

核心最佳實踐

  • 優先用檔案中轉 (RTF/HTML/DOCX):避開剪貼板跨進程同步地獄,格式保真度高。
  • 使用 `using` 管理 COM 物件**:`Marshal.ReleaseComObject` 釋放 `Application`, `Document`, `Range`,防記憶體洩漏/Word 殭屍進程。
  • 關閉 Word 時機**:`_wardApp.Quit(SaveChanges: false)` 先關文件再退出應用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved