在没有Interop或库的情况下从asp listview创建excel文件

时间:2015-12-08 17:19:48

标签: asp.net excel

我正在尝试基于我的asp Listview创建一个excel文件,但我无法使用Interop,因为服务器没有安装Microsoft套件。我也想避免使用外部库。

以下是我在互联网上找到的一些代码的一部分,但它没有看到工作。

        public void Export(string fileName, List<string> liste)
        {
            HttpContext.Current.Response.Clear();
            HttpContext.Current.Response.AddHeader(
            "content-disposition", string.Format("attachment; filename={0}", fileName + ".xls"));
            HttpContext.Current.Response.ContentType = "application/ms-excel";
            using (StringWriter sw = new StringWriter())
            {
                using (HtmlTextWriter htw = new HtmlTextWriter(sw))
                {
                    lvOutput.RenderControl(htw);
                    HttpContext.Current.Response.Write(sw.ToString());
                    HttpContext.Current.Response.End();
                }
            }
        }

这是html项目模板,它基本上只是一个我分成4列的字符串。

<ItemTemplate>
                <tr>
                    <td class="col-md-3">
                        <asp:Label ID="lbl1" runat="server" Text="<%# Container.DataItem.ToString().Split(';')[0] %>" />
                    </td>
                    <td class="col-md-3">
                        <asp:Label ID="lbl2" runat="server" Text="<%# Container.DataItem.ToString().Split(';')[1] %>" />
                    </td>
                    <td class="col-md-3">
                        <asp:Label ID="Label1" runat="server" Text="<%# Container.DataItem.ToString().Split(';')[2] %>" />
                    </td>
                    <td class="col-md-3">
                        <asp:Label ID="Label2" runat="server" Text="<%# Container.DataItem.ToString().Split(';')[3] %>" />
                    </td>
                </tr>
</ItemTemplate>

2 个答案:

答案 0 :(得分:3)

这将为您提供Excel文件。我无法专门为您的控件测试RenderControl,因为您没有提供布局。看看这是否有效并更新我。

Response.ContentType = "application/force-download";
Response.AddHeader("content-disposition", "attachment; filename=ExcelSheet.xls");
Response.Write("<html xmlns:x=\"urn:schemas-microsoft-com:office:excel\">");
Response.Write("<head>");
Response.Write("<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">");
Response.Write("<!--[if gte mso 9]><xml>");
Response.Write("<x:ExcelWorkbook>");
Response.Write("<x:ExcelWorksheets>");
Response.Write("<x:ExcelWorksheet>");
Response.Write("<x:Name>Report Data</x:Name>");
Response.Write("<x:WorksheetOptions>");
Response.Write("<x:Print>");
Response.Write("<x:ValidPrinterInfo/>");
Response.Write("</x:Print>");
Response.Write("</x:WorksheetOptions>");
Response.Write("</x:ExcelWorksheet>");
Response.Write("</x:ExcelWorksheets>");
Response.Write("</x:ExcelWorkbook>");
Response.Write("</xml>");
Response.Write("<![endif]--> ");
Response.Write(sw.ToString()); //insert html string
Response.Write("</head>");
Response.Flush();

Source

编辑:另外.. excel文件应该加载得很好,但如果在Microsoft Excel中出现格式错误,则需要先检查控件渲染并确保html字符串正确

答案 1 :(得分:2)

我知道您希望避免使用外部库,但事实上,您的代码不会生成Excel文件。您只是将HTML发送到具有特定内容类型的浏览器,希望用户在他/她的机器上使用Excel(您不知道他们是否确实这样做了。)

考虑到Excel将为您处理HTML,您也放弃了对格式的大量控制。

我强烈建议你不要这样做,而是使用像ClosedXML这样被许多人广泛使用和测试的库......