C# 从datatable导出到excel时,如何防止前导0被剥离?
我遇到了与此问题相同的问题: 但我不确定这是否是我的方案的最佳解决方案。这是我用来导出的代码。有人知道我可以更改什么来防止前导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,
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("=\"");