0

SQL テーブルからデータを読み取り、そこから EXCEL レポートを生成する ASP.NET C# コード/プログラムがある場合、EXCEL/CSV セルに一重引用符を追加するにはどうすればよいですか? 生成された数値は科学的価値ではないため、正確になります(データを持つセルへの追加の一重引用符文字)。データの前に一重引用符を追加する必要がありますが、追加すると、一重引用符自体は表示されず、正確な数が表示されます。

問題は下の画像にあります。SQL Result からは正確な数値ですが、コードを使用すると科学的な値に丸められます。画像: http://photoadder.com/show-image.php?id=0ca30b7f4ba55fe359c889af62a278a4 (クリックして拡大)

Excel my self に一重引用符を入力すると、これが結果になります。画像: http://photoadder.com/show-image.php?id=48366a8093afc8555bcf7c990fc3648e

ここに私のコードの一部があります

public DataTable GetData()
{
   var dataTable = new DataTable();

   SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString);
   conn.Open();
   string query = "select * from table abc";

   SqlCommand cmd = new SqlCommand(query, conn);

   DataTable t1 = new DataTable();
   using (SqlDataAdapter a = new SqlDataAdapter(cmd))
   {
       a.Fill(t1);
   }
   return t1;
}
#endregion


protected void btnGenerateReport_Click(object sender, EventArgs e)
{
    System.Diagnostics.Debug.WriteLine("PLaccount system on click");

    var dataTable = GetData();

    StringBuilder builder = new StringBuilder();
    List<string> columnNames = new List<string>();
    List<string> rows = new List<string>();

    foreach (DataColumn column in dataTable.Columns)
    {
        columnNames.Add(column.ColumnName);
        if (column.ColumnName.ToString() == "PL_ACCOUNT_NUMBER")
        {

            System.Diagnostics.Debug.WriteLine("PLaccount system match");

        }
    }

    builder.Append(string.Join(",", columnNames.ToArray())).Append("\n");

    foreach (DataRow row in dataTable.Rows)
    {
        List<string> currentRow = new List<string>();

        foreach (DataColumn column in dataTable.Columns)
        {
            object item = row[column];

            currentRow.Add(item.ToString());
        }

        rows.Add(string.Join(",", currentRow.ToArray()));
    }

    builder.Append(string.Join("\n", rows.ToArray()));

    Response.Clear();
    Response.ContentType = "text/csv";
    Response.AddHeader("Content-Disposition", "attachment;filename=myfilename.csv");
    Response.Write(builder.ToString());
    Response.End();
4

1 に答える 1

0

これは、Excel が CSV ファイルをインポートする方法に関する長年の問題です。CSV ファイルにはデータ型に関する情報が含まれていないため、Excel は文字列値に基づいていくつかの推測を行います。これは、数値のように見えるがそのように解釈されるべきではない文字列値がある場合に特に厄介です... 0 を保持する必要がある先行 0 を持つ電話番号のように。

CSV をインポートするほとんどのアプリケーションは、文字列の引用符の一部を認識します。たとえば、別のものとして誤って解釈される可能性のある文字列 (カンマが埋め込まれた文字列を含む) を二重引用符のペアで囲むなどです。Excel はインポート プロセスの最初の部分でこれを処理するため、Excel を使用して文字列値にコンマを挿入できます。残念ながら、値の解釈を開始する前に二重引用符を破棄します。

(そのための Excel CSV インポーターを書いた人たちを喜んで抑圧することができました。)

さいわい、文字列値の先頭に一重引用符を使用して、Excel が値を数値として解釈するのではなく、文字列として処理するようにすることができます。これは、CSV でも Excel と同じように機能します。

これは、CSV の (部分的な) 行です。

701,888888001074709,XXXXXXXXXXXXXXXXXXXX837659,2/27/2013 12:00:00 AM,...

2 番目の値だけを文字列として処理する場合は、出力方法を変更して次のようにする必要があります。

701,'888888001074709,XXXXXXXXXXXXXXXXXXXX837659,2/27/2013 12:00:00 AM,...

Excel はデータを正しくインポートしますが、セルにデータを入力した場合と同じように、一重引用符を非表示にします。セルへの参照は、一重引用符などの後に文字を取得します。

なぜそうする必要があるのか​​を説明したので、それを行う方法について理解しておくべきことがいくつかあります。

引用符で囲む必要がある列を指定せずに汎用エクスポーターを作成しようとしている場合はDataTable、次のいずれかを実行する必要があります。

  1. 各列のデータ型を調べ、すべての文字列列の前に一重引用符を追加します (高速で簡単ですが、審美的に不快なオプションです)。

  2. 各文字列列の値について、数値として解析してみて、うまくいく場合にのみ単一引用符を前に追加してください。

  3. 引用する列のオプションのリストを (名前またはインデックスで) 渡します。

3 つのうち、特別に扱う列のオプションのリストを提供するのが私の好みです。

一般的な解決策を試していない場合は、次のことを試してください。

    foreach (DataRow row in dataTable.Rows)
    {
        List<string> currentRow = new List<string>();
        foreach (DataColumn column in dataTable.Columns)
        {
            object item = row[column];

            if (column.Ordinal == 1)
                currentRow.Add("'" + item.ToString());
            else
                currentRow.Add(item.ToString());
        }
        rows.Add(string.Join(",", currentRow.ToArray()));
    }
于 2013-04-24T06:49:18.410 に答える