0

データのページリストをユーザーに表示するグリッドを持つWebアプリケーションがあります。ユーザーには、結果をExcelスプレッドシートにダウンロードするオプションが必要です。ただし、グリッドに表示されるアイテムは、前述のようにページングされており、結果セット全体が必要です。さらに、アイテムごとに約7つのフィールドしか表示していませんが、スプレッドシートにはアイテムの20以上のフィールドがすべて含まれています。したがって、私はグリッドからExcelへのソリューションを探していません。

私は以前に実際に働いたことのあることをしようとしています。以前の雇用主(ソースコードは利用できません)では、SQLServerレポートをRDLCファイルとして含むアプリケーションがありました。コードでReportViewerコントロールを作成します(var reportViewer = new ReportViewer())。次に、レポートをコントロールにバインドし、データソースを指定して、必要な形式で結果をレンダリングします。私の場合、Excelファイルが必要です。次に、応答でExcelFileをユーザーにストリーミングします。

MVC3を使用しているので、ExcelファイルをFileContentResultとして返します。私は1日インターネットを検索してきましたが、探しているものがまったく見つかりません。

4

2 に答える 2

1

コントローラのアクション。formatパラメーターは「EXCEL」である必要があります。

    public FileResult Report(String format)
    {
        LocalReport report = new LocalReport();
        report.ReportPath = Server.MapPath("~/TestReport.rdlc");

        report.DataSources.Clear();
        report.DataSources.Add(new ReportDataSource(GetData()));

        report.Refresh();

        return GetFileContentResult(report, format, null, "TestReport");
    }

任意のレポートからFileContentResultを作成するヘルパーメソッド。

    public FileContentResult GetFileContentResult(Report report, String format, String deviceInfo, String fileDownloadName)
    {
        String mimeType;
        String encoding;
        String filenameExtension;
        String[] streamIds;
        Warning[] warnings;

        FileContentResult fileContentResult = new FileContentResult(report.Render(format, deviceInfo, out mimeType, out encoding, out filenameExtension, out streamIds, out warnings), mimeType);
        fileContentResult.FileDownloadName = Path.ChangeExtension(fileDownloadName, filenameExtension);

        return fileContentResult;
    }

編集:ヘルプ関数を呼び出すのを忘れてください。おっと。

于 2011-08-31T13:53:01.157 に答える
0

次のようなものを試してみてください...データアクセスレベルからオブジェクトのリストを入力してから、そのオブジェクトのリストを次のようなものに渡します...

public static byte[] SaveExcelData<T>(List<T> answer)
{
    byte[] fileData = null;

    var grid = new System.Web.UI.WebControls.GridView();

    grid.DataSource = answer;
    grid.DataBind(); 

    HttpContext.Current.Response.ClearContent();
    string headerAddition = "attachment; filename=";
    headerAddition += answer[0].GetType().Name + ".xls";
    HttpContext.Current.Response.AddHeader("content-disposition", headerAddition);
    HttpContext.Current.Response.ContentType = "application/excel";
    StringWriter sw = new StringWriter();
    HtmlTextWriter htw = new HtmlTextWriter(sw);
    grid.RenderControl(htw);

    fileData = System.Text.Encoding.UTF8.GetBytes(sw.ToString());

    return fileData;
}
于 2011-08-31T13:39:27.737 に答える