私の問題は、データベースにたくさんの情報があり、それをクライアントのダウンロード用にExcelファイルに取り込むことが理想的です。excelファイルをダウンロードする
私は偉大なNPOIライブラリを使用していますが、すでにシステムのコンソールアプリケーションに実装されていますが、これは私によって書かれたものではありません。私は、私のコントローラのActionLinkの上に何もなく、「System.IO.MemoryStreamを」と言っていない空白のページが表示をクリックすると、現在何が起こる
..
明らかにこれは望ましい効果ではありません。私が望むのは、ユーザーがリンクをクリックすると、レポートがダウンロードされるということです。ここで
は、レポートのためのクラスです:public class RepairReporting
{
public Stream GenerateRepairFile(List<Int64> itemIds)
{
// Getting the complete workbook...
//
MemoryStream ms = new MemoryStream();
HSSFWorkbook templateWorkbook = new HSSFWorkbook();
// Create a worksheet by it's name.
//
HSSFSheet sheet = templateWorkbook.CreateSheet("Repairs Report");
sheet.ForceFormulaRecalculation = true;
HSSFRow dataRow = sheet.CreateRow(0);
HSSFCell cell = dataRow.CreateCell(0);
cell.SetCellValue("Repairs");
cell = dataRow.CreateCell(1);
cell.SetCellValue(DateTime.Now);
// Build the header row
//
dataRow = sheet.CreateRow(1);
string[] colHeaders = new string[]{ "Product Code",
"Product Name",
"Customer",
"Date Submitted For Repair",
"Date Sent For Repair",
"Expected Release Date",
"Estimated Cost",
"Actual Cost",
"Total Repair Price (END PRICE)"
};
int colPosition = 0;
// Write all the headers out.
//
foreach (string colHeader in colHeaders)
{
cell = dataRow.CreateCell(colPosition++);
cell.SetCellValue(colHeader);
}
// Build the item rows.
//
int row = 2;
foreach (Int64 itemId in itemIds)
{
using (ModelContainer ctn = new ModelContainer())
{
Item currentItem = (from t in ctn.Items
where t.ItemID == itemId && t.RepairSelection == true
select t).First();
dataRow = sheet.CreateRow(row++);
colPosition = 0;
cell = dataRow.CreateCell(colPosition++);
cell.SetCellValue(currentItem.ProductCode);
cell = dataRow.CreateCell(colPosition++);
cell.SetCellValue(currentItem.Product);
cell = dataRow.CreateCell(colPosition++);
cell.SetCellValue(currentItem.Customer.Name);
cell.SetCellValue(currentItem.Repair.SubmissionDate.Value.ToString("MM/dd/yyyy"));
if (currentItem.Repair.SentForConversion != null)
{
cell = dataRow.CreateCell(colPosition++);
cell.SetCellValue(currentItem.Repair.SentForRepair.Value.ToString("MM/dd/yyyy"));
}
else
{
colPosition++;
colPosition++;
}
if (currentItem.Repair.ReleaseDate != null)
{
cell = dataRow.CreateCell(colPosition++);
cell.SetCellValue(currentItem.Repair.ReleaseDate.Value.ToString("MM/dd/yyyy"));
}
else
{
colPosition++;
colPosition++;
}
if (currentItem.Repair.CostEstimation != null)
{
cell = dataRow.CreateCell(colPosition++);
cell.SetCellValue(currentItem.Repair.CostEstimation.Value.ToString());
}
else
{
colPosition++;
colPosition++;
}
if (currentItem.Repair.ActualCost != null)
{
cell = dataRow.CreateCell(colPosition++);
cell.SetCellValue(currentItem.Repair.ActualCost.Value.ToString());
}
else
{
colPosition++;
colPosition++;
}
if (currentTitle.Repair.TotalRepairPrice != null)
{
cell = dataRow.CreateCell(colPosition++);
cell.SetCellValue(currentItem.Repair.TotalRepairPrice.Value.ToString());
}
else
{
colPosition++;
colPosition++;
}
}
}
templateWorkbook.Write(ms);
ms.Position = 0;
return ms;
}
}
}
そして、ここに私の問題はどこにあるか、私はあると思う私のコントローラ、次のとおりです。
public Stream repairReport()
{
ModelContainer ctn = new ModelContainer();
List<Title> items = null;
var itemObjects = ctn.Items.Where(t => t.RepairSelection == true)
.Select(t =>t);
items = itemObjects.ToList();
RepairReporting rtp = new RepairReporting();
List<long> itemIDs = items.Select(t => t.ItemID).ToList();
Stream repairReport = rtp.GenerateRepairFile(itemIDs);
return repairReport;
}
とともに、そのコンストラクタで
stream
をとるFileStreamResult
を返すことによってFileResult
を返すことができます!ありがとう、これは治療を働いた!もう一つのこと。このファイルをダウンロードすると、Excelファイルではなく、不明なファイルタイプとしてダウンロードされます。しかし、「open with」をクリックしてからexcelを選択すると、うまく開きます。とにかくこれをダウンロードしてすぐにExcelファイルにすることはできますか? – 109221793が更新されました。 – hunter
ありがとうございます:) – 109221793