a.可以使用office組件或aspose將word 和excel 轉(zhuǎn)換為pdf 然后在網(wǎng)頁上打開pdf,但是效果不是很好
.比如說excel 多個工作薄不是按exce 格式顯示出來,寬度大小,不好控制(?).
b.可以使用office組件或aspose將文檔轉(zhuǎn)換為html,但是轉(zhuǎn)換為html 會產(chǎn)生額外的xml和CSS和圖片文件.(當(dāng)文件保存到服務(wù)器其他盤符中,
文件流讀取html,只好訪問html頁面,其他html附帶的 css和圖片和xml,無權(quán)限訪問,文件流也不好同時讀取他們幾個(?).
c.可以使用其他轉(zhuǎn)換,比如http://www.cutepdf.com/(?),或者用文件流讀取再轉(zhuǎn)換(沒試過)
d.最好將文件轉(zhuǎn)換為Mhtml格式的,這是因為Mhtml是個單個網(wǎng)頁文件.(主要是便于文件流讀取放在本地的文件)
Mhtml稱為聚合html文檔web文檔或單一文件網(wǎng)頁應(yīng)用于(asscss,word,excel)是單個網(wǎng)頁 文件可將網(wǎng)站所有元素(包括聲音,圖片)保存到單個mhtml文件中.
2.對于項目而言如何上傳文件,文件上傳到哪兒,如何保存這些上傳文件
a.可以將文件上傳到asp.net項目當(dāng)中,但是據(jù)說項目越來越大影響后期運行效率,不利于維護(hù),沒有驗證過.
b.可以將文件用數(shù)據(jù)流讀取保存到數(shù)據(jù)庫當(dāng)中,沒有實踐過(?).
b.可以將文件上傳到服務(wù)器本地磁盤當(dāng)中,便于對文件的操作和管理.
A.如果上傳到服務(wù)器讀取轉(zhuǎn)換的網(wǎng)頁文件
B.上傳到數(shù)據(jù)庫轉(zhuǎn)換成網(wǎng)頁文件(沒試過)(?)
C.上傳到服務(wù)器項目外的其他文件中,好像微軟在asp.net上面出于安全考慮并不支持直接訪問站點外的文件(?),其他類型開發(fā)不清楚支不支持,
所以才必須將office裝換位單個網(wǎng)頁文件Mhtml,用文件流的方式讀取顯示在網(wǎng)頁上,
1)可以使用添加虛擬目錄,就是在服務(wù)器上添加虛擬目錄路徑,映射到絕對路徑目錄上就是指向你要訪問的圖片路徑,在Vs開發(fā)中新建上傳文件夾,
只是在發(fā)布文件后的ISS上, 做改動,將原有文件夾變?yōu)樘摂M路徑文件,不過還是按照Server.MapPath(@"~/new_ams/file/" + fileName)獲取路徑,
(?)具體還沒實踐過.
2)可以將用文件流讀取本地文,參考代碼http://www.companysz.com/insus/archive/2013/02/05/2892678.html,
但是有一點文件流好像只可以讀取單個文件(?),不可以讀取同時讀取html +外部CSS+圖片,所以運用前面的方法將文件轉(zhuǎn)換為Mhtml格式的,
當(dāng)Office轉(zhuǎn)化為來的Mhtml用文件流讀取時web頁面顯示的是Hmtl的亂碼內(nèi)容,原因是解碼問題,具體參考
參考鏈接 http://www.companysz.com/SanMaoSpace/archive/2013/03/02/2941078.htm
3.利用office 自帶的組件將office轉(zhuǎn)換為Html
用Office組件將Office轉(zhuǎn)換為Html,參考鏈接 http://zhidao.baidu.com/link?url=AvlZUEusXh7C
a.引用office組件,如果office 沒有激活,最好激活和添加開發(fā)模式的(?),在vs添加引用里面程序集,如果引用失敗,右擊程序集屬性
,嵌入互操類改為False,為什么改為false(?). using Word = Microsoft.Office.Interop.Word; using Excel = Microsoft.Office.Interop.Excel;
b.如何將office 轉(zhuǎn)變?yōu)閱我痪W(wǎng)頁文件Mhtml,當(dāng)時這個問題搞了一天結(jié)果是應(yīng)該選擇wdFormatWebArchive ,
Web 檔案格式,他是不帶Mhtml的單次,說明中也沒提示。
c.但是,由于某些原因(權(quán)限,配置)在服務(wù)器上不可運行,具體解決方法,有待探究.
文件出自:http://www.companysz.com/mark01/p/4244197.html
/// <summary> /// WinWord文件生成HTML并保存 /// </summary> /// <param name="FilePath">需要生成的word文件的路徑</param> /// <param name="saveFilePath">生成以后保存HTML文件的路徑</param> /// <returns>是否生成成功,成功為true,反之為false</returns> PRivate bool GenerationWorDHTML(string FilePath, string saveFilePath) { try { FilePath = @"D:/a/請假審批表.doc"; saveFilePath = @"D:/a/請假審批表.html"; Word.applicationClass word = new Word.ApplicationClass(); Type wordType = word.GetType(); Word.Documents docs = word.Documents; /// 打開文件 Type docsType = docs.GetType(); Word.Document doc = (Word.Document)docsType.InvokeMember("Open", System.Reflection.BindingFlags.InvokeMethod, null, docs, new Object[] { FilePath, true, true }); /// 轉(zhuǎn)換格式,另存為 HTML Type docType = doc.GetType(); /*下面是Microsoft Word 9 Object Library的寫法: */ /*docType.InvokeMember("SaveAs", System.Reflection.BindingFlags.InvokeMethod, null, doc, new object[] { saveFilePath, Word.WdSaveFormat.wdFormatHTML });*/ /*下面是Microsoft Word 10 Object Library的寫法: */ docType.InvokeMember("SaveAs", System.Reflection.BindingFlags.InvokeMethod, null, doc, new object[] { saveFilePath, Word.WdSaveFormat.wdFormatFilteredHTML }); /// 退出 Word wordType.InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, word, null); return true; } catch { return false; } finally { //最后關(guān)閉打開的winword 進(jìn)程 Process[] myProcesses = Process.GetProcessesByName("WINWORD"); foreach (Process myProcess in myProcesses) { myProcess.Kill(); } } } /// <summary> /// Ecxel文件生成HTML并保存 /// </summary> /// <param name="FilePath">需要生成的ecxel文件的路徑</param> /// <param name="saveFilePath">生成以后保存HTML文件的路徑</param> /// <returns>是否生成成功,成功為true,反之為false</returns> protected bool GenerationExcelHTML(string FilePath, string saveFilePath) { try { FilePath = @"D:/a/申購單.xlsx"; saveFilePath = @"D:/a/申購單.html"; Excel.Application app = new Excel.Application(); app.Visible = false; Object o = Missing.Value; ///打開文件 /*下面是Microsoft Excel 9 Object Library的寫法: */ /*_Workbook xls = app.Workbooks.Open(FilePath, o, o, o, o, o, o, o, o, o, o, o, o);*/ /*下面是Microsoft Excel 10 Object Library的寫法: */ Excel._Workbook xls = app.Workbooks.Open(FilePath, o, o, o, o, o, o, o, o, o, o, o, o, o, o); ///轉(zhuǎn)換格式,另存為 HTML /*下面是Microsoft Excel 9 Object Library的寫法: */ /*xls.SaveAs(saveFilePath, Excel.XlFileFormat.xlHtml, o, o, o, o, XlSaveAsaccessMode.xlExclusive, o, o, o, o);*/ /*下面是Microsoft Excel 10 Object Library的寫法: */ xls.SaveAs(saveFilePath, Excel.XlFileFormat.xlHtml, o, o, o, o, Excel.XlSaveAsAccessMode.xlExclusive, o, o, o, o, o); ///退出 Excel app.Quit(); return true; } catch { return false; } finally { //最后關(guān)閉打開的excel 進(jìn)程 Process[] myProcesses = Process.GetProcessesByName("EXCEL"); foreach (Process myProcess in myProcesses) { myProcess.Kill(); } } }
string parameter = context.Request.QueryString["file"]; context.Response.ContentType = "message/rfc822"; FileStream fs = new FileStream(parameter, FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fs); Byte[] bytes = br.ReadBytes((Int32)fs.Length); br.Close(); fs.Close(); context.Response.OutputStream.Write(bytes, 0,bytes.Length);
FileStream fileStream = new FileStream(fileResPath, FileMode.Open); long fileSize = fileStream.Length; byte[] fileBuffer = new byte[fileSize]; fileStream.Read(fileBuffer, 0, (int)fileSize); //如果不寫fileStream.Close()語句,用戶在下載過程中選擇取消,將不能再次下載 fileStream.Close(); Context.Response.ContentType = "application/octet-stream"; Context.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName.Substring(19), Encoding.UTF8)); Context.Response.AddHeader("Content-Length", fileSize.ToString()); Context.Response.BinaryWrite(fileBuffer); Context.Response.End(); Context.Response.Close();
總結(jié):我認(rèn)為最好的辦法, 上傳為offfice文件時,就將office轉(zhuǎn)換為Mhtml (可以通過Office組件,或者aspose),將他們同時保存到服務(wù)器本地的其他文件中
,然后再用文件流讀取office 和Mhtml ,剛開始就生成mhtml 方便后者的每次預(yù)覽都要生成,速度較慢,保存到服務(wù)器本地完全是減少項目壓力.便于數(shù)據(jù)管理操作.
$經(jīng)過幾個星期的磨蹭,感覺用com 組件做,在服務(wù)器上對訪問權(quán)限做配置,因為不太了解,所以還是放棄,但是可以實現(xiàn)當(dāng)然在本地可以運行(?)
,具體解決方法在我的后面一節(jié)有所說明,用aspose 沒有破解版的,最新版本的aspose.cell 可以將excel 轉(zhuǎn)換為Mhtml
aspose :https://code.msdn.microsoft.com/Applying-Conditional-af9e0e4f/view/Discussions#content
新聞熱點
疑難解答