mso-data-placement:同一个单元格无效

时间:2013-09-05 01:11:24

标签: c# asp.net excel

我正在从网页将数据导出到Excel中。这应该是没脑子的,但数据中有<p>个标签。这会导致Excel在数据全部位于同一单元格中时创建新行。经过一些研究后,我发现mso-data-placement应该可以解决问题,但它不起作用。 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();
        }
    }
}

这是数据库中原始数据给我带来悲伤的一个例子:

<P>4/13/2011 : Cheng  "Jonathan" Vaing is with BSES Graffiti Unit.</P><P>4/13/2011 : Cheng  "Jonathan" Vaing is with</P>

建议?


我尝试了其他一些事情

  1. 我直接查看了数据,并将内嵌的段落标记添加了mso-data-placement属性。仍然没有奏效。数据看起来像这样
  2. <P style="mso-data-placement:same-cell> my data </p>

    1. 我尝试了其他mso- *属性,但也没有用。例如,我将样式表更改为这样
    2. <style type='text/css'>P {mso-highlight:yellow}</style>";

      为什么哦为什么Excel不能识别我的mso- *属性?!?!

1 个答案:

答案 0 :(得分:1)

有一个解决方案,但它不干净。

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

 foreach (DataGridItem dgi in dge.Items)
 {                
      foreach (TableCell cell in dgi.Cells)
      {
           cell.Text = WebUtility.HtmlEncode(cell.Text);;
      }
 }        

Excel文件打开时,应该在一个单元格中显示带有标记的原始数据。

我发现这很有效,因为Excel实际上也对文本进行了编码。要查看Excel执行的操作,请执行以下操作:

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

相关问题