【问题标题】:How to stop the leading 0's from being stripped off when exporting to excel from a datatable?从数据表导出到 excel 时,如何阻止前导 0 被剥离?
【发布时间】:2010-09-30 06:41:49
【问题描述】:

我遇到了和这个问题一样的问题:

How do you prevent leading zeros from being stripped when importing an excel doc using c#

但我不确定这是否是我的方案的最佳解决方案。这是我用来进行导出的代码。有谁知道我可以改变什么来防止前导 0 被剥离?

private static void Export_with_XSLT_Web(DataSet dsExport, 
                                         string[] sHeaders, 
                                         string[] sFileds, 
                                         ExportFormat FormatType, 
                                         string FileName)
{

        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.Buffer = true;

        HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
        HttpContext.Current.Response.AppendHeader("content-disposition", 
                                                  "attachment; 
                                                  filename=" + FileName);
        }

        // XSLT to use for transforming this dataset.                       
        MemoryStream stream = new MemoryStream();
        XmlTextWriter writer = new XmlTextWriter(stream, Encoding.UTF8);

        CreateStylesheet(writer, sHeaders, sFileds, FormatType);
        writer.Flush();
        stream.Seek(0, SeekOrigin.Begin);

        XmlDataDocument xmlDoc = new XmlDataDocument(dsExport);
        XslTransform xslTran = new XslTransform();
        xslTran.Load(new XmlTextReader(stream), null, null);

        using(StringWriter sw = new StringWriter())
        {
            xslTran.Transform(xmlDoc, null, sw, null);

            HttpContext.Current.Response.Write(sw.ToString());                
            writer.Close();
            stream.Close();
            HttpContext.Current.Response.End();
        }
    }
}

这是创建样式表的方法,这里有什么我可以更改以将部分或所有字段作为文本引入的方法。

private static void CreateStylesheet(XmlTextWriter writer, 
                                     string[] sHeaders, 
                                     string[] sFileds, 
                                     ExportFormat FormatType)
{
    try
    {
        // xsl:stylesheet
        string ns = "http://www.w3.org/1999/XSL/Transform";
        writer.Formatting = Formatting.Indented;
        writer.WriteStartDocument();
        writer.WriteStartElement("xsl", "stylesheet", ns);
        writer.WriteAttributeString("version", "1.0");
        writer.WriteStartElement("xsl:output");
        writer.WriteAttributeString("method", "text");
        writer.WriteAttributeString("version", "4.0");
        writer.WriteEndElement();

        // xsl-template
        writer.WriteStartElement("xsl:template");
        writer.WriteAttributeString("match", "/");

        // xsl:value-of for headers
        for(int i = 0; i < sHeaders.Length; i++)
        {
            writer.WriteString("\"");
            writer.WriteStartElement("xsl:value-of");
            writer.WriteAttributeString("select", "'" + sHeaders[i] + "'");
            writer.WriteEndElement(); // xsl:value-of
            writer.WriteString("\"");
        }

        // xsl:for-each
        writer.WriteStartElement("xsl:for-each");
        writer.WriteAttributeString("select", "Export/Values");
        writer.WriteString("\r\n");

        // xsl:value-of for data fields
        for(int i = 0; i < sFileds.Length; i++)
        {
            writer.WriteString("\"");
            writer.WriteStartElement("xsl:value-of");
            writer.WriteAttributeString("select", sFileds[i]);
            writer.WriteEndElement(); // xsl:value-of
            writer.WriteString("\"");
        }

        writer.WriteEndElement(); // xsl:for-each
        writer.WriteEndElement(); // xsl-template
        writer.WriteEndElement(); // xsl:stylesheet
        writer.WriteEndDocument();
    }
    catch(Exception Ex)
    {
        throw Ex;
    }
}

【问题讨论】:

  • 我在工作中遇到了同样的问题。还没找到好的解决方案

标签: c# asp.net excel


【解决方案1】:

在字符串前面添加一个 '(单引号)。

【讨论】:

  • 如果我在字符串前面添加一个 ' 引号,它会显示在文件中。
【解决方案2】:

如果您知道某个字段应该是 5 位邮政编码(或 SSN 的某个部分或其他),您可能必须通过 sprintf() 或其他方式手动修复它c# 等价物是。如果它是一个不确定的字段,那么您将完全受制于正在读取数据的任何内容。

抱歉,我将问题误读为从 Excel 读取到 HTML。

您是否考虑过导出为 CSV 而不是 Excel?

【讨论】:

  • 因此,您可以在 Response.Header 中设置任何内容。
  • 查看已编辑的问题,看起来您实际上是在发出 CSV(或其他非逗号分隔的文本)。
【解决方案3】:

我不知道您的 XSL 转换的输出:我假设它是 Excel 的 xml 格式。 试图扭转这个过程,我在 Excel 工作表中写了三个数字 (007):一次作为数字,一次作为文本,一次作为数字,但格式化为显示用零填充的 3 位数字。然后我将它保存为xml并查看它。这是片段:

<Row>
    <Cell><Data ss:Type="Number">7</Data></Cell>
</Row>
<Row>
    <Cell><Data ss:Type="String" x:Ticked="1">007</Data></Cell>
</Row>
<Row>
    <Cell ss:StyleID="s22"><Data ss:Type="Number">7</Data></Cell>
</Row>

我没有复制样式,但您可以轻松做到。

编辑:一如既往,Google 是你的朋友(也是我的朋友;-)):http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm#CSVAndExcel

编辑(2):我认为链接就足够了。文章说(如果您确定目标是only Excel)您可以使用 Excel 特定的 CSV 语法。因此,在您的情况下并查看您的代码,我认为您应该插入缺少的逗号并更改开头

writer.WriteString("\"");

进入

writer.WriteString("=\"");

注意我没有尝试。

出于好奇,只问一个问题:只输出您需要在 DataSet 上处理的内容会不会更简单,而不是

  • 将其转换为 XML
  • 生成临时 XSL
  • 执行 XSL 转换
  • 将结果复制到响应流中

?

【讨论】:

  • 我在上面添加了创建样式表的方法。
  • 我明白了...您正在生成 CSV(或类似的):所以我的提示不适用。对不起。
  • 我可以对 WriteAttributeString 做些什么来告诉它以文本形式导出吗?
  • 该链接对我没有太大帮助,因为我正在将数据表中的列导出到 Excel。相反,我想知道是否有办法可以更改样式表?
  • 太棒了,把"=\"" 工作。为什么这样工作?直接使用数据集可能会更简单,但我没有编写代码,所以有点难让我来回答。
猜你喜欢
  • 2010-09-06
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
相关资源
最近更新 更多