私はMVC c#コードを使用してExcelファイルを生成し、ダウンロードしています。私はEPPLUSを使用しています。例えば、file.xlsx.htmlのように最後に.htmlが追加されたファイルを作成すると、 私はそれをどのように解決できるのか分かりません。Safariでepplus jquery.fileDownload.jsを使用してxlsxをダウンロードする
$.fileDownload(url, {
httpMethod: 'POST',
data: dtColumns,
successCallback: function() {
//code
},
failCallback: function() {
//code
}
});
公共ストリームExportDataset(IEnumerableをデータセット、IListのcolumnsToExport、文字列テンプレート) { //グループがアノンタイプで動作しますので、私たちグループ化することができ、自分のテーブル するvarグループ= dataset.GroupBy(Iへの輸出= > i.GetType());コントローラ上の
using (var package = new ExcelPackage(new FileInfo(GetTemplateFilePath(template)), true))
{
var ws = package.Workbook.Worksheets[1];
if (groupings.Any())
{
// add each "anon type matched grouping"
foreach (var grouping in groupings)
{
// because of EPP inheritance bug of T, we can just use dataTable
var dataTable = new DataTable(grouping.Key.Name);
var properties = grouping.Key.GetProperties(); // Get anon type Properties
var columns = columnsToExport.OrderBy(x => x.Position);
foreach (var property in columns.Where(column => column.IsVisible).SelectMany(column => properties.Where(property => property.Name.Equals(column.Name))))
{
dataTable.Columns.Add(property.Name);
}
foreach (var item in grouping.ToList())
{
var dataRow = dataTable.NewRow();
foreach (var p in columns.Where(column => column.IsVisible).SelectMany(column => properties.Where(property => property.Name.Equals(column.Name))))
{
dataRow[p.Name] = p.GetValue(item);
}
dataTable.Rows.Add(dataRow);
}
ws.Cells[1, 1].LoadFromDataTable(dataTable, PrintHeaders: true);
ws.Cells.AutoFitColumns();
}
}
else
{
// This case is when there is no data on the table to load the Excel so we create an empty sheet but we add the headers
var datasetStructure = dataset.GetType().GetGenericArguments()[0];
// because of EPP inheritance bug of T, we can just use dataTable
var dataTable = new DataTable(datasetStructure.Name);
var properties = datasetStructure.GetProperties(); // Get anon type Properties
foreach (var property in properties)
{
dataTable.Columns.Add(property.Name);
}
ws.Cells[1, 1].LoadFromDataTable(dataTable, PrintHeaders: true);
ws.Cells.AutoFitColumns();
}
var fileStream = new MemoryStream();
package.SaveAs(fileStream);
return fileStream;
}
}
:
リターン新しいCustomFileResult(ファイルストリームファイル名)。
パブリッククラスCustomFileResult:IHttpActionResult { private readonly Stream _fileContent; プライベートreadonly文字列_fileName;
public CustomFileResult(Stream fileContent, string fileName)
{
_fileContent = fileContent;
_fileName = fileName;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
return Task.Run(() =>
{
var response = new HttpResponseMessage();
var fileDownloadFail = false;
if (_fileContent == null || _fileContent.Length == 0)
{
response.StatusCode = HttpStatusCode.InternalServerError;
fileDownloadFail = true;
}
else
{
response.StatusCode = HttpStatusCode.OK;
_fileContent.Position = 0;
response.Content = new StreamContent(_fileContent);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = _fileName,
};
}
//Required for plugin jquery.fileDownload.js
var cookie = new CookieHeaderValue("fileDownload", "true") { Path = "/" };
response.Headers.AddCookies(new CookieHeaderValue[] { cookie });
return response;
}, cancellationToken);
}
}
解決策は、応答にコンテンツタイプを追加することです。 – jruiz