我遇到了与此问题相同的问题:
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;
}
}
答案 0 :(得分:2)
我不知道你的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>
我不是在复制风格,但你可以很容易地做到。
编辑:一如既往谷歌是你的朋友(也是我的朋友;-)):http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm#CSVAndExcel。
编辑(2):我认为链接已经足够了。文章说(如果您确定目标是仅 Excel),您可以使用特定于Excel的CSV语法。所以在你的情况下,看着你的代码,我认为你应该插入缺少的逗号并更改开头
writer.WriteString("\"");
到
writer.WriteString("=\"");
请注意我没有尝试。
出于好奇只提出一个问题:只输出您需要在DataSet上工作的内容而不是
答案 1 :(得分:1)
在字符串的前面添加一个'(单引号)。
答案 2 :(得分:0)
如果您知道字段应该是5位数的邮政编码(或SSN的某些部分或其他),您可能需要通过sprintf()或其他任何方式手动修复它c#等价物是。如果它是一个不确定的领域,那么你完全可以接受读取数据的任何内容。
抱歉,我误读了从Excel到HTML的问题。
您是否考虑过导出为CSV而不是Excel?