日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

.net直接调用office com组件操作word与pdf

發布時間:2024/1/1 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .net直接调用office com组件操作word与pdf 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 使用場景
  • 一、使用步驟
    • 1.引入庫
    • 2.調用
  • 二、我使用時出現的bug
    • 錯誤信息一
    • 原因及解決方案
    • 錯誤信息二
    • 原因及解決方案
    • 錯誤信息三
    • 原因及解決方案
  • 三、總結


使用場景

多個word進行合并;word轉pdf;
1,此方法只支持.net framework框架;
2,但恰恰我的項目是netcore的,所以需要在項目中添加引入一個net framework的項目,在源項目中引用framework項目,最終在framework項目中進行對com組件進行調用處理;

一、使用步驟

1.引入庫

第一步:創建netFramework項目
在項目中 右鍵----添加----新建項目----創建一個netFramework的web項目
(也可以下載我寫的,直接添加現有項目即可,資源下載地址)
第二步:添加引用
右鍵引用----添加引用----點擊COM----找到 Microsoft Word 14.0 Object Library選中確認添加即可(找不到的話,從nuget上面下載安裝也可,已實測)
第三步:創建類文件(此處我只用到了合并word以及word轉pdf,其他代碼不放了,網上可以搜到)
代碼如下(示例):

using System.Collections.Generic; using System.IO; using Microsoft.Office.Interop.Word; using System; using System.Linq; using System.Reflection; using System.Web;namespace NetFrameworkProject {public class WordClass{Application objApp = null;Document objDocLast = null;Document objDocBeforeLast = null;public WordClass(){objApp = new Application();}#region 打開文件public void Open(string tempDoc){object objTempDoc = tempDoc;object objMissing = System.Reflection.Missing.Value;objApp = new Application();objDocLast = objApp.Documents.Open(ref objTempDoc, //FileName ref objMissing, //ConfirmVersions ref objMissing, //ReadOnly ref objMissing, //AddToRecentFiles ref objMissing, //PasswordDocument ref objMissing, //PasswordTemplate ref objMissing, //Revert ref objMissing, //WritePasswordDocument ref objMissing, //WritePasswordTemplate ref objMissing, //Format ref objMissing, //Enconding ref objMissing, //Visible ref objMissing, //OpenAndRepair ref objMissing, //DocumentDirection ref objMissing, //NoEncodingDialog ref objMissing //XMLTransform );objDocLast.Activate();}#endregionpublic void SaveAs(string outDoc){object objMissing = System.Reflection.Missing.Value;object objOutDoc = outDoc;objDocLast.SaveAs(ref objOutDoc, //FileName ref objMissing, //FileFormat ref objMissing, //LockComments ref objMissing, //PassWord ref objMissing, //AddToRecentFiles ref objMissing, //WritePassword ref objMissing, //ReadOnlyRecommended ref objMissing, //EmbedTrueTypeFonts ref objMissing, //SaveNativePictureFormat ref objMissing, //SaveFormsData ref objMissing, //SaveAsAOCELetter, ref objMissing, //Encoding ref objMissing, //InsertLineBreaks ref objMissing, //AllowSubstitutions ref objMissing, //LineEnding ref objMissing //AddBiDiMarks );}/// <summary> /// 循環合并多個文件(插入合并文件) /// </summary> /// <param name="tempDoc">模板文件</param> /// <param name="arrCopies">需要合并的文件</param> /// <param name="outDoc">合并后的輸出文件</param> public void InsertMerge(string tempDoc, List<string> arrCopies, string outDoc){object objMissing = Missing.Value;object objFalse = false;object confirmConversion = false;object link = false;object attachment = false;try{//打開模板文件 Open(tempDoc);foreach (string strCopy in arrCopies){objApp.Selection.InsertFile(strCopy,ref objMissing,ref confirmConversion,ref link,ref attachment);}//保存到輸出文件 SaveAs(outDoc);foreach (Microsoft.Office.Interop.Word.Document objDocument in objApp.Documents){objDocument.Close(ref objFalse, //SaveChanges ref objMissing, //OriginalFormat ref objMissing //RouteDocument );}}finally{objApp.Quit(ref objMissing, //SaveChanges ref objMissing, //OriginalFormat ref objMissing //RoutDocument );objApp = null;}}/// <summary>/// 將word轉換成pdf/// </summary>/// <param name="sourcePath"></param>/// <param name="targetPath"></param>/// <returns></returns>public bool WordToPDF(string sourcePath, string targetPath){bool result = false;Microsoft.Office.Interop.Word.Application application = new Microsoft.Office.Interop.Word.Application();Microsoft.Office.Interop.Word.Document document = null;try{application.Visible = false;document = application.Documents.Open(sourcePath);document.ExportAsFixedFormat(targetPath, WdExportFormat.wdExportFormatPDF);result = true;}catch (Exception e){Console.WriteLine(e.Message);result = false;}finally{document.Close();}return result;}} }

第四步:添加項目引用(net framework框架可忽略此步)
在實際用的地方,將新建的項目引用進去;

到這里就準備就緒了,進入調用環節;

2.調用

代碼如下(示例):

public void netFrameWorkDemo(){//指定目錄string path = @"E:\codeSource\WEBCORE\wwwroot\UploadFile\1\2021-03-01\";//輸出文檔時會自動創建string outDoc = path+"all.docx";//模版word只需要指定一個空word即可,必須要用,不然后面open方法會報錯,可根據需要自動生成string tempDoc = path+"tempDoc.docx";string ttt = path + "問題匯總.docx";string ttt2 = path + "問題匯總2.docx";//合并wordList<string> arrCopies = new List<string>();arrCopies.Add(ttt);arrCopies.Add(ttt2);WordClass wc = new WordClass();wc.InsertMerge(tempDoc, arrCopies, outDoc);//word轉成pdfstring tttpdf = path + "ttt.pdf";//指定輸出的文件名string ttt2pdf = path + "ttt2.pdf";//指定輸出的文件名wc.WordToPDF(ttt, tttpdf); wc.WordToPDF(ttt2, ttt2pdf);}

二、我使用時出現的bug

錯誤信息一

無法將類型為“Microsoft.Office.Interop.Excel.ApplicationClass”的 COM 對象強制轉換為接口類型“Microsoft.Office.Interop.Excel._Application”。此操作失敗的原因是對 IID 為“{000208D5-0000-0000-C000-000000000046}”的接口的 COM 組件調用 QueryInterface 因以下錯誤而失敗: 加載類型庫/DLL 時出錯。 (異常來自 HRESULT:0x80029C4A (TYPE_E_CANTLOADLIBRARY))。

原因及解決方案

網上搜了很多方法,有很多說法,又是注冊表又是重裝office的,每人情況都不一定一樣,我的是因為之前裝了wps又卸載了,重新把wps裝上就好了,網上說必須用wps自帶的卸載才行(沒試過,有試過的可以留言共享下)。

錯誤信息二

Retrieving the COM class factory for component with CLSID {000209FF-0000-0000-C000-000000000046} failed due to the following error: 80070005 拒絕訪問。 (0x80070005 (E_ACCESSDENIED)).

原因及解決方案

第一:這個主要是64位系統的問題,word是32位的組件,所以在正常的系統組件服務里是看不到的(找不到CLSID為000209FF-0000-0000-C000-000000000046),可以通過在運行里面輸入 comexp.msc -32 來打開32位的組件服務,在里就能看到excel組件了
第二:只要修改IIS的應用程序池,選擇你的項目,點擊高級設置,標識改為:LocalSystem 或NetworkServer;

錯誤信息三

word轉pdf時報錯 Object reference not set to an instance of an object( 對象引用未設置為對象的實例 )

原因及解決方案

原因是文件夾沒有IIS_USERS的權限。給項目文件夾附上權限即可。


三、總結

這種方法是免費的,缺點還是挺明顯的,就是速度很慢,我測試了一個190頁的word轉成pdf大約月要35秒; 收費的可以使用下 Aspose.word與Aspose.pdf;

總結

以上是生活随笔為你收集整理的.net直接调用office com组件操作word与pdf的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。