2017-12-14 7 views
1

C#を使用して、GridViewとBoundFieldsを使用してExcelファイルをプログラムで生成しています。今は一定の値を純粋なテキストとして保持するのではなく、日付に変換し続けます。GridView BoundFieldを書式設定して、テキストを日付に変換しないようにします。

Excelからの変換なしで、DBから返されたままにしておきたいです。私はいくつかのオプションを検討しましたが、この変換を回避することはできません。

これは直接ファイルに表示されます。

問題のあるBoundFieldは "ReportNumber"です。皆さんがお手伝いいただきありがとうございます。

コードスニペット:具体的なデータがない場合

[HttpGet] 
public ActionResult AFDOJClosed2Excel(byte[] Data, string Reporting_Year) 
{ 

    try 
    { 
     DataTable dt = GetAFDOJClosed(Reporting_Year);//your datatable 
     DataView dv = dt.DefaultView; 
     dv.Sort = "Case_Number ASC"; 

     DataTable sortedDT = dv.ToTable(); 

     dt = sortedDT; 

     GridView excel = new GridView(); 
     excel.DataSource = dt; 
     excel.AutoGenerateColumns = false; 

     //Explicitly Create bound fields 

     BoundField CaseNumber = new BoundField(); 
     CaseNumber.HeaderText = "Case Number"; 
     CaseNumber.DataField = "Case_Number"; 
     excel.Columns.Add(CaseNumber); 

     BoundField Docket = new BoundField(); 
     Docket.HeaderText = "Docket"; 
     Docket.DataField = "Docket"; 
     excel.Columns.Add(Docket); 

     BoundField AgencyName = new BoundField(); 
     AgencyName.HeaderText = "Agency Name"; 
     AgencyName.DataField = "Agency_Name"; 
     excel.Columns.Add(AgencyName); 


     BoundField ReportNumber = new BoundField(); 
     ReportNumber.HeaderText = "Report Number"; 
     ReportNumber.DataField = "Report_Number"; 
     excel.Columns.Add(ReportNumber); 


     BoundField ClosedDate = new BoundField(); 
     ClosedDate.HeaderText = "Closed Date"; 
     ClosedDate.DataField = "Closed_Date"; 
     ClosedDate.DataFormatString = "{0:d}"; 
     excel.Columns.Add(ClosedDate); 

     BoundField TotalDisbursed = new BoundField(); 
     TotalDisbursed.HeaderText = "Total Disbursed"; 
     TotalDisbursed.DataField = "Total_Disbursed"; 
     TotalDisbursed.DataFormatString = "{0:C}"; 
     excel.Columns.Add(TotalDisbursed); 

     excel.DataBind(); 


     Response.ClearContent(); 
     Response.Buffer = true; 
     Response.AddHeader("content-disposition", "attachment; filename=AFDOJClosed" + Reporting_Year + ".xls"); 
     Response.ContentType = "application/ms-excel"; 

     Response.Charset = ""; 
     StringWriter sw = new StringWriter(); 
     HtmlTextWriter htw = new HtmlTextWriter(sw); 
     excel.RenderControl(htw); 

     Response.Output.Write(sw.ToString()); 
     Response.Flush(); 
     Response.End(); 

     return null; 
    } 
    catch (Exception ex) 
    { 
     ViewBag.ErrorMessage = ex.Message.ToString(); 

     return View("Error"); 
    } 
} 

答えて

0

Excelは、テキスト、数値、日付/として、それに関連付けられたメタ(例えば、形式をフォーマット/セルの内容をもとに、独自の書式設定ルールを適用時間など)。

コードではGridViewが使用され、グリッドデータを効果的に応答ストリームに直接書き出します。生成されたファイルに関する限り、日付は「一般」タイプのセルにあり、Excelはデフォルトの書式設定ルールを適用します。

セルに関連付けられたデータ型を制御するには、上記のコードのように変換メカニズムに頼るのではなく、Excelデータと明示的にやりとりするライブラリを使用する必要があります。 NuGetのかなり正直な図書館はEPPlusです。これはあなたが上に概説した理由と同じです。

特定の日付形式をセルに適用するには、次のようなものを使用できます。

ws.Cells["A3"].Style.Numberformat.Format = "yyyy-mm-dd"; 
+0

ご回答いただきありがとうございます。この例で書式を追加してもOKです。その正反対の問題は、私がしたくないときの書式設定です。私はEPPlusの提案を試みます。 –

+0

@JGrant私はあなたがそれをフォーマットしたくないと思っていますが、私はあなたの意図したデータフォーマットをコードから判断できませんでした。サンプルはExcelが決定するのではなく、目的のフォーマットに設定できることを示しています。 – DiskJunky

+1

私はただそれを放っておきたいと思っていました。それは、3番目の位置にダッシュを入れた数字の文字列です。 Excelは「0」で始まる値のみを変換します。私はそれが7月として07を解釈しているので、そのことを知っています。私は洞察に感謝します。私にとっては、プレーンテキストの形式を指定することはできません。あるいは、「触れないでください」と言うスイッチがあります。 –

関連する問題