1

一部のコンテンツを Excel ファイルとしてダウンロードする簡単なアクションを作成しました。

public FileResult ExportToExcel()
    {
        string filename = "list.xlsx";
        string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

        List<string[]> list = new List<string[]>();
        list.Add(new[] { "col1", "col2", "cols3" });
        list.Add(new[] { "col4", "col5", "cols6" });
        list.Add(new[] { "col7", "col8", "cols9" });

        StringWriter sw = new StringWriter();

        sw.WriteLine("ID,Date,Description");

        foreach (string[] item in list)
        {
            sw.WriteLine("{0},{1},{2}", item[0], item[1], item[2]);
        }

        byte[] fileContents = Encoding.UTF8.GetBytes(sw.ToString());

        return this.File(fileContents, contentType, filename);
    }

私はそれに2つの問題があります:

1.ファイルはダウンロードされましたが、開くことができず、警告が表示されます。

ファイル形式またはファイル拡張子が無効なため、Excel でファイルを開けません。ファイルが破損していないこと、およびファイル拡張子がファイルの形式と一致していることを確認してください。

古い Excel 形式を使用する場合:

        string filename = "List.xls";
        string contentType = "application/vnd.ms-excel";

ファイルを開くことはできますが、ファイルが破損しているなどの 3 つの異なる警告が表示された後です。

ところで、保存を比較して、ファイルをpdfとして書き込もうとしました

        string filename = "List.pdf";
        string contentType = "application/pdf";

それでもファイルを開くことができませんでした-フォーマットが無効であるなどのメッセージが表示されました.

2.内容は 2 番目の例のファイルに表示されますが、カンマは列区切りとして認識されず、行内のすべてのデータは 1 つの列として書き込まれます。

Excel形式に使用する区切り記号、またはデータをファイルに書き込んで表のExcel形式にする方法は?

私にとって理想的な解決策は、エクスポートされたビュー(厳密に型指定されたもの)を返すことですが、これまでのところ、その方法がわかりませんでした。

--- 編集: 実用的なソリューション ---

public FileResult ExportToExcel()
    {
        string filename = "List.xlsx";
        string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

        List<string[]> titles = new List<string[]>() { new[] { "a", "be", "ce" } };
        List<string[]> list = new List<string[]>
                                  {
                                      new[] { "col1", "col2", "cols3" },
                                      new[] { "col4", "col5", "cols6" },
                                      new[] { "col7", "col8", "cols9" },
                                      new[] { "col10", "col11", "cols12" }
                                  };

        XLWorkbook wb = new XLWorkbook();
        XLTables xt = new XLTables();
        var ws = wb.Worksheets.Add("List");
        ws.Cell(1, 1).InsertData(titles);
        ws.Cell(2, 1).InsertData(list);
        ws.Columns().AdjustToContents();

        var stream = new MemoryStream();
        wb.SaveAs(stream);
        stream.Seek(0, SeekOrigin.Begin);
        wb.Dispose();

        return this.File(stream, contentType, filename);
    }
4

1 に答える 1

1

正しくレンダリングされない理由は、MIME タイプを返すだけでは、フレームワークが残りを理解することを期待できないためです。

私は、closedXML という nuget パッケージ使用します。これにより、メモリ内に Excel ファイルを作成し、それをクライアントにストリーミングすることができます。

詳細については、完全なドキュメント ( here ) が付属しています。

このパッケージを使用すると、次のようなことができます

XLWorkbook wb = new XLWorkbook();
XLTables xt = new XLTables();
var ws = wb.Worksheets.Add("Sheet 1");
var firstCell = ws.Cell(1, 1);
var lastCell = ws.Cell(3, list.Count);
var table = ws.Range(firstCell.Address, lastCell.Address).AsTable();
table.Cell(2, 1).InsertData(list);
table.CreateTable();
ws.Columns().AdjustToContents();

using(var stream = new MemoryStream())
{
    wb.SaveAs(stream);
    stream.Seek(0, SeekOrigin.Begin);
    wb.Dispose();
    return File(stream , contentType, filename);
}
于 2015-11-26T10:01:41.373 に答える