C# mso数据放置:同一单元格不工作

C# mso数据放置:同一单元格不工作,c#,asp.net,excel,C#,Asp.net,Excel,我正在将数据从网页导出到Excel。这应该是一个很简单的问题,但是数据中有标记。这会导致Excel在数据应全部位于同一单元格时创建新行。经过一些研究,我发现mso数据放置应该可以做到这一点,但它不起作用。Excel将打开,数据将显示,但会创建额外的非必要行。以下是我用于导出数据的代码: protected void doexcel() { string style = @"<style type='text/css'>P {mso-data-placement:sa

我正在将数据从网页导出到Excel。这应该是一个很简单的问题,但是数据中有
标记。这会导致Excel在数据应全部位于同一单元格时创建新行。经过一些研究,我发现mso数据放置应该可以做到这一点,但它不起作用。Excel将打开,数据将显示,但会创建额外的非必要行。以下是我用于导出数据的代码:

protected void doexcel()
  {
      string style =  @"<style type='text/css'>P {mso-data-placement:same-cell; font-weight:bold;}</style>";


    HttpResponse response = HttpContext.Current.Response;

    // first let's clean up the response.object
    response.Clear();
    response.Charset = "";

    //set the response mime type for excel
    response.ContentType = "application/vnd.ms-excel";
    Random RandomClass = new Random();
    int RandomNumber = RandomClass.Next();
    String filename = "a" + RandomNumber + DateTime.Now + ".xls";
    response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"" );

    // create a string writer
    using (StringWriter sw = new StringWriter())
    {
        using (HtmlTextWriter htw = new HtmlTextWriter(sw))
        {

      HttpContext.Current.Response.Write(style);
            SqlDataSourceEmployeeAssets.ConnectionString =   MyObjects.Application.CurrentContext.ConnectionString;
            String sql = (string)Session["sql"];
            SqlDataSourceEmployeeAssets.SelectCommand = sql;
            // lCount.Text = "Query returned " + getCount(query) + " rows.";
            DataGrid dge = new DataGrid();
            dge.DataSource = SqlDataSourceEmployeeAssets;
            dge.DataBind();
            dge.RenderControl(htw);
            response.Write(sw.ToString());
            response.End();
        }
    }
}
受保护的void doexcel()
{
字符串样式=@“P{mso数据放置:同一单元格;字体大小:粗体;}”;
HttpResponse response=HttpContext.Current.response;
//首先,让我们清理response.object
response.Clear();
响应。Charset=“”;
//设置excel的响应mime类型
response.ContentType=“application/vnd.ms excel”;
Random RandomClass=新的Random();
int RandomNumber=RandomClass.Next();
字符串filename=“a”+随机数+日期时间.Now+“.xls”;
AddHeader(“内容处置”、“附件;文件名=\”“+文件名+”\”);
//创建字符串编写器
使用(StringWriter sw=new StringWriter())
{
使用(HtmlTextWriter htw=新的HtmlTextWriter(sw))
{
HttpContext.Current.Response.Write(样式);
SqlDataSourceEmployeeAssets.ConnectionString=MyObjects.Application.CurrentContext.ConnectionString;
字符串sql=(字符串)会话[“sql”];
SqlDataSourceEmployeeAssets.SelectCommand=sql;
//lCount.Text=“查询返回”+getCount(查询)+“行。”;
DataGrid dge=新DataGrid();
dge.DataSource=SqlDataSourceEmployeeAssets;
dge.DataBind();
dge.渲染控制(htw);
response.Write(sw.ToString());
response.End();
}
}
}
这是数据库中原始数据的一个示例,它让我感到悲伤:

<P>4/13/2011 : Cheng  "Jonathan" Vaing is with BSES Graffiti Unit.</P><P>4/13/2011 : Cheng  "Jonathan" Vaing is with</P>
<2011年4月13日:程“乔纳森”维恩与BSE涂鸦小组合作。

<2011年4月13日:程“乔纳森”维恩与BSE涂鸦小组合作。

建议


我还试过其他一些方法

  • 我直接转到数据,并将mso数据放置属性添加到内联的段落标记中。还是不行。数据是这样的

  • 有一种解决方案,但它并不干净

    在dge.DataBind之后,放置以下代码。这将对每个单元格的文本进行编码

     foreach (DataGridItem dgi in dge.Items)
     {                
          foreach (TableCell cell in dgi.Cells)
          {
               cell.Text = WebUtility.HtmlEncode(cell.Text);;
          }
     }        
    
    打开Excel文件时,应在一个单元格中显示带有标记的原始数据

    我发现这是可行的,因为Excel实际上也对文本进行编码。要查看Excel的实际功能,请执行以下操作:

  • 在Excel中创建新工作簿(我正在使用Office 2013)
  • 在第一个单元格中,粘贴原始数据(显示时)。首先按F2键(插入单元格),然后粘贴文本
  • 将工作簿另存为HTML文件(或网页)
  • 使用windows资源管理器,转到保存文件的文件夹位置。应该有一个隐藏文件夹(我认为它是隐藏的)与您的文件同名。例如,如果您的工作簿是Book1.htm,则应该有一个标记为Book1\u files的文件夹
  • 在此文件夹中,应该有一个名为sheet001.HTM的HTM文件。在记事本(或任何文本编辑器…不是excel或word)中打开此文件
  • 找到您的原始数据。您将看到文本并没有显示HTML标记,而是显示编码版本
  • 希望这有帮助