C# 从datatable导出到excel时,如何防止前导0被剥离?

C# 从datatable导出到excel时,如何防止前导0被剥离?,c#,asp.net,excel,C#,Asp.net,Excel,我遇到了与此问题相同的问题: 但我不确定这是否是我的方案的最佳解决方案。这是我用来导出的代码。有人知道我可以更改什么来防止前导0被剥离吗 private static void Export_with_XSLT_Web(DataSet dsExport, string[] sHeaders, string[] sFileds,

我遇到了与此问题相同的问题:

但我不确定这是否是我的方案的最佳解决方案。这是我用来导出的代码。有人知道我可以更改什么来防止前导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;
    }
}

在字符串前面添加一个“单引号”。

如果您知道一个字段应该是5位数的邮政编码或SSN的某个部分或其他内容,您可能需要通过sprintf或其他类似的c语言手动修复它。如果这是一个不确定的字段,那么你完全可以任由读取数据的任何人摆布

对不起,我把这个问题误读为从Excel阅读到HTML


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

我不知道XSL转换的输出:我假设它是Excel的xml格式。 为了扭转这个过程,我在一张Excel表格中写了三个数字007:一个是数字,一个是文本,一个是数字,但格式是用零填充三位数字。然后我将其保存为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>
进入

当心我没试过

出于好奇,只有一个问题:只输出您在数据集上工作所需的内容而不是

将其转换为XML 生成特殊XSL 执行XSL转换 将结果复制到响应流

如果我在字符串前面添加一个“引号”,它会显示在文件中。因此,在Response.Header中无法设置任何内容。查看编辑后的问题,看起来您实际上发出了CSV或其他非逗号分隔的文本。我添加了创建上述样式表的方法。我看到了。。。您正在生成CSV或类似文件:因此我的提示不适用。抱歉。我可以对WriteAttributeString做些什么,告诉它将其导出为文本吗?该链接对我没有多大帮助,因为我正在将datatable中的列导出到excel。相反,我试图找出是否有办法更改样式表?太好了,Puting=\worked。为什么这样做有效?直接使用数据集可能会更简单,但我没有编写代码,所以我很难回答。我在工作中也遇到了同样的问题。还没有找到好的解决办法
writer.WriteString("\"");
writer.WriteString("=\"");