2

みなさん、こんにちは。値をパラメーターとして受け取り、4桁ごとに空白を追加するようにフォーマットする関数を作成しようとしています。

たとえば、番号1111222233334444は、「1111 222233334444」として返されます。

Imが.netから.xlsにエクスポートすると、Excelが自動的に大きな数値を検出し、それを指数関数に変換するため、これを行う必要があります。

以前と同じ番号を使用して、Excelはそれをこの.. 1.111E+15に変換します。

そして、この値を使用すると、プログラムは空白のために値を文字列値として認識し、もちろん、私が考えていないより簡単な方法がない限り、指数関数に変換されません。私はまだ初心者です。

事前にThnks。良い一日。

編集:これは私がExcelにエクスポートする方法です。

GridView gv = new GridView();
    gv.AllowPaging = false;
    gv.AllowSorting = false;
    gv.AutoGenerateColumns = false;

    ArrayList arColumns = getData(Request.QueryString["report"].ToString());
    int i = 0;
    if (arHeaders.Count > 0)
    {
        foreach (string column in arColumns)
        {
            BoundField bf = new BoundField();
            bf.HeaderText = arHeaders[i].ToString();
            if (bf.HeaderText.ToLower().Contains("fecha"))
            {
                bf.DataFormatString = "{0:dd/MM/yyyy}";
                bf.HtmlEncode = false;
            }
            bf.DataField = column;
            gv.Columns.Add(bf);      

            i++;
        }
gv.RowDataBound += new GridViewRowEventHandler(gv_RowDataBound);
        gv.DataSource = getDataTable();
        gv.DataBind();
}

Response.Clear();

Response.AddHeader("content-disposition", "attachment;filename=Reporte" +lblTitle.Text + DateTime.Today.ToShortDateString() + ".xls");

Response.Charset = "";

Response.ContentType = "application/vnd.ms-excel";
System.IO.StringWriter stringWrite = new System.IO.StringWriter();

System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
ClearControls(gv);
gv.RenderControl(htmlWrite);
Response.Write(stringWrite.ToString());

Response.End();
4

2 に答える 2

1

@Lamakが述べたように、Excelはおそらく値を正しく格納しているので、Excelで列の書式を変更する必要があるだけです。また、これを行うと、SQLはそれほどうまく機能しない可能性があります-おそらく仕事に間違ったツールですか?

ただし、SQLの課題を楽しくするために、T-SQLでこれを実行したい場合は、STUFF関数を使用して文字列にスペースを再帰的に追加できます。パフォーマンスの観点からは、次のような文字列のセットで実行するのが最適です。

スキーマ:

create table strings (string nvarchar(max))
insert into strings (string) 
values ('1111222233334444'),('1234567890'),('234234')

クエリ:

;with r as (

  select s.string, ceiling(len(s.string)/4.) as spaces, 1 as iteration 
  from strings s

  union all

  select stuff(r.string,(r.iteration*4)+r.iteration,0,' ')
    , r.spaces, r.iteration + 1
  from r
  where r.iteration < r.spaces

)
select r.string
from r
where r.spaces = r.iteration

スカラー値関数でこれを行うことは、パフォーマンスを低下させる可能性があるため、実際にはお勧めしません。しかし、あなたがしなければならないなら...

create function GetExplodedString(@input_string nvarchar(max))
returns nvarchar(max)
as begin

    declare @output_string nvarchar(max)

    ;with r as (

      select @input_string as string, ceiling(len(@input_string)/4.) as spaces, 1 as iteration 

      union all

      select stuff(r.string,(r.iteration*4)+r.iteration,0,' ')
        , r.spaces, r.iteration + 1
      from r
      where r.iteration < r.spaces

    )
    select @output_string = r.string
    from r
    where r.spaces = r.iteration

    return @output_string
end

select dbo.GetExplodedString('1111222233334444')
于 2012-08-07T23:08:32.507 に答える
0

値の前にアポストロフィを付けると、'Excelはそれを文字列として扱います。

于 2012-08-08T13:28:33.387 に答える