簡體   English   中英

在C#asp.net中編輯Word文檔

[英]editing word document in c# asp.net

我正在編輯一個單詞模板,然后將其保存在Web服務器上。 為此,我正在使用Interop.Word (我知道這很糟糕,但仍然...)

我已經在服務器上安裝了MS Word

這是我的代碼:

object fileName;
object saveAs;
fileName = Server.MapPath("~\\tempOutputs\\Template - Filled with Registration Data.docx");

try
{
object missing = System.Reflection.Missing.Value;
Word.Application wordApp =  new Word.Application();
Word.Document aDoc = null;
if (File.Exists((string)fileName))
{
    object readOnly = false;
    object isVisible = false;
    wordApp.Visible = false;

    aDoc = wordApp.Documents.Open(ref fileName, ref missing,
    ref readOnly, ref missing, ref missing, ref missing,
    ref missing, ref missing, ref missing, ref missing,
    ref missing, ref isVisible, ref missing, ref missing,
    ref missing, ref missing);

    aDoc.Activate(); //Error Line

我在aDoc.Activate()語句上遇到錯誤,因為object reference not set to an instance 但在我的系統上有效

有什么建議么 ?

編輯

我已經使用上面的代碼編寫了一個控制台應用程序,並在完美運行的服務器上運行它,為什么不以Web應用程序的形式在IIS上運行呢?

我很早以前就使用了VSTO,可能是7或8年前,但是沒有在服務器端使用過。這讓我很痛苦,因為進程卡住,內存泄漏和奇怪的問題使我的代碼無法正常工作(例如您的代碼)。 解決方案是OS語言和安裝的Office語言不匹配。 因此,您應該檢查並檢查您的代碼區域性信息:

Thread.CurrentThread.CurrentUICulture;
Thread.CurrentThread.CurrentCulture;

如果您真的需要VSTO(我看不到為什么?)檢查語言,請安裝Office Language Pack,依此類推...但是我也建議您使用其他工具。

整個方法是錯誤的。僅應使用開放式xml或從根本上設計用於多線程方案的類似框架來在服務器端處理word文檔。

盡管您不應該這樣做的原因是眾多的(有關信息,請參見http://support.microsoft.com/kb/257757 ),但是您的代碼運行者可能會遇到問題。

您的網絡服務器以什么身份運行? 當以交互方式運行(即使用Visual Studio等進行調試)時,您將以當前登錄的用戶身份運行,而在您的服務器上將以運行Web服務器的應用程序池(例如ApplicationPoolIdentity)的身份運行

在服務器端運行Word Interop主要是正確設置應用程序池使用的用戶帳戶(例如,webuser)的權限的問題。

  • 對相應文件夾的讀/寫訪問
  • 實際使用webuser帳戶登錄服務器並啟動Word; 后記斷開連接; 不要注銷!
  • 將webuser添加到“分布式COM用戶”的用戶組中
  • 打開組件服務管理並打開MyComputer上的屬性; 在COM安全性中,為用戶提供本地啟動和本地激活權限(應該是多余的,但可以)
  • 打開mmc(如果是32位字,則使用“ -32”),然后選擇“文件”->“添加/刪除管理單元”; 選擇左側的組件服務,然后單擊添加,然后單擊確定; 在計算機/我的計算機下搜索“ Microsoft Word 97-2003文檔”並打開屬性; 以身份輸入用戶; 在安全性下添加用戶(如果尚未添加)並授予他們適當的權限

那應該按設置進行。 話雖這么說,服務器端單詞互操作在后面仍然很痛苦。 現在,它已經可以在生產服務器上運行2年了,但是並不是沒有問題。 即使我在測試服務器上運行的所有負載測試,我仍然都不相信它確實沒有內存泄漏。 我們僅使用它,因為我們需要docx到pdf轉換,並且我們測試的所有庫都無法正常運行,性能不佳或也使用word interop。 它作為離散的Windows服務運行,需要花費大量時間進行崩潰恢復等。我從不使用它來編輯文檔。 這就是OpenXML SDK的目的。

順便說一句:如果您的代碼最終沒有被finally塊弄得一團糟,那肯定是在內存泄漏中建立。 另外,您需要在使用的文檔,應用程序的Documents屬性和應用程序本身上調用Marshal.FinalReleaseComObject

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM