2

大家好,我正在尝试创建一个函数,该函数将一个值作为参数,然后将其格式化为每 4 位添加空格。

例如,数字 1111222233334444 应返回为“1111 2222 3333 4444”。

我需要这样做,因为我从 .net 导出到 .xls 并且 excel 会自动检测到一个大数并将其转换为指数数。

使用与以前相同的数字,Excel 将其转换为 .. 1.111E+15。

有了这个值,由于空格,程序会将该值识别为字符串值,并且不会转换为指数,当然,除非有一种我没有想到的更简单的方法来做到这一点。我还是个新手。

提前谢谢。再会。

编辑:这就是我导出到 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 回答