如何从数据表中导出为ex​​cel时阻止前导0被剥离?

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

如何防止前导零被剥离时使用c#导入Excel文档

但我不确定这是否是我的scheme的最佳解决scheme。 这里是我用来做出口的代码。 有谁知道我可以改变,以防止领先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(); } } } 

这里是创build样式表的方法,在这里有什么我可以改变,把一些或所有的领域作为文本。

 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; } } 

我不知道你的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> 

我没有复制风格,但你可以轻松地做到这一点。

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

编辑(2):我以为这个链接就够了。 文章说(如果您确定目标只有 Excel),您可以使用Excel特定的CSV语法。 所以在你的情况下,看你的代码,我认为你应该插入缺less的逗号,并改变开幕

 writer.WriteString("\""); 

 writer.WriteString("=\""); 

当心,我没有尝试。

只是出于好奇的一个问题:输出你需要在DataSet上工作而不是简单的工作

  • 使用XML进行转换
  • 生成一个ad-hoc XSL
  • 执行XSL转换
  • 将结果复制到Responsestream

添加一个'(单引号)到string的前面。

如果你知道一个字段应该是一个5位数的邮政编码(或者SSN的某个部分或者别的什么部分),你可能需要通过一个sprintf()或者任何c#等价物手动修复它。 如果这是一个不确定的领域,那么你完全处于任何正在读取数据的状态。

对不起,我误解了从Excel读取到HTML的问题。

你有没有考虑导出为CSV而不是Excel?