2

ExcelLibrary を使用して、動的な Excel シートを生成しています。これは完璧に機能します。

コード

    //create new xls file
    string file = Server.MapPath("Discussion_Board_Report.xls");
    Workbook workbook = new Workbook();
    Worksheet worksheet = new Worksheet("Report");
    worksheet.Cells[0, 0] = new Cell("COMM 226 Case Discussions Report");

    worksheet.Cells[4, 0] = new Cell("Student ID");
    worksheet.Cells[4, 1] = new Cell("User Name");
    worksheet.Cells[4, 2] = new Cell("Case 1");
    worksheet.Cells[4, 3] = new Cell("Case 2");
    worksheet.Cells[4, 4] = new Cell("Case 3");
    worksheet.Cells[4, 5] = new Cell("Topics");
    worksheet.Cells[4, 6] = new Cell("Replies");

    workbook.Worksheets.Add(worksheet);
    workbook.Save(file);

質問

このコードの問題は、ファイルをサーバーに保存しようとしていることです。C:// にファイルを保存できません。これは、Windows がユーザーの許可なしに保存できるようにするためです。ユーザーに独自のファイルパスを選択してもらいたい。[名前を付けて保存] ダイアログ ボックスを表示するにはどうすればよいですか?

4

4 に答える 4

2

EPPlus を使用しているようです。ExcelPackage オブジェクトに Stream プロパティがあり、これを使用して応答ストリームに書き込むことができると思います。過去にファイルをダウンロードするために使用したものと同様のコードをいくつか含めました。

次に、このロジックをリンク先のページのページ読み込みに組み込みます。

ExcelPackage package = new ExcelPackage();
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Name Here");
///worksheet logic


var msArray = package.Stream;
var response = HttpContext.Current.Response;
response.Clear();
response.ClearHeaders();
response.ContentType = "application/vnd.ms-excel";
response.AddHeader("Content-Disposition", "attachment; filename={0}.xls".FormatWith(reportName));
response.AddHeader("Content-Length", msArray.Length.ToString());
response.OutputStream.Write(msArray, 0, msArray.Length);
response.Flush();
response.End();
于 2012-08-30T15:16:25.933 に答える
1

あなたがする必要があるのは、ファイルをユーザーにストリーミングすることです。workbookクラスが a に保存することを提案していると確信していますStream。この場合、Response Stream

このようなもの:

Response.ContentType = "application/vnd.ms-excel";
//Force the browser to offer to download the file
Response.AddHeader("content-disposition", "attachment;  filename=file.xlsx");
workbook.SaveToStream(Response.OutputStream);

アップデート

どうやら、Excel ライブラリの作成者は .NET 4 までこれをサポートしていませんでしたが、現在はこれを行うことでサポートしていると主張しています:

    MemoryStream m = new MemoryStream(); // Temp Stream
    workbook.Save(m);
    m.CopyTo(Response.OutputStream);

更新 2

実際、作成者は Workbook の Save メソッドの呼び出しが機能すると主張する人ではなく、MemoryStream他の誰かです。著者は実際にこのばかげたコードを推奨しています。

DataSet ds = GetData();
MemoryStream m = new MemoryStream();
ExcelLibrary.DataSetHelper.CreateWorkbook(m , ds);
m.WriteTo(Response.OutputStream);

それがうまくいかない場合は、そのライブラリの使用を完全にやめて、代わりに EPPlus を使用する方がよいでしょう。

于 2012-08-30T15:13:09.993 に答える
0

FileUploadサーバーコントロールを試すことができます。

yourfile.aspxでこれを使用します:

<asp:FileUpload ID="FileUpload1" runat="server" />

yourfile.aspx.csで、これを使用して、使用者が選択したパスを保持します。

Server.MapPath(FileUpload1.FileName);
于 2012-08-30T15:27:02.200 に答える
0

純粋なアプリケーションではこれを行うことはできません。あなたのコードは、ユーザーのマシンではなく、サーバー上で実行されています。

サーバー上で Excel ファイルを生成し、ユーザーがそれらをダウンロードするためのリンクを提供することはできますが、サーバー上のコードをユーザーのコンピューターに直接保存する方法はありません。

Silverlight のようなクライアント側のプラグインで同様のことを試すことができ、Silverlight によって公開されるファイル システムへのアクセスが制限されます。

あなたがやろうとしていることについてもう少し教えていただければ、より良いガイダンスを提供できるかもしれません.

于 2012-08-30T15:10:43.320 に答える