11

如何使用 asp.net 创建和下载 excel 文档?

目的是使用 xml、linq 或其他任何东西通过浏览器向客户发送 excel 文档。

编辑:用例

客户在浏览器中加载一个gridview(用ajax框架制作),gridview直接链接到一个sql数据库。我放了一个“导出到 excel”按钮,让客户将此 gridview 数据保存在他的计算机上,并且我想启动一个干净的 excel 下载。

这里提出的解决方案并不干净,比如发送一个html文档并将标题更改为excel文档等,我现在正在codeplex上搜索一个简单的解决方案,我会告诉你的。

4

4 回答 4

16

入门套件

首先我下载了​​ Open XML Format SDK 2.0

它带有 3 个有用的工具:

C:\Program Files\Open XML 格式 SDK\V2.0\tools

  • DocumentReflector.exe至极自动生成 c# 以从代码构建电子表格。
  • OpenXmlClassesExplorer.exe显示 Ecma 规范和类文档(使用 MSDN 样式格式)。
  • OpenXmlDiff.exe以图形方式比较两个 Open XML 文件并搜索错误。

我建议任何开始将.xlsx重命名 .zip,因此您可以看到驱动我们的电子表格的 XML 文件(例如,我们的工作表在 "xl\worksheets" 中)。


编码

免责声明:我从MSDN 技术文章中窃取了所有代码;D

以下代码使用我手动制作的 *.xlsx 模板以便能够对其进行修改。

命名空间引用

using System.IO;
using System.Xml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using DocumentFormat.OpenXml;


// Database object
        DataClassesDataContext db = new DataClassesDataContext();

        // Make a copy of the template file.
        File.Copy(@"C:\inetpub\wwwroot\project.Web\Clients\Handlers\oxml-tpl\livreurs.xlsx", @"C:\inetpub\wwwroot\project.Web\Clients\Handlers\oxml-tpl\generated.xlsx", true);

        // Open the copied template workbook. 
        using (SpreadsheetDocument myWorkbook = SpreadsheetDocument.Open(@"C:\inetpub\wwwroot\project.Web\Clients\Handlers\oxml-tpl\generated.xlsx", true))
        {
            // Access the main Workbook part, which contains all references.
            WorkbookPart workbookPart = myWorkbook.WorkbookPart;

            // Get the first worksheet. 
            WorksheetPart worksheetPart = workbookPart.WorksheetParts.ElementAt(2);

            // The SheetData object will contain all the data.
            SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>();

            // Begining Row pointer                       
            int index = 2;

            // Database results
            var query = from t in db.Clients select t;

            // For each item in the database, add a Row to SheetData.
            foreach (var item in query)
            {
                // Cell related variable
                string Nom = item.Nom;

                // New Row
                Row row = new Row();
                row.RowIndex = (UInt32)index;

                // New Cell
                Cell cell = new Cell();
                cell.DataType = CellValues.InlineString;
                // Column A1, 2, 3 ... and so on
                cell.CellReference = "A"+index;

                // Create Text object
                Text t = new Text();
                t.Text = Nom;

                // Append Text to InlineString object
                InlineString inlineString = new InlineString();
                inlineString.AppendChild(t);

                // Append InlineString to Cell
                cell.AppendChild(inlineString);

                // Append Cell to Row
                row.AppendChild(cell);

                // Append Row to SheetData
                sheetData.AppendChild(row);

                // increase row pointer
                index++;                

            }

            // save
            worksheetPart.Worksheet.Save();

        }

我还没有完成,我的第二个工作是修改后自动下载电子表格。


最后,我将用户重定向到我生成的电子表格(来自我的 aspx)

 context.Response.Redirect("Oxml-tpl/generated.xlsx");
于 2009-03-22T14:51:26.840 回答
2

只需设置 Response.ContentType = "application/vnd.ms-excel" ,您的页面将在客户端浏览器上呈现为 excel 表

示例代码在这里

于 2009-03-13T16:54:51.223 回答
0

有很多方法可以处理这个问题,具体取决于 Excel 功能的广泛程度。如果 Excel 只是一个电子表格并且没有内置的直接 Excel 功能,则 Binoj 的答案有效。客户端可以添加功能、连接等。在客户端执行某些操作之前,这些都是“愚蠢的”excel 文档。

要创建功能更全面的 Excel 文档,您有两个我可以临时想到的基本选择。

  1. 使用 office 组件(re: bad)创建一个 excel 文档,或使用第三方组件,如 SoftArtisan 的 ExcelWriter。伟大的组件,但有一个成本。

  2. 使用允许导出到 Excel 的页面上的控件。大多数 ASSP.NET 控件供应商在其网格上都有此功能。

选项 #1 允许您使用 Excel 的几乎所有功能。选项#2 有一些限制,至少在我尝试过的控件中。

于 2009-03-13T17:03:52.623 回答
0

关于如何从 Erika Ehrli 导出到 excel 的好文章 http://blogs.msdn.com/erikaehrli/archive/2009/01/30/how-to-export-data-to-excel-from-an-asp-net -application-avoid-the-file-format-differ-prompt.aspx

于 2009-10-16T22:59:12.513 回答