74

EPPlus を使用して、データ テーブルを Excel ファイルにエクスポートしたいと考えています。そのデータ テーブルには int 型のプロパティがあるため、Excel ファイルでも同じ形式が必要です。

このような DataTable を Excel にエクスポートする方法を知っている人はいますか?

4

5 に答える 5

149
using (ExcelPackage pck = new ExcelPackage(newFile))
{
  ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Accounts");
  ws.Cells["A1"].LoadFromDataTable(dataTable, true);
  pck.Save();
}

それはあなたのためにトリックをするはずです。フィールドが int として定義されている場合、EPPlus は列を数値または浮動小数に適切にキャストします。

于 2012-12-04T08:32:56.560 に答える
20

ブラウザの応答でダウンロードする場合

Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-disposition", "attachment;filename=" + HttpUtility.UrlEncode("Logs.xlsx", System.Text.Encoding.UTF8));

using (ExcelPackage pck = new ExcelPackage())
{
    ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Logs");
    ws.Cells["A1"].LoadFromDataTable(dt, true);                 
    var ms = new System.IO.MemoryStream();
    pck.SaveAs(ms);
    ms.WriteTo(Response.OutputStream);                          
}
于 2016-01-14T18:14:26.050 に答える
1

序文

v5 では、EPPlus は商用利用のための有料ライセンス モデルに切り替わりました。非商用環境で v5 を使用するには、次の静的コード行を実行可能な場所に配置する必要があります。
ExcelPackage.LicenseContext = LicenseContext.NonCommercial
商用で使用している場合は、ライセンスを取得するか、商用で無料で使用できる最後のバージョンである v4.5.3.3 (netcore/net5 で動作します) を使用できます。

次のコードは 4.5.3.3 で動作します

C#

列名を Excel ヘッダーとして使用して、DataTable から Excel へ。

また、後でテーブルをループし、DateTime 列を設定して、Excel で 45123 のような数値ではなく日付として表示されるようにします。

        DataTable dt = ...;
        string sheetName = ...;
        string dateFormat = "yyyy-MM-dd HH:mm:ss";

        using var p = new ExcelPackage();
        var ws = p.Workbook.Worksheets.Add(sheetName);
        ws.Cells["A1"].LoadFromDataTable(dt, PrintHeaders: true);
        for (int c = 0; c < dt.Columns.Count; c++)
        {
            if (dt.Columns[c].DataType == typeof(DateTime))
            {
                ws.Column(c + 1).Style.Numberformat.Format = dateFormat;
            }
        }

これを API コントローラなどで使用している場合は、次のようにしてダウンロード ファイルとして返すことができます。

    string fileName = ...;  //without extension

    return File(p.GetAsByteArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName + ".xlsx");

using!の範囲に注意してください。これは C#8 構文であり、宣言されているブロックの最後まで存続します。

VB.NET

上記と同じですが、VB では次のようになります。

    Dim dt As DataTable = ...
    Dim sheetName As String = ...
    Dim dateFormat As String = "yyyy-MM-dd HH:mm:ss"

    Using p As New ExcelPackage()
        Dim ws = p.Workbook.Worksheets.Add(sheetName)
        ws.Cells("A1").LoadFromDataTable(dt, PrintHeaders:=True)

        For c As Integer = 0 To dt.Columns.Count - 1

            If dt.Columns(c).DataType Is GetType(Date) Then
                ws.Column(c + 1).Style.Numberformat.Format = dateFormat
            End If
        Next
    End Using

ダウンロードの場合は、using ブロック内に配置する必要があります。

    Dim fileName As String = ...  'without extension
    Return File(p.GetAsByteArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName & ".xlsx")
于 2021-09-07T17:13:17.167 に答える