Asp.net 没有MS Office inteop或任何其他第三方库的Excel下载正在生成的xls文件中插入其他html标记
您好,我正在用jQuery和Microsoft ASP.net 2.0在web上开发一个富客户端UI,C#作为服务器端,我基本上有两个问题,在下面列出Asp.net 没有MS Office inteop或任何其他第三方库的Excel下载正在生成的xls文件中插入其他html标记,asp.net,c#-2.0,Asp.net,C# 2.0,您好,我正在用jQuery和Microsoft ASP.net 2.0在web上开发一个富客户端UI,C#作为服务器端,我基本上有两个问题,在下面列出 我正在使用HTMLTextWriter和StringWriter类库来实现这一点。 我在互联网上搜索到的东西,从各种各样的网站上学到的东西 教程和/或提示这是生成 excel工作表的飞行,我们只需要输出伪造的html 并设置所需的标题以告知浏览器 传输的是什么样的数据,以及在这一部分的所有内容 在将html转换为 excel电子表格将下载页面的h
**
**
请提供意见或建议!谢谢!生成html表格并欺骗浏览器在excel中显示它不是将数据导出到excel的最佳方式。这不是一种黑客解决方案,在我看来,这只是时间问题,可能在下一个excel版本中停止工作,或者因为检测到某些病毒/反恶意软件/任何您正在发送的内容内容标题错误,excel 2007/2010已经警告用户这一点 **更新:** 在我看来,最好的方法是使用第三方excel库,它可以生成真正的excel文件,然后浏览器将打开excel和内容匹配的标题。还有非常好的开源库,我真的不明白为什么不应该使用它们 (xls)或/和(xlsx) 因此,如果您仍然希望在不使用第三方库的情况下使用CSV格式,请查看以下将DataTable导出为CSV的示例: 另一种方法是使用excel模式导出为XML。以下是代码:
public static MemoryStream DataSetToExcelXml(DataSet ADataset)
{
MemoryStream result = new MemoryStream();
XmlDataDocument doc = new XmlDataDocument(ADataset);
XslCompiledTransform trans = new XslCompiledTransform();
XmlDocument xmlDoc = new XmlDocument();
Stream shema = Assembly.GetExecutingAssembly().GetManifestResourceStream("ResPathToExcelSheet.xsl");
xmlDoc.Load(shema);
trans.Load(xmlDoc);
trans.Transform(doc, null, result);
return result;
}
模式
<xsl:stylesheet version="1.0"
xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="urn:my-scripts"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" >
<xsl:template match="/">
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<xsl:apply-templates/>
</Workbook>
</xsl:template>
<xsl:template match="/*">
<Worksheet>
<xsl:attribute name="ss:Name">
<xsl:value-of select="local-name(/*/*)"/>
</xsl:attribute>
<Table x:FullColumns="1" x:FullRows="1">
<Row>
<xsl:for-each select="*[position() = 1]/*">
<Cell><Data ss:Type="String">
<xsl:value-of select="local-name()"/>
</Data></Cell>
</xsl:for-each>
</Row>
<xsl:apply-templates/>
</Table>
</Worksheet>
</xsl:template>
<xsl:template match="/*/*">
<Row>
<xsl:apply-templates/>
</Row>
</xsl:template>
<xsl:template match="/*/*/*">
<Cell><Data ss:Type="String">
<xsl:value-of select="."/>
</Data></Cell>
</xsl:template>
</xsl:stylesheet>
1。
而不是
**strong text** Response.Clear();
createHTML speedXLS = new createHTML("Vehicle Speed Report", "Horiz", vehicleName, speedDT);
Response.ContentType = "application/vnd.xls";
Response.AddHeader("content-disposition", "attachment;filename=VSpeedReport-" + vehicleName + ".xls");
Response.Write(speedXLS.getHTMLStream().ToString());
使用
我在这里没有太多值得投票的声望点,但谢谢你,这是一个很好的方法。我还有一个问题,我们可以将数据转储到excel文件中,还是通过修改head将数据流化为xls
**strong text** Response.Clear();
createHTML speedXLS = new createHTML("Vehicle Speed Report", "Horiz", vehicleName, speedDT);
Response.ContentType = "application/vnd.xls";
Response.AddHeader("content-disposition", "attachment;filename=VSpeedReport-" + vehicleName + ".xls");
Response.Write(speedXLS.getHTMLStream().ToString());
**Response.Buffer = true;**
createHTML speedXLS = new createHTML("Vehicle Speed Report", "Horiz", vehicleName, speedDT);
Response.ContentType = "application/vnd.xls";
Response.AddHeader("content-disposition", "attachment;filename=VSpeedReport-" + vehicleName + ".xls");
Response.Write(speedXLS.getHTMLStream().ToString());