从C#创建Excel(.XLS和.XLSX)文件
如何在不要求将Excel安装在运行代码的计算机上的情况下使用C创建Excel电子表格?
解决方案
我们实际上可能想签出互操作类。我们说没有OLE(不是),但是互操作类非常易于使用。
如果我们还没有尝试过,可能会给我们留下深刻的印象。
请注意微软在此方面的立场:
Microsoft does not currently recommend, and does not support, Automation of Microsoft Office applications from any unattended, non-interactive client application or component (including ASP, ASP.NET, DCOM, and NT Services), because Office may exhibit unstable behavior and/or deadlock when Office is run in this environment.
一个非常轻量级的选择可能是使用HTML表。只需在文件中创建head,body和table标签,然后将其另存为扩展名为.xls的文件即可。我们可以使用Microsoft特定的属性来设置输出样式,包括公式。
我意识到我们可能没有在Web应用程序中对此进行编码,但这是通过HTML表构成Excel文件的示例。如果我们要编码控制台应用程序,桌面应用程序或者服务,则可以使用此技术。
IKVM + POI
或者,我们可以使用Interop ...
我们可以使用OLEDB创建和操作Excel文件。检查以下内容:使用OLEDB读取和写入Excel。
典型示例:
using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\temp\test.xls;Extended Properties='Excel 8.0;HDR=Yes'")) { conn.Open(); OleDbCommand cmd = new OleDbCommand("CREATE TABLE [Sheet1] ([Column1] string, [Column2] string)", conn); cmd.ExecuteNonQuery(); }
编辑更多链接:
- 嘿,脚本专家!如何在不使用Excel的情况下从Excel中读取?
- 如何在Visual Basic .NET中使用ADO.NET检索和修改Excel工作簿中的记录
- 使用ADO.NET C#DbProviderFactory读写Excel电子表格
我们可能想看看GemBox.Spreadsheet。
他们有一个免费版本,具有所有功能,但如果我们需要,则限制为每张150行和每本工作簿5张。
我还没有必要自己使用它,但是看起来确实很有趣。
Java开源解决方案是Apache POI。也许这里可以设置互操作,但是我对Java的了解还不够。
当我探索这个问题时,我最终使用了Interop程序集。
我们可以考虑使用XML Spreadsheet 2003格式创建文件。这是一种使用详细记录的架构的简单XML格式。
这是使用LINQ to XML做到的方法,并附带示例代码:
使用LINQ快速将Excel数据导入和导出到XML
这有点复杂,因为我们必须导入名称空间等等,但是它确实可以避免任何外部依赖关系。
(当然,它也是VB .NET,而不是C#,但是我们始终可以在自己的项目中隔离VB .NET内容以使用XML文字,并在C#中执行其他所有操作。)
我同意生成XML Spreadsheets,这是一个针对C3的示例(每个人都在VB 9中撰写有关它的博客:P)http://www.aaron-powell.com/linq-to-xml-to-excel
我们曾经尝试过sylk吗?
我们曾经以sylk的形式在经典asp中生成excelsheet,现在我们也在寻找excelgenerater。
sylk的优点是我们可以格式化单元格。
对于较小的excel文件,可用的各种Office 2003 XML库都可以很好地工作。但是,我发现以XML格式保存的大型工作簿的绝对大小是一个问题。例如,我使用的工作簿在新的XLSX格式中(应该是紧紧包装的)是40MB,变成了360MB XML文件。
就我的研究而言,有两个商业软件包可将其输出为较旧的二进制文件格式。他们是:
- 宝石盒
- ComponentOne Excel
两者都不便宜(我认为分别是500美元和800美元)。但是两者都独立于Excel本身而工作。
我想知道的是像OpenOffice.org这样的Excel输出模块。我想知道是否可以将它们从Java移植到.Net。
商业解决方案SpreadsheetGear for .NET可以实现。
我们可以在此处查看实时ASP.NET(Cand VB)示例,并在此处下载评估版。
免责声明:我拥有SpreadsheetGear LLC
我们可以使用ExcelXmlWriter。
它工作正常。
我最近才使用FlexCel.NET,并发现它是一个出色的库!我并不是说太多的软件产品。在这里没有给出完整的销售信息,我们可以在其网站上阅读所有功能。
它是一种商业产品,但是如果我们购买,则会获得完整的来源。因此,我想如果我们真的愿意,可以将其编译到程序集中。否则,它只是一个额外的程序集,无需复制任何配置或者安装或者类似内容。
我认为如果没有第三方库,我们将找不到任何方法来完成此操作,因为.NET框架显然没有内置对此的支持,并且OLE自动化只是整个世界的痛苦。
我使用过的一些选项:
如果必须使用XLSX:ExcelPackage是一个很好的开始,但是当开发人员退出使用它时就死了。 ExML从那里开始,并添加了一些功能。 ExML并不是一个不错的选择,我仍在几个生产网站中使用它。
但是,对于我所有的新项目,我都使用NPOI(Apache POI的.NET端口)。
NPOI 2.0(Alpha)也支持XLSX。
我成功地使用了以下开源项目:
- OOXML格式的ExcelPackage(Office 2007)
- .XLS格式的NPOI(Office 2003)。 NPOI 2.0(Alpha)也支持XLSX。
看一下我的博客文章:
在C#中创建Excel电子表格.XLS和.XLSX
带有Excel表和动态图表的NPOI
我也投票支持GemBox.Spreadsheet。
非常快速且易于使用,其站点上有大量示例。
我的报告任务以全新的执行速度来完成。
在C语言中一些有用的Excel自动化,我们可以从以下链接中找到。
http://csharp.net-informations.com/excel/csharp-excel-tutorial.htm
博尔顿。
出色地,
我们还可以使用第三方库(例如Aspose)。
该库的优点是不需要在计算机上安装Excel,这对我们来说是理想的选择。
如果我们对xlsx格式感到满意,请尝试我的Codeplex GitHub项目。 EPPlus。从ExcelPackage的源代码开始,但是今天已经完全重写了。
支持范围,单元格样式,图表,形状,图片,名称范围,自动过滤器和许多其他内容。
我们可以使用一个名为ExcelLibrary的库。它是发布在Google Code上的免费开放源代码库:
ExcelLibrary
这似乎是我们上面提到的PHP ExcelWriter的端口。它不会写入新的.xlsx格式,但是他们正在努力添加该功能。
它非常简单,小巧且易于使用。另外,它还有一个DataSetHelper,可让我们使用DataSet和DataTables轻松处理Excel数据。
ExcelLibrary似乎仍然仅适用于较旧的Excel格式(.xls文件),但将来可能会增加对较新的2007/2010格式的支持。
我们还可以使用EPPlus,它仅适用于Excel 2007/2010格式的文件(.xlsx文件)。
如注释中所述,每个库都有一些已知的错误。总之,随着时间的流逝,EPPlus似乎是最佳选择。它似乎也得到了更积极的更新和记录。
另外,如下面的@所示,EPPlus支持数据透视表,而ExcelLibrary可能有一些支持(ExcelLibrary中的数据透视表问题)
以下是几个链接,供我们快速参考:
ExcelLibrary GNU次级GPL
EPPlus GNU较小通用公共许可证(LGPL)
以下是ExcelLibrary的一些示例代码:
这是一个从数据库中获取数据并从中创建工作簿的示例。请注意,ExcelLibrary代码是底部的单行:
//Create the data set and table DataSet ds = new DataSet("New_DataSet"); DataTable dt = new DataTable("New_DataTable"); //Set the locale for each ds.Locale = System.Threading.Thread.CurrentThread.CurrentCulture; dt.Locale = System.Threading.Thread.CurrentThread.CurrentCulture; //Open a DB connection (in this example with OleDB) OleDbConnection con = new OleDbConnection(dbConnectionString); con.Open(); //Create a query and fill the data table with the data from the DB string sql = "SELECT Whatever FROM MyDBTable;"; OleDbCommand cmd = new OleDbCommand(sql, con); OleDbDataAdapter adptr = new OleDbDataAdapter(); adptr.SelectCommand = cmd; adptr.Fill(dt); con.Close(); //Add the table to the data set ds.Tables.Add(dt); //Here's the easy part. Create the Excel worksheet from the data set ExcelLibrary.DataSetHelper.CreateWorkbook("MyExcelFile.xls", ds);
创建Excel文件就这么简单。我们也可以手动创建Excel文件,但是上述功能确实让我印象深刻。
我们可以使用Excel XML格式将其写为XML,并以.XLS扩展名命名,然后它将以excel打开。我们可以控制XML文件标题中的所有格式(粗体,宽度等)。
维基百科提供了一个示例XML。
寻找ExtremeML。这是一个非常酷的库,使我们可以使用OpenXML格式生成OpenXML文件。
这也是一个开源项目。
http://www.extrememl.com/
如果要创建Excel 2007/2010文件,请尝试以下开源项目:https://github.com/closedxml/closedxml
It provides an object oriented way to manipulate the files (similar to VBA) without dealing with the hassles of XML Documents. It can be used by any .NET language like C# and Visual Basic (VB). ClosedXML allows you to create Excel 2007/2010 files without the Excel application. The typical example is creating Excel reports on a web server: var workbook = new XLWorkbook(); var worksheet = workbook.Worksheets.Add("Sample Sheet"); worksheet.Cell("A1").Value = "Hello World!"; workbook.SaveAs("HelloWorld.xlsx");
我们可以使用以下库创建格式良好的Excel文件:
http://officehelper.codeplex.com/documentation
参见以下示例:
using (ExcelHelper helper = new ExcelHelper(TEMPLATE_FILE_NAME, GENERATED_FILE_NAME)) { helper.Direction = ExcelHelper.DirectionType.TOP_TO_DOWN; helper.CurrentSheetName = "Sheet1"; helper.CurrentPosition = new CellRef("C3"); //the template xlsx should contains the named range "header"; use the command "insert"/"name". helper.InsertRange("header"); //the template xlsx should contains the named range "sample1"; //inside this range you should have cells with these values: //<name> , <value> and <comment>, which will be replaced by the values from the getSample() CellRangeTemplate sample1 = helper.CreateCellRangeTemplate("sample1", new List<string> {"name", "value", "comment"}); helper.InsertRange(sample1, getSample()); //you could use here other named ranges to insert new cells and call InsertRange as many times you want, //it will be copied one after another; //even you can change direction or the current cell/sheet before you insert //typically you put all your "template ranges" (the names) on the same sheet and then you just delete it helper.DeleteSheet("Sheet3"); }
样本如下所示:
private IEnumerable<List<object>> getSample() { var random = new Random(); for (int loop = 0; loop < 3000; loop++) { yield return new List<object> {"test", DateTime.Now.AddDays(random.NextDouble()*100 - 50), loop}; } }