Asp.Net線上預覽Word文件的解決方案與思路

暢飲無緒發表於2022-04-25

前幾天有個老專案找到我,有多老呢?比我工作年限都長,見到這個專案我還得叫一聲前輩。

這個專案目前使用非常穩定,十多年了沒怎麼更新過,現在客戶想加一個小功能:線上預覽Word文件

首先想到的是用第三方的服務,例如WPS的開放平臺。

image

剛看完文件,客戶來了句,要一次性的哦,後續再付費的通通不要。

image

得嘞,換其他方案吧。

專案特點

Asp.Net不帶Core.NET Framework 4.0,部署在Windows平臺上。

解決方案

大致思路:先將Word文件轉換Html,再預覽Html

1、Word文件轉Html

先引用OfficeDLL,在COM裡面,注意:電腦需要安裝Office哦。

image

image

又注意:請在DLL屬性裡面將嵌入互操作型別改為False

image

轉換過程一個方法搞定:

using Microsoft.Office.Interop.Word;
public static string WordToHtml(string path)
{
	string root = AppDomain.CurrentDomain.BaseDirectory;
	var htmlName = $"{Guid.NewGuid().ToString("N")}.html";
	var htmlPath = root + $"Resource/Temporary/";
	if (!Directory.Exists(htmlPath))
	{
		Directory.CreateDirectory(htmlPath);
	}

	ApplicationClass word = new ApplicationClass();
	Type wordType = word.GetType();
	Documents docs = word.Documents;
	Type docsType = docs.GetType();
	Document doc = (Document)docsType.InvokeMember("Open", BindingFlags.InvokeMethod, null, docs, new Object[] { (object)path, true, true });
	Type docType = doc.GetType();

	docType.InvokeMember("SaveAs", BindingFlags.InvokeMethod, null, doc, new object[] { (htmlPath + htmlName), WdSaveFormat.wdFormatFilteredHTML });
	docType.InvokeMember("Close", BindingFlags.InvokeMethod, null, doc, null);
	wordType.InvokeMember("Quit", BindingFlags.InvokeMethod, null, word, null);

	return htmlName;
}
2、預覽

上一步WordHtml的方法已經準備就緒,我們再準備這樣一個Word文件。

image

簡單寫一下邏輯:

image

image

是不是特別簡單,我們再看看成品效果。

image

image

這種方案侷限性比較大,部署平臺必須安裝Office,剛好客戶能滿足。

放這裡分享一下,拋磚引玉,如果大家有更好的方案請不吝賜教。

相關文章