2010-12-16 35 views
0

我有一個問題:我需要創建一個web服務(在C#中),可以從JavaScript調用,返回一個文件,這是一個Excel中生成的,併爲他的返回,在JavaScript中,打開一個新窗口與此文件。 已經創建了從javascript調用的Web服務。問題是,首先要返回這個文件,第二個問題是JavaScript獲得(可能不需要管理將該文件記錄到光盤),然後在新窗口中打開它。Web服務返回一個文件用JavaScript打開。行動!

我經過幾天的搜索,唯一的解決方案是返回一個文件就像是一個字節數組,它甚至不能將它識別爲文件,遠遠不能在另一個窗口中打開它。我已經找到了跨ActiveX的文件,用javascript打開光盤(.txt)中的文件,但它不好,因爲它首先必須接收文件並記錄它,它不想做的事情,但儘管它想要,但我不知道是否有可能做到。

我很感謝你提前給予的一切幫助。 問候。

要延長,這是代碼: 的javascript

<script type="text/javascript"> 
    function exportar(ctrl) { 
    var txt = ctrl.innerHTML; 
    xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    xmlHttp.open("post", "http://localhost:65380/HtmlToExcel.asmx/ExportarExcel", true); 
    xmlHttp.onreadystatechange=doUpdate; 
    xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 
    xmlHttp.send("paginaHtml="+txt); 
} 

function doUpdate() { 
    if(xmlHttp.readyState==4) 
    { 
     var xmlDoc=xmlHttp.responseXML; 
     var resp = xmlHttp.responseText; 
     var responseElement=xmlDoc.getElementsByTagName("string")[0]; 
     var respText=responseElement.firstChild.nodeValue; 

     // Open the window: 
     var manej = window.open(respText); 
     alert(manej); 
     manej.document.body.innerHTML = respText; 
    } 
} 
</script> 

web服務

public string ExportarExcel(string paginaHtml) 
    { 
     //return "<% Response.ContentType = \"application/vnd.ms-excel\" %>" + paginaHtml; 
     // Generamos un objeto excel Aplicación: 
     Microsoft.Office.Interop.Excel.Application Aplic = new Microsoft.Office.Interop.Excel.Application(); 
     Aplic.Visible = false; 
     Microsoft.Office.Interop.Excel.Workbook libro = Aplic.Workbooks.Add(XlWBATemplate.xlWBATWorksheet); 
     Microsoft.Office.Interop.Excel.Worksheet hoja = (Microsoft.Office.Interop.Excel.Worksheet)libro.Worksheets[1]; 
     if (hoja == null) 
     { 
      return null; 
     } 
     hoja.Rows.Clear(); 

     // Chequeamos lo que nos viene y lo cargamos en el excel: 
     int i = 0; 
     int m = 1; int n = 1; 

     paginaHtml = paginaHtml.Replace('\r', ' ').Replace('\n', ' '); 
     paginaHtml = paginaHtml.Replace("\\r", " ").Replace("\\n", " "); 
     paginaHtml = paginaHtml.Replace(" ", " "); 
     paginaHtml = paginaHtml.ToLower().Replace("<b>", "").Replace("</b>", ""); 
     paginaHtml = paginaHtml.Replace("><", "> <"); 

     string[] palabra = paginaHtml.Split(' '); 

     while (i < palabra.Length) 
     { 
      // Code to convert html table to excel file. 
     } 
     string fichero = "HtmlToExcel-" + DateTime.Now.ToFileTime() + ".xls"; 
     string ruta = (string)Server.MapPath("~") + fichero; 
     hoja.SaveAs(ruta, Microsoft.Office.Interop.Excel.XlFileFormat.xlExcel7, Type.Missing, Type.Missing, false, false, false, Type.Missing, Type.Missing, Type.Missing); 
     // Cerramos el fichero: 
     libro.Close(true, Type.Missing, Type.Missing); // Cierra el libro con cbios. 
     hoja = null; 
     Aplic.Quit(); 
     Aplic = null; 

     //// Transformamos a byte[]: 
     byte[] fExcel = ConvertirFileToByteArray(ruta); 

     // Borramos Fichero: 
     File.Delete(ruta); 

     return Encoding.Unicode.GetString(fExcel); 
    } 
    public static byte[] ConvertirFileToByteArray(string ruta) 
    { 

     FileStream fs = new FileStream(ruta, FileMode.Open, FileAccess.Read); 
     /*Create a byte array of file stream length*/ 
     byte[] b = new byte[fs.Length]; 
     /*Read block of bytes from stream into the byte array*/ 
     fs.Read(b, 0, System.Convert.ToInt32(fs.Length)); 
     /*Close the File Stream*/ 
     fs.Close(); 

     return b; 
    } 

我有一頁的innerHTML的Excel來變換爲página和後來在新窗口顯示此頁。 你能舉個例子嗎?

+0

你能否緩解你的問題?無論如何,我的理解是,您需要創建某種表格數據,並在調用Web服務時在Excel中打開它。那是你要的嗎 ? – nepsdotin 2010-12-16 10:04:18

回答

2

您不能使用javascript將文件保存到本地磁盤,除非您使用HTML 5 local storage

爲什麼需要「在新窗口中打開文件」?如果您只需將返回將文件從您的webservice以正確的內容類型作爲文件,瀏覽器將提示保存/打開它。

+0

我知道,單獨的HTTP可以恢復一個字符串或一個文檔xml。 – DumDum 2010-12-16 11:14:39

+0

@DumDum - 您可以將URL指向任何文件。我一直使用HTTP下載PDF文檔。 – Oded 2010-12-16 11:16:26

+0

我會證明這個解決方案。不是的。 – DumDum 2010-12-16 11:24:08

1

當您希望瀏覽器在新窗口中顯示文件或將其保存爲下載文件時,瀏覽器必須向服務器發送新請求。

當您通過JavaScript(異步)收到該文件時,無法通知瀏覽器在新窗口中從該頁面請求該文件。您在客戶端的加載頁面中有數據。 只需在客戶端上用javascript打開一個新窗口,然後請求通過HTTP顯示的文件。

+0

你能舉個例子嗎? – DumDum 2010-12-16 11:16:15

1

你可以使用javascript打開一個新窗口,並使用該窗口的URL的查詢字符串來訪問您的Web服務?

+0

不,我不能。我不知道這樣做。因爲它必須首先在客戶端中記錄文件。 – DumDum 2010-12-16 11:21:02