Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 没有MS Office inteop或任何其他第三方库的Excel下载正在生成的xls文件中插入其他html标记_Asp.net_C# 2.0 - Fatal编程技术网

Asp.net 没有MS Office inteop或任何其他第三方库的Excel下载正在生成的xls文件中插入其他html标记

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

您好,我正在用jQuery和Microsoft ASP.net 2.0在web上开发一个富客户端UI,C#作为服务器端,我基本上有两个问题,在下面列出

  • 我正在使用HTMLTextWriter和StringWriter类库来实现这一点。 我在互联网上搜索到的东西,从各种各样的网站上学到的东西 教程和/或提示这是生成 excel工作表的飞行,我们只需要输出伪造的html 并设置所需的标题以告知浏览器 传输的是什么样的数据,以及在这一部分的所有内容 在将html转换为 excel电子表格将下载页面的html标记附加到 excel标记也是如此
  • 当我在输出数据后调用Response.Close()时,我得到连接中止错误
  • 下面是代码片段

    public StringWriter getHTMLStream(){ output = new StringWriter(); htmlWriter = new HtmlTextWriter(output); string html= @" table {mso-displayed-decimal-separator:'\.'; mso-displayed-thousand-separator:'\,';}.xlGeneral {padding-top:1px; padding-right:1px; padding-left:1px; mso-ignore:padding; color:windowtext; font-size:10.0pt; font-weight:400; font-style:normal; text-decoration:none; font-family:Arial; mso-generic-font-family:auto; mso-font-charset:0; mso-number-format:General; text-align:general; vertical-align:bottom; mso-background-source:auto; mso-pattern:auto; white-space:nowrap;} "; html+=""+this.headerName+"-"+this.vehicleName+""; totalCols = (this.reportOrientation == "Horiz")?data.Columns.Count:2; if (this.reportOrientation == "Horiz") { html+=""; // Add Header Columns foreach (DataColumn colName in this.data.Columns) { html+=""+colName.ColumnName.Trim()+""; } html+=""; // Now Add Data foreach (DataRow dr in this.data.Rows) { html+=""; foreach (string colData in dr.ItemArray) { html+=""+colData+""; } html+=""; } } else { // Get the Columns colsArr = new string[this.data.Columns.Count]; int colCounter = 0; foreach (DataColumn colName in this.data.Columns) { colsArr[colCounter] = colName.ColumnName; colCounter++; } //tableHeads = arrayToString(colsArr); // Get the row data in string array rowArr = new string[this.data.Columns.Count]; foreach (DataRow dr in this.data.Rows) { colCounter = 0; foreach (string col in dr.ItemArray) { rowArr[colCounter] = col; colCounter++; } } //tableHeads = arrayToString(colsArr); // Add PDF Table Cells for (int i = 0; i "+colsArr[i].Trim()+""+rowArr[i].Trim()+""; } } html+= ""; htmlWriter.Write(html); return output; } private string arrayToString(string[] array){ string result = string.Join(",", array); result = result.Substring(0, result.Length - 1); return result; } } 公共StringWriter getHTMLStream(){ 输出=新的StringWriter(); htmlWriter=新的HtmlTextWriter(输出); 字符串html=@” 表{mso显示的十进制分隔符:'\。;mso显示的千位分隔符:'\,';}.xlGeneral{顶部填充:1px;右侧填充:1px;左侧填充:1px;mso忽略:填充;颜色:windowtext;字体大小:10.0pt;字体重量:400;字体样式:正常;文本装饰:无;字体系列:Arial;mso通用字体系列:自动;mso字体字符集:0;mso编号格式:常规;文本对齐:常规;垂直对齐:底部;mso背景源:自动;mso模式:auto;空白:nowrap;}”; html+=“”+this.headerName+“”-“+this.vehicleName+”; totalCols=(this.reportOrientation==“Horiz”)?data.Columns.Count:2; 如果(this.reportOrientation==“Horiz”) { html+=“”; //添加标题列 foreach(this.data.Columns中的DataColumn colName) { html++=“colName.ColumnName.Trim()+”; } html+=“”; //现在添加数据 foreach(此.data.Rows中的DataRow dr) { html+=“”; foreach(dr.ItemArray中的字符串colData) { html+=“”+colData+“”; } html+=“”; } } 其他的 { //获取列 colsArr=新字符串[this.data.Columns.Count]; int colCounter=0; foreach(this.data.Columns中的DataColumn colName) { colsArr[colCounter]=colName.ColumnName; colCounter++; } //tableHeads=arrayToString(colsArr); //获取字符串数组中的行数据 rowArr=新字符串[this.data.Columns.Count]; foreach(此.data.Rows中的DataRow dr) { colCounter=0; foreach(dr.ItemArray中的字符串列) { rowArr[列计数器]=列; colCounter++; } } //tableHeads=arrayToString(colsArr); //添加PDF表格单元格 对于(int i=0;i“+colsArr[i].Trim()+”“+rowArr[i].Trim()+”; } } html+=“”; htmlWriter.Write(html); 返回输出; } 私有字符串arrayToString(字符串[]数组){ 字符串结果=string.Join(“,”数组); 结果=结果子字符串(0,结果长度-1); 返回结果; } } 这就是我访问它的方式

    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.Close(); Response.Clear(); createHTML speedXLS=新建的createHTML(“车速报告”、“水平”、“车辆名称”、“速度数据”); Response.ContentType=“application/vnd.xls”; AddHeader(“内容处置”、“附件;文件名=VSpeedReport-”+vehicleName+“.xls”); Write(speedXLS.getHTMLStream().ToString()); //Response.Close(); 下面是在我的excel标记中附加的内容下载页面的标记,在想要的xls标记旁边。我如何告诉服务器不要在响应正文中附加页面的标记? **

    
    
    **

    请提供意见或建议!谢谢!

    生成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());
    
    使用

  • 当您使用流媒体类时,请使用“using”语句

  • 我在这里没有太多值得投票的声望点,但谢谢你,这是一个很好的方法。我还有一个问题,我们可以将数据转储到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());