asp.net 填充word 模版標籤並下載使用筆記

1,新建word模版,方法是找需要用程序填充的word文檔,在需要輸入的地方用"書籤"(插入-->書籤-->輸入id-->ok)標記後保存既可.
2,在word模版上修改安全添加everyone 可讀,以防文件無法打開.
3,在工程裏添加"引用"找到"Microsoft Word 10.0 Object Library"或"Microsoft Word 11.0 Object Library"點確定.
4,新建類叫WordOp.cs 意思是操作word的類.
內容如下:

/////////////////////////////////////////////////////////////////////////////
using System;
using System.Web.Security;
using Microsoft.Office.Interop.Word;
using System.IO;
/// <summary>
/// Word 的摘要說明
/// </summary>
public class WordOp
{
    public WordOp()
{
   //
   // TODO: 在此處添加構造函數邏輯
   //
}
    private ApplicationClass WordApp ;
    private Document WordDoc;
    private static bool isOpened=false;//判斷word模版是否被佔用
    public void SaveAs(string strFileName,bool isReplace)
    {
        if (isReplace && File.Exists(strFileName))
        {
            File.Delete(strFileName);
        }
        object missing = Type.Missing;
        object fileName = strFileName;
        WordDoc.SaveAs(ref fileName, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,
         ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
    }
    //定義一個Word.Application 對象
    public void activeWordApp()
    {
        WordApp = new ApplicationClass();
    }

    public void Quit()
    {
        object missing = System.Reflection.Missing.Value;
        WordApp.Application.Quit(ref missing, ref missing, ref missing);
        isOpened = false;
    }
  
    //基於模版新建Word文件
    public void OpenTempelte(string strTemppath)
    {
        object Missing = Type.Missing;
        //object Missing = System.Reflection.Missing.Value;

        activeWordApp();
        WordApp.Visible = false;

        object oTemplate = (object)strTemppath;
        try
        {
            while (isOpened)
            {
                System.Threading.Thread.Sleep(500);
            }
            WordDoc = WordApp.Documents.Add(ref oTemplate, ref Missing, ref Missing, ref Missing);
            isOpened = true;
            WordDoc.Activate();
        }
        catch (Exception Ex)
        {
            Quit();
            isOpened = false;
            throw new Exception(Ex.Message);
        }


    }
    public void FillLable(string LabelId,string Content)
    {

        //打開Word模版
       // OpenTempelte(tempName);     //對LabelId的標籤進行填充內容Content,即函件題目項
        object bkmC = LabelId;
        if (WordApp.ActiveDocument.Bookmarks.Exists(LabelId) == true)
        {
            WordApp.ActiveDocument.Bookmarks.get_Item(ref bkmC).Select();

        }
        WordApp.Selection.TypeText(Content);
        //SaveAs(saveAsFileName);
        //Quit();

    }
}

/////////////////////////////////////////////////////////////////////////////

5,在需要使用的頁面後臺調用既可,舉例如下:

            string path = Server.MapPath("download");
            string templatePath = path + "";
            WordOp wop = new WordOp();
            wop.OpenTempelte(templatePath);
            wop.FillLable("id", "1");
            wop.FillLable("usr_name", "測試");
            wop.SaveAs(path + ");
            wop.Quit();
            Response.redirect(@"/download/savetest.doc");//做個跳轉用於下載.

說明:此方法需要在安裝office 2003 時添加.net frame1.1 支持,在高級裏面選擇,否則會報找到不Micosoft.Office.Interop.Word 錯誤

 

注意事項:

aspnet使用ms&nbsp;word&nbsp;excel模板問題

 

異常詳細信息: System.UnauthorizedAccessException: 對路徑 F:/xxxx.xls

被拒絕訪問

解決方案一

在需要進行讀寫操作的目錄下添加Network Service這個帳號,

由於在iis 6.0中,默認的應用程序池中的標示用的是Network Service,

所以在進程中是使用Network Service這個帳號運行來運行w3wp.exe進程,

而當我們在運行VS 2003的時候需要對某一個目錄下進行讀寫操作,

看了一下該文件夾,發現沒有Network Service,添加上該賬號,同時選上FULL CONTROL,問題解

訪問word模板權限,不用設置用戶名和密碼

Application當程序運行到這句時出現下面的錯誤:檢索 COM 類工廠中 CLSID 爲

{000209FF-0000-0000-C000-000000000046} 的組件時失敗,原因是出現以下錯誤:

80070005。

3.單擊”安全”選項卡,分別在”啓動和激活權限”和”訪問權限”組中選中”自定義”,然後

自定義->編輯->添加ASP.NET賬戶和IUSER_計算機名。

解決方法二:如果上述方法不能解決問題,就應該是權限問題,請嘗試用下面

的方法:在web.config中使用身份模擬,在節中加入

下用是不使用用戶名和密碼的

解決方法一:

1:在服務器上安裝office的word軟件.

2:在”開始”- >”運行”中輸入dcomcnfg.exe啓動”組件服務”

3:依次雙擊”組件服務”- >”計算機”- >”我的電腦”-

>”DCOM配置”

4:在”DCOM配置”中找到”Microsoft

word應用程序”,在它上面點擊右鍵,然後點擊”屬性”,彈出”Microsoft

word應用程序屬性”對話框

5:點擊”標識”標籤,選擇”交互式用戶”

6:點擊”安全”標籤,在”啓動和激活權限”上點擊”自定義”,然後點擊對應的”編輯”按鈕,在彈出的”安全性”對話框中填加

一個”NETWORK

SERVICE”用戶(注意要選擇本計算機名),並給它賦予”本地啓動”和”本地激活”權限.

7:依然是”安全”標籤,在”訪問權限”上點擊”自定義”,然後點擊”編輯”,在彈出的”安全性”對話框中也填加一個”NETWORK

SERVICE”用戶,然後賦予”本地訪問”權限.

這樣,我們便配置好了相應的word的DCOM權限.

注意:這是在WIN2003上配置的,在2000上,可能是配置ASPNET用戶

由於word是在服務器上打開的,所以應該寫一個把導出數據保存在服務器上,然後再傳遞給客戶端的方法,最後每次調用這個功能的時候再刪除以前在服務器上所生成的所有word

檢索 COM 類工廠中 CLSID 爲 {000209FF-0000-0000-C000-000000000046}

的組件時失敗,原因是出現以下錯誤: 80070005

在CSDN上總是有網友問這個問題,自己也遇到過,因些寫出來供參考:

症狀:

oWordApplic = New Word.Application

當程序運行到這句時出現下面的錯誤:

檢索 COM 類工廠中 CLSID 爲 {000209FF-0000-0000-C000-000000000046}

的組件時失敗,原因是出現以下錯誤: 80070005。

oWordApplic = New Word.Application

當程序運行到這句時出現下面的錯誤:

檢索 COM 類工廠中 CLSID 爲 {000209FF-0000-0000-C000-000000000046}

的組件時失敗,原因是出現以下錯誤: 80070005。

解決方法一:

控制面板-》管理工具-》組件服務-》計算機-》我的電腦-》DCom配置-》找到Microsoft Word文檔

之後

單擊屬性打開此應用程序的屬性對話框。

2. 單擊標識選項卡,然後選擇交互式用戶。

3.單擊”安全”選項卡,分別在”啓動和激活權限”和”訪問權限”組中選中”自定義”,然後

自定義->編輯->添加ASP.NET賬戶和IUSER_計算機名

* 這些帳戶僅在計算機上安裝有 IIS 的情況下才存在。

13. 確保允許每個用戶訪問,然後單擊確定。

14. 單擊確定關閉 DCOMCNFG。

解決方法二:

如果上述方法不能解決問題,就應該是權限問題,請嘗試用下面的方法:

在web.config中使用身份模擬,在

節中加入

1.webconfig文件

2.引用用命名空間:using using Microsoft.Office;

在此之前需要添加引用,右擊項目,添加引用,瀏覽C:Program FilesMicrosoft

OfficeOFFICE11找到excel.exe 確定

3.調用方法

string sql = “select top 20 uid as 用戶編號,username as 用戶名 from

dnt_users”;

ds = SqlHelp.ExecuteDataSet(SqlHelp.sqlCon, CommandType.Text, sql,

null);

ExportToExcel(ds,

Server.MapPath(“excel/”+DateTime.Now.ToString(“yyyyMMddhhssm”)));

4.方法

#region

//從DataSet到出到Excel

///導出指定的Excel文件

public void ExportToExcel(DataSet ds, string

strExcelFileName)

{

if (ds.Tables.Count == 0 || strExcelFileName == “”) return;

doExport(ds, strExcelFileName);

}

///執行導出

private void doExport(DataSet ds, string strExcelFileName)

{

Excel.Application excel1 = new Excel.Application();

int rowIndex = 1;

int colIndex = 0;

excel1.Application.Workbooks.Add(true);

System.Data.DataTable table = ds.Tables[0];

foreach (DataColumn col in table.Columns)

{

colIndex++;

excel1.Cells[1, colIndex] = col.ColumnName;

}

foreach (DataRow row in table.Rows)

{

rowIndex++;

colIndex = 0;

foreach (DataColumn col in table.Columns)

{

colIndex++;

excel1.Cells[rowIndex, colIndex] =

row[col.ColumnName].ToString();

}

}

excel1.Visible = false;

excel1.ActiveWorkbook.SaveAs(strExcelFileName + “.XLS”,

Excel.XlFileFormat.xlExcel9795, null, null, false, false,

Excel.XlSaveAsAccessMode.xlNoChange, null, null, null, null,

null);

excel1.Quit();

excel1 = null;

GC.Collect();//垃圾回收

}

#endregion

5.服務器配置

Retrieving the COM class factory for component with CLSID

{00024500-0000-0000-C000-000000000046} failed due to the following

error: 80070005.

中文翻譯爲:檢索 COM 類工廠中 CLSID 爲 {00024500-0000-0000-C000-000000000046}

的組件時失敗,原因是出現以下錯誤: 80070005

1:在服務器上安裝office的Excel軟件.

2:在”開始”->”運行”中輸入dcomcnfg.exe啓動”組件服務”

3:依次雙擊”組件服務”->”計算機”->”我的電腦”->”DCOM配置”

4:在”DCOM配置”中找到”Microsoft Excel

應用程序”,在它上面點擊右鍵,然後點擊”屬性”,彈出”Microsoft Excel 應用程序屬性”對話框

5:點擊”標識”標籤,選擇”交互式用戶”

6:點擊”安全”標籤,在”啓動和激活權限”上點擊”自定義”,然後點擊對應的”編輯”按鈕,在彈出的”安全性”對話框中填加一個”NETWORK

SERVICE”用戶(注意要選擇本計算機名),並給它賦予”本地啓動”和”本地激活”權限.

7:依然是”安全”標籤,在”訪問權限”上點擊”自定義”,然後點擊”編輯”,在彈出的”安全性”對話框中也填加一個”NETWORK

SERVICE”用戶,然後賦予”本地訪問”權限.

這樣,我們便配置好了相應的Excel的DCOM權限.

注意:我是在WIN2003上配置的,在2000上,可是配置ASPNET用戶

Retrieving the COM class factory for component with CLSID

{00020819-0000-0000-C000-000000000046} failed due to the following

error: 80040154

1.運行dcomcnfg打開組件服務,

2.依次展開”組件服務”->”計算機”->”我的電腦”->”DCOM配置”

3.找到”Microsoft Excel應用程序”或”Microsoft Word應用程序”,

4.右鍵打開屬性對話框,點擊”標識”選項卡,

5.點”下列用戶”,把管理員的用戶密碼正確填寫進去…

6.點擊”安全”選項卡,

7.依次把”啓動和激活權限”,”訪問權限”,”配置權限”,都選擇爲自定義,

8.然後依次點擊它們的編輯,把everyone(或者User)添加進去,並加入所有的權限…

檢索 COM 類工廠中 CLSID 爲 {00024500-0000-0000-C000-000000000046}

的組件時失敗,原因是出現以下錯誤: 8000401a。

注意錯誤類別,需要你手工登錄服務器就是接顯示器,接鍵盤,一般放在機房可能不能這樣解決了

可以使用下面這樣樣子解決,記得登錄後不要註銷。

在 Microsoft Windows Server 2003 年請登錄到 Console0 上使用 / 控制檯

開關來解決此問題。若要這樣做,請按照下列步驟操作:

1.單擊 開始,單擊 運行,鍵入 mstsc /console,然後單擊確定。

2.登錄到計算機上。

 

 

 

發佈了4 篇原創文章 · 獲贊 15 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章