我正在尝试从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;
任何帮助将不胜感激。
假设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内部大量使用它(,我不会感到惊讶。