2015-12-12 139 views
2

雖然我可以在調試模式下創建rdlc報告,但遇到錯誤「訪問路徑'C:\ xxx.xlsx'被拒絕。」在Web上尋找解決方法之後,我發現許多解決方案都建議爲IIS用戶授予C驅動器權限。但是,爲渲染報告授予整個驅動器似乎並不明智。那麼,如何改變這個渲染位置,例如C:\ inetpub \ MyApplication?另一方面,我認爲報告方面不需要設置,即ReportViewer.ProcessingMode = ProcessingMode.Local;或更改rdlc屬性「Build Action」「Copy Output Directory」如何在IIS上爲rdlc報告設置自定義位置?

注意:我不希望報告在客戶端的機器上呈現,因爲他們中的一些人無權在C:\下編寫任何位置,我認爲在IIS位置生成報告要好得多。是不是?

那麼,在這種情況下最好的解決方案是什麼?


更新:我怎麼能修改此方法,以便它只是讀取流爲Excel withou寫呢?

public static void StreamToProcess(Stream readStream) 
{ 
    var writeStream = new FileStream(String.Format("{0}\\{1}.{2}", Environment.GetFolderPath(Environment.SpecialFolder.InternetCache), "MyFile", "xlsx"), FileMode.Create, FileAccess.Write); 
    const int length = 16384; 
    var buffer = new Byte[length]; 
    var bytesRead = readStream.Read(buffer, 0, length); 
    while (bytesRead > 0) 
    { 
     writeStream.Write(buffer, 0, bytesRead); 
     bytesRead = readStream.Read(buffer, 0, length); 
    } 
    readStream.Close(); 
    writeStream.Close(); 
    Process.Start(Environment.GetFolderPath(Environment.SpecialFolder.InternetCache) + "\\" + "file" + "." + "xlsx"); 
}  
+1

爲什麼要呈現文件?只需從MemoryStream中返回一個FileStreamResult並讓瀏覽器處理它。 –

+0

你能舉個例子嗎? –

回答

2

以下是我們如何從rdlc呈現Excel文件而不將其保存到服務器文件夾。只需調用該操作,它就會下載到用戶的瀏覽器中。

public FileStreamResult ExcelReport(int type) 
    { 

     var body = _db.MyObjects.Where(x => x.Type == type); 
     ReportDataSource rdsBody = new ReportDataSource("MyReport", body); 
     ReportViewer viewer = new ReportViewer 
     { 
      ProcessingMode = ProcessingMode.Local 
     }; 
     viewer.LocalReport.ReportPath = Server.MapPath(@"~\bin\MyReport.rdlc"); 
     viewer.LocalReport.DataSources.Clear(); 
     viewer.LocalReport.DataSources.Add(rdsBody); 
     viewer.LocalReport.EnableHyperlinks = true; 
     string filename = string.Format("MyReport_{0}.xls", type); 
     byte[] bytes = viewer.LocalReport.Render("Excel"); 
     var stream = new MemoryStream(bytes); 
     return File(stream, "application/ms-excel", filename); 
    } 
+0

非常感謝您的回覆。我添加了一個更新的問題。那麼,我怎樣才能在上面更新中提到一個小通知? –

+0

我可能會誤解你想要的東西。這個答案是Excel從rdlc輸出到客戶端的。上面的代碼看起來像是在試圖讓客戶端上運行Excel。由於明顯的安全問題,我不認爲你可以這樣做。我們製作一個xls文件,用戶可以點擊它來啓動Excel。 –

+0

對不起,我有點困惑。我只想確定是否應該通過將「寫入」部分移除到磁盤來修改這種「文件生成」或「報告生成」方法(我認爲問題是由於嘗試寫入磁盤而導致的,而我們需要一個內存來生成並顯示文件)。真的嗎? –

相關問題