我正在尝试通过SSRS报告服务器的响应创建一个excel文件,在前端我可以成功下载excel文件,但是当我打开它时出现错误。
xlsx excel无法打开文件,因为文件格式或文件扩展名无效。确认文件未损坏,并且文件扩展名与文件格式匹配。
代码如下:
HttpWebRequest req =
(HttpWebRequest)WebRequest.Create(sTargetURL);
req.PreAuthenticate = true;
req.Credentials = new System.Net.NetworkCredential(strReportUser, strReportUserPW, strReportUserDomain);
HttpWebResponse HttpWResp = (HttpWebResponse)req.GetResponse();
Stream fStream = HttpWResp.GetResponseStream();
//Now turn around and send this as the response..
byte[] fileBytes = ReadFully(fStream);
string fileToAttach = Convert.ToBase64String(fileBytes);
HttpWResp.Close();
Stream stream = new MemoryStream(fileBytes);
result.Content = fileToAttach;
result.ContentType = "application/vnd.openxmlformats-
officedocument.spreadsheetml.sheet";
result.FileName = fileName + ".xlsx";
result.result = true;
return result;
任何帮助将不胜感激。
答案 0 :(得分:1)
假设response
是某种HTTP响应对象,最终将其发送到浏览器,并且您在fStream
中具有实际的Excel文件内容,则问题在于您正在发送Base64内容的文件版本(Excel无法理解):
Stream fStream = HttpWResp.GetResponseStream();
byte[] fileBytes = ReadFully(fStream);
string fileToAttach = Convert.ToBase64String(fileBytes);
result.Content = fileToAttach;
由于我看不到response
是什么,所以我只能说您需要保持文件内容不变。
如果要发送原始字节,可以执行以下操作:
Stream fStream = HttpWResp.GetResponseStream();
byte[] fileBytes = ReadFully(fStream);
result.Content = fileBytes;
如果您的response
可以处理流,那将是理想的方法(这样就不必在流和字节数据之间来回转换)。
如果result.Content
必须是字符串,那么您就必须担心要使用哪种编码,并且它看起来像:
Stream fStream = HttpWResp.GetResponseStream();
byte[] fileBytes = ReadFully(fStream);
result.Content = Encoding.UTF8.GetString(fileBytes);
如果Excel需要被编码为UTF-16(Microsoft uses it quite heavily internally),这不会让我感到惊讶。