如何使用ASP.NET创建和下载Excel文档

12

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

目的是使用xml、linq或其他方式通过浏览器将Excel文档发送给客户。

编辑:用例

客户在浏览器中加载一个使用ajax框架制作的网格视图,该网格视图直接链接到SQL数据库。 我放置了一个按钮“导出到Excel”,让客户将该网格视图数据保存到他的计算机上,并且我希望启动一个干净的Excel下载。

这里提供的解决方案不够干净,例如发送HTML文档并更改标题以使其成为Excel文档等,我现在正在CodePlex上寻找简单的解决方案,我会告诉你的。


这个问题比较模糊。您已经有文档了,只需要知道如何发送适当的标头告诉浏览器“强制下载...不要显示”或“这是一个Excel文件”,还是需要根据应用程序中的数据生成Excel格式的文档,然后提供服务? - Rich
4个回答

17

入门套件

首先我已经下载了Open XML Format SDK 2.0,它带有以下三个有用的工具:

C:\Program Files\Open XML Format 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");

感谢您提供(借来的!)深入的示例。我需要快速处理大量Excel读取的工作,这个示例对我很有帮助,让我轻松搞定。 - Yablargo
谢谢,它按预期工作。我有一个疑问,如果我有超过30列,那么如何写入Excel。对于一些列,我们可以在foreach中写入。请给我建议。 - Srinivas
经过几天的搜索,这是完美的解决方案。它与WCF完美配合(不要忘记为文件添加IIS权限),而且服务器上不需要安装Excel。 - undefined

2

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

这里有示例代码


为了简单起见,可以在 HTML 表格中输出任何您想要的数据,就像 Excel 的“网格”一样。 - Neil N

0

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

要创建一个更全面的Excel文档,我能想到两个基本选择。

  1. 使用Office组件(即:不好)来创建Excel文档,或者使用第三方组件,如SoftArtisan的ExcelWriter。这是一个很棒的组件,但需要付费。

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

选项#1允许您几乎拥有Excel的所有功能。选项#2在我尝试过的控件中有点受限。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接