如何在C#中写Excel文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在C#中写Excel文件相关的知识,希望对你有一定的参考价值。

C#创建Excel文档,下面的代码需要添加spire.doc.dll为依赖

    //创建一个workbook实例

    Workbook wb = new Workbook();


    //清除默认的工作表

    wb.Worksheets.Clear();


    //添加一个工作表并指定表名

    Worksheet sheet = wb.Worksheets.Add("职员表");


    //横向合并A1到G1的单元格

    sheet.Range["A1:G1"].Merge();


    //写入数据到A1单元格,设置文字格式及对齐方式

    sheet.Range["A1"].Value = "环宇汽车公司员工基本情况登记表"; 

    sheet.Range["A1"].HorizontalAlignment = HorizontalAlignType.Center;

    sheet.Range["A1"].VerticalAlignment = VerticalAlignType.Center;

    sheet.Range["A1"].Style.Font.IsBold = true;

    sheet.Range["A1"].Style.Font.Size = 13F;


    //设置第一行行高

    sheet.Rows[0].RowHeight = 30F;


    //创建一个DataTable

    DataTable dt = new DataTable();

    dt.Columns.Add("姓名");

    dt.Columns.Add("性别");

    dt.Columns.Add("出生日期");

    dt.Columns.Add("学历");

    dt.Columns.Add("联系电话");

    dt.Columns.Add("职务");

    dt.Columns.Add("工号");

    dt.Rows.Add("王伟", "男", "1990年2月10日", "本科", "13524756854", "销售","0054");

    dt.Rows.Add("李宁", "男", "1985年6月8日", "大专", "13259863247", "销售","0055");

    dt.Rows.Add("邓家佳", "女", "1989年11月25日", "本科", "13601540352", "销售","0029");

    dt.Rows.Add("杜平安", "男", "1978年4月16日", "中专", "13352014060", "保安","0036");

    dt.Rows.Add("唐静", "女", "1980年1月21日", "本科", "13635401489", "店长","0010");


    //将DataTable数据写入工作表

    sheet.InsertDataTable(dt, true, 2, 1, true);


    //设置该区域行高

    sheet.Range["A2:G7"].RowHeight = 15F;


    //设置第三列及第五列列宽

    sheet.Range["A2:G7"].Columns[2].ColumnWidth = 15F;

    sheet.Range["A2:G7"].Columns[4].ColumnWidth = 15F;


    //设置网格线样式及颜色

    sheet.Range["A2:G7"].BorderAround(LineStyleType.Medium);   

    sheet.Range["A2:G7"].BorderInside(LineStyleType.Thin);

    sheet.Range["A2:G2"].BorderAround(LineStyleType.Medium);

    sheet.Range["A2:G7"].Borders.KnownColor = ExcelColors.Black;


    //保存为.xlsx文件

    wb.SaveToFile("创建Excel.xlsx", FileFormat.Version2013);

参考技术A 1. 创建一个Console Application, 添加COM选显卡中的Microsoft Excel 12.0 Object Library引用.
2. 粘贴下面的源代码.
using System;
using Excel = Microsoft.Office.Interop.Excel;

namespace CShartExcelTest

class Program

static void Main(string[] args)

try

string[,] values =
"Tom", "18", "Beijing", "13912345678",
"Jerry", "17", "Shanghai", "13687654321"
;
Excel.Application objApp;
Excel._Workbook objBook;
Excel.Workbooks objBooks;
Excel.Sheets objSheets;
Excel._Worksheet objSheet;
Excel.Range range;

// Instantiate Excel and start a new workbook.
objApp = new Excel.Application();
objBooks = objApp.Workbooks;
objBook = objBooks.Add(System.Reflection.Missing.Value);
objSheets = objBook.Worksheets;
objSheet = (Excel._Worksheet)objSheets.get_Item(1);

//Get the range where the starting cell has the address
range = objSheet.get_Range("A2", System.Reflection.Missing.Value);
range = range.get_Resize(2, 4);
range.set_Value(System.Reflection.Missing.Value, values);

//Construct the header.
objSheet.Cells[1, 1] = "Name";
objSheet.Cells[1, 2] = "Age";
objSheet.Cells[1, 3] = "HomeTown";
objSheet.Cells[1, 4] = "Mobile";

bool bSave = false;

if (bSave)

//Return control of Excel to the user.
objApp.Visible = true;
objApp.UserControl = true;

else

objBook.SaveAs(@"c:\temp\csharp-Excel.xls",
Excel.XlFileFormat.xlWorkbookNormal,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
Excel.XlSaveAsAccessMode.xlExclusive,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value);

objBook.Close(true,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value);
objApp.Quit();

releaseObject(objSheet);
releaseObject(objBook);
releaseObject(objApp);


catch (Exception ex)

Console.WriteLine(ex.Message);



private static void releaseObject(object obj)

try

System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
obj = null;

catch (Exception ex)

obj = null;
Console.WriteLine("Exception Occured while releasing object " + ex.ToString());

finally

GC.Collect();




如何在不安装 Microsoft Office 的情况下在 C# 中创建 Excel(.XLS 和 .XLSX)文件?

【中文标题】如何在不安装 Microsoft Office 的情况下在 C# 中创建 Excel(.XLS 和 .XLSX)文件?【英文标题】:How do I create an Excel (.XLS and .XLSX) file in C# without installing Microsoft Office? 【发布时间】:2010-09-14 03:22:13 【问题描述】:

如何使用 C# 创建 Excel 电子表格,而不需要在运行代码的机器上安装 Excel?

【问题讨论】:

@Mike “无需安装 Excel”的文章与专业无关。这是关于依赖关系的。问题的原文是这样写的:“理想情况下,我希望开源,所以我不必在我的代码中添加任何第三方依赖项,并且我希望避免直接使用 Excel 来创建文件(使用 OLE 自动化。)” 不幸的是,问题被大大简化了。 假设您正在尝试做一些没有库或外部代码的事情,我不能说 xls 文件,但是对于 xlsx 文件,为什么不从现有的文件开始,将其重命名为 zip 文件并探索内容?一点点逆向工程会告诉你很多。在各种文件夹和子文件夹中有几个不同的 xml 文件和 rels 文件。尝试探索它,看看它是否可以复制,或者看看是否可以找到有关各种 xml 命名空间/模式的文档。 【参考方案1】:

您实际上可能想查看 C# 中可用的互操作类(例如 Microsoft.Office.Interop.Excel。您说没有 OLE(这不是),但互操作类非常易于使用。查看 C# Documentation here (Excel 互操作从 C# PDF 的第 1072 页开始)。

如果您没有尝试过,可能会给您留下深刻印象。

请注意微软的stance:

微软目前不推荐也不支持, 无人值守的 Microsoft Office 应用程序自动化, 非交互式客户端应用程序或组件(包括 ASP、 ASP.NET、DCOM 和 NT 服务),因为 Office 可能表现出不稳定 Office 在此环境中运行时出现的行为和/或死锁。

【讨论】:

但是你必须确保你手动处理所有东西,否则你会泄漏内存 @Ricky B:另外,根据我对互操作的经验,它确实使用了 excel。每次我们使用它时,如果机器上没有安装 Excel,就会得到 COM 异常。 使用 OLE,即使处理得非常小心,它最终也会泄漏内存或崩溃。这对于有人值守的应用程序/工作站来说是可以争论的,但不推荐用于服务器(MS 有一个 KB 说明了这一点)。对于我们的服务器,我们只是每晚重新启动它。同样,这工作正常。 @Geoffrey:啊,好吧,你会让我为它工作 :) --> support.microsoft.com/kb/257757 Microsoft 目前不推荐,也不支持任何无人值守的 Microsoft Office 应用程序自动化,非交互式客户端应用程序... 在互操作方面苦苦挣扎了一个多星期后,我将参加这个讨论,除非您的需求非常简单,否则这是行不通的。对电子表格格式的支持非常糟糕,这可以说是生成 .xls 文件而不仅仅是平面 .csv 文件的原因。例如,您是否尝试过在一个单元格中输出超过 911 个字符,或者您是否尝试过以一致的方式设置合并单元格的宽度?我有,而且我现在无法告诉你我有多讨厌这个废话......帮自己一个忙,并使用本次讨论中提到的免费库之一。【参考方案2】:

一个非常轻量级的选项可能是使用 HTML 表格。只需在文件中创建 head、body 和 table 标记,并将其保存为扩展名为 .xls 的文件。您可以使用 Microsoft 特定的属性来设置输出样式,包括公式。

我知道您可能没有在 Web 应用程序中对此进行编码,但这里是通过 HTML 表格组成的 Excel 文件的example。如果您正在编写控制台应用程序、桌面应用程序或服务,则可以使用此技术。

【讨论】:

它是如此临时,但它可以工作(更不用说 excel 在打开时发出警告)并且非常简单,它应该作为解决方案占有一席之地。虽然只是为了表明您可以导出 excel 文件:)) 这个解决方案对我来说很好,只是注意你不能使用 .xlsx 扩展名 我组织中的某些人无法打开在 Office 2010 及更高版本中以这种方式制作的 excel 文件。不知道问题出在哪里,但我不得不推出自己的 OpenXML 实现。 (见 Sogger 的回答) 更轻量级的版本是创建一个 csv 文件,Windows 将其与 Excel 关联。【参考方案3】:

IKVM + POI

或者,您可以使用 Interop ...

【讨论】:

【参考方案4】:

您可以使用 OLEDB 创建和操作 Excel 文件。检查这个:Reading and Writing Excel using OLEDB。

典型示例:

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();

编辑 - 更多链接:

Hey, Scripting Guy! How Can I Read from Excel Without Using Excel? How To Use ADO.NET to Retrieve and Modify Records in an Excel Workbook With Visual Basic .NET Reading and Writing Excel Spreadsheets Using ADO.NET C# DbProviderFactory

【讨论】:

有人可以确认这在 x64 中运行时是否有效吗?我很确定 Jet 仅在您的应用程序在 32 位模式下编译或运行时才有效。 我刚刚测试了这个连接,它在 Windows Server 2008 R2 x64 RC 上失败了,似乎必须安装 2007 Office System 驱动程序:数据连接组件 [microsoft.com/downloads/… 对此要非常小心——这是一个大而丑陋的杂物(例如,有时它会猜测列类型并丢弃所有不适合的数据)。 如果使用这种方法,应该非常小心。对于格式不完美的数据,我发现它非常不稳定。 作为一个不得不在大型项目中使用 OleDb 的人,我说远离它!它有时无法检索单元格值,只是因为它无法理解格式。它没有删除操作。它的工作方式完全不同且不可预测,即使是最轻微的供应商变化。我想说的是一个经过验证的商业解决方案。【参考方案5】:

您可能想看看GemBox.Spreadsheet。

如果符合您的需要,他们有一个免费版本,具有所有功能,但每张纸限制为 150 行,每个工作簿限制为 5 张。

我自己还不需要使用它,但看起来确实很有趣。

【讨论】:

【参考方案6】:

Java 开源解决方案是Apache POI。也许有一种方法可以在这里设置互操作,但我对 Java 的了解还不够,无法回答这个问题。

当我探索这个问题时,我最终使用了互操作程序集。

【讨论】:

【参考方案7】:

您可以考虑使用XML Spreadsheet 2003 格式创建文件。这是使用well documented schema 的简单XML 格式。

【讨论】:

【参考方案8】:

这是一种使用 LINQ to XML 的方法,并附有示例代码:

Quickly Import and Export Excel Data with LINQ to XML

这有点复杂,因为您必须导入命名空间等,但它确实可以让您避免任何外部依赖。

(当然,它是 VB .NET,而不是 C#,但您始终可以在自己的项目中隔离 VB .NET 内容以使用 XML Literals,并在 C# 中执行其他所有操作。)

【讨论】:

【参考方案9】:

我同意生成 XML 电子表格,这里有一个关于如何为 C# 3 执行此操作的示例(每个人都只是在 VB 9 中写博客:P)http://www.aaron-powell.com/linq-to-xml-to-excel

【讨论】:

【参考方案10】:

你试过 sylk 吗?

我们曾经在经典的 asp 中生成 sylk 的 excelsheets,现在我们也在寻找一个 excelgenerator。

sylk 的优点是,您可以格式化单元格。

【讨论】:

【参考方案11】:

各种可用的 Office 2003 XML 库非常适用于较小的 excel 文件。但是,我发现以 XML 格式保存的大型工作簿的绝对大小是个问题。例如,我使用的一个 40MB 的工作簿在新的(当然更紧凑的)XLSX 格式中变成了一个 360MB 的 XML 文件。

就我的研究而言,有两个商业软件包允许输出到较旧的二进制文件格式。它们是:

Gembox ComponentOne Excel

两者都不便宜(我认为分别是 500 美元和 800 美元)。但两者都独立于 Excel 本身工作。

我会好奇的是 OpenOffice.org 之类的 Excel 输出模块。我想知道它们是否可以从 Java 移植到 .Net。

【讨论】:

这个可以在.net 和java 上运行,而且不贵。 SmartXLSsmartxls.com【参考方案12】:

商业解决方案,SpreadsheetGear for .NET 可以做到。

您可以查看实时 ASP.NET(C# 和 VB)示例 here 并下载评估版 here。

免责声明:我拥有 SpreadsheetGear LLC

【讨论】:

您的产品很棒,但我认为这里的很多人都期待免费的解决方案。这可能解释了反对票。【参考方案13】:

您可以使用ExcelXmlWriter。

效果很好。

【讨论】:

【参考方案14】:

我最近刚刚使用了 FlexCel.NET,发现它是一个很棒的库!我不会说太多的软件产品。在这里提供整个销售宣传毫无意义,您可以阅读他们网站上的所有功能。

这是一种商业产品,但如果您购买它,您将获得完整的来源。所以我想如果你真的想的话,你可以把它编译到你的程序集中。否则,它只是 xcopy 的一个额外程序集 - 无需配置或安装或类似的东西。

我认为如果没有第三方库,您将找不到任何方法来做到这一点,因为 .NET 框架显然没有内置支持,而且 OLE 自动化只是一个痛苦的世界。

【讨论】:

【参考方案15】:

我使用过的几个选项:

如果 XLSX 是必须的:ExcelPackage 是一个良好的开端,但在开发人员退出工作后就消失了。 ExML 从那里获得并添加了一些功能。 ExML 是不错的选择,我仍在几个生产网站中使用它。

不过,对于我所有的新项目,我使用的是NPOI,即Apache POI 的.NET 端口。 NPOI 2.0 (Alpha) 也支持 XLSX。

【讨论】:

如果您需要支持 XLS,请小心使用 ExcelPackage。我遇到了困难,最终切换到 ExcelLibrary。 绝对正确。如果您需要 XLSX 支持,ExcelPackage/ExML 只是一个不错的选择。 请注意,ExcelPackage 有一个后继者:支持 XLSX 的 EPPlus (epplus.codeplex.com)。例如,与 NPOI 相比,我唯一关心的是性能,例如当有很多列时。【参考方案16】:

我成功使用了以下开源项目:

面向 OOXML 格式的 ExcelPackage (Office 2007)

.XLS 格式的 NPOI (Office 2003)。 NPOI 2.0(测试版)也支持 XLSX。

看看我的博文:

Creating Excel spreadsheets .XLS and .XLSX in C#

NPOI with Excel Table and dynamic Chart

【讨论】:

关于 NPOI 的注释 - 行和列引用是从零开始的。适合填充现有模板。【参考方案17】:

我也投票给GemBox.Spreadsheet。

非常快速且易于使用,在他们的网站上有大量示例。

将我的报告任务提升到一个全新的执行速度。

【讨论】:

免费版受限:每张纸的最大行数为 150。【参考方案18】:

嗯,

您也可以使用第三方库,例如 Aspose。

这个库的好处是它不需要在你的机器上安装 Excel,这对你来说是理想的。

【讨论】:

更准确地说,您可以使用 .NET 的 Aspose.Cells 在您的 .NET 应用程序中创建 Excel(XLS、XLSX)文件。 是的,如果您不介意支付 999 美元的最低许可费,您可以。试试 MikesKnowledgeBase 库...比这个便宜 999 美元!【参考方案19】:

如果您对 xlsx 格式感到满意,请尝试我的库 EPPlus。它从 ExcelPackage 的源代码开始,但后来完全重写。

它支持范围、单元格样式、图表、形状、图片、命名范围、自动筛选和许多其他东西。

你有两个选择:

EPPlus 4,LGPL许可(原分支,开发至2020年)

EPPlus 5,根据 Polyform Noncommercial 1.0.0 许可(自 2020 年起)。

来自 EPPlus 5 readme.md:

有了新的许可证,EPPlus 在某些情况下仍然可以免费使用,但需要商业许可证才能用于商业业务。

EPPlus 网站:https://www.epplussoftware.com/

【讨论】:

这些例子很有帮助。我能够在几个小时内将我的代码从使用 Microsoft 互操作库(非常慢)更改为这个库(版本 4.x)。我的基准测试编写了一个包含两个选项卡和大约 750,000 个单元格的文件。使用 MS 互操作需要 13 分钟。使用 EPPlus 需要 10 秒,大约是 80 倍的加速。很开心! 为了清楚起见,LGPL 允许在不出现 GPL 感染部分的情况下链接软件。您只需要开源您对 ClosedXml 所做的更改,或者如果您直接将源代码(而不是引用 ClosedXml 程序集)放入您的应用程序中,那么您需要开源您的应用程序。 @Paul Chernoch:我们非常快速地使用互操作填充大型 Excel 工作表。秘诀是进行批量更新。创建一个对象 [,] 块,填充它,然后将该矩阵一次写入 Excel:excelWorksheet.get_Range(range).Value2 = block;【参考方案20】:

您可以使用名为 ExcelLibrary 的库。这是发布在 Google Code 上的免费开源库:

ExcelLibrary

这看起来是您上面提到的 PHP ExcelWriter 的一个端口。它不会写入新的 .xlsx 格式,但他们正在努力添加该功能。

它非常简单、小巧且易于使用。此外,它还有一个 DataSetHelper,可让您使用 DataSets 和 DataTables 轻松处理 Excel 数据。

ExcelLibrary 似乎仍仅适用于较旧的 Excel 格式(.xls 文件),但将来可能会增加对较新的 2007/2010 格式的支持。

您也可以使用EPPlus,它仅适用于 Excel 2007/2010 格式文件(.xlsx 文件)。还有 NPOI 两者都可以使用。

如 cmets 中所述,每个库都有一些已知错误。总之,随着时间的推移,EPPlus 似乎是最佳选择。它似乎也得到了更积极的更新和记录。

此外,正如下面@АртёмЦарионов 所指出的,EPPlus 支持数据透视表,而 ExcelLibrary 可能有一些支持 (Pivot table issue in ExcelLibrary)

这里有几个链接供快速参考:ExcelLibrary - GNU Lesser GPLEPPlus - GNU (LGPL) - No longer maintainedEPPlus 5 - Polyform Noncommercial - Starting May 2020NPOI - @ 987654332@

这里有一些 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 文件,但上面的功能让我印象深刻。

【讨论】:

ExcelLibrary 已被卓越的 EPPlus - epplus.codeplex.com 取代。 Jan 会定期更新。一直在使用它,它是我们合作过的最好的开源项目之一。 需要注意的是,ExcelLibrary 在处理大型数据集(大于 5000 行和很多列)时存在很多性能问题。目前正在对工作中的代码库进行大量修改,以便我们可以在项目中使用它。 -1 如果您要发布示例代码,最好确保它是正确的。 Use the Dispose method of this interface to explicitly release unmanaged resources in conjunction with the garbage collector. The consumer of an object can call this method when the object is no longer needed. ClosedXML 怎么样?我可能会在你的项目中被证明是有用的。 我试过 ExcelLibrary,它所能做的就是生成一个“损坏的文件”,没什么特别的,只有 3 列,小文件。 Excel 2016 无法打开。尝试了自动生成文件 rom DataTable。【参考方案21】:

您可以使用 Excel XML 格式将其写入 XML,并使用 .XLS 扩展名命名它,它将使用 excel 打开。您可以控制 XML 文件标题中的所有格式(粗体、宽度等)。

有一个example XML from Wikipedia。

【讨论】:

【参考方案22】:

如果您要创建 Excel 2007/2010 文件,请试试这个开源项目:https://github.com/closedxml/closedxml

它提供了一种面向对象的方式来操作文件(类似于 VBA) 无需处理 XML 文档的麻烦。可以使用 通过任何 .NET 语言,如 C# 和 Visual Basic (VB)。

ClosedXML 允许您在没有 Excel 的情况下创建 Excel 2007/2010 文件 应用。典型示例是在 Web 上创建 Excel 报告 服务器:

var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Sample Sheet");
worksheet.Cell("A1").Value = "Hello World!";
workbook.SaveAs("HelloWorld.xlsx");

【讨论】:

我尝试在一个构建相当大的 Excel 工作表的项目中使用它。优秀的库,但性能极差。我刚刚对我正在处理的项目进行了比较:ClosedXML (v 0.53.3) 花费了 92,489 毫秒,而 EPPlus (v 2.9.03,用于测试 - 我们不能使用,因为它是 GPL) 花费了 16,500 毫秒。跨度> @Druid 许可证是 LGPL 假设您没有将源代码修改为 ClosedXML 它可以免费使用epplus.codeplex.com/license 我很欣赏 ClosedXML 是开源的 (MIT)。在我撰写本文时,GitHub 上的 LGPL 许可 EPPlus 项目已存档,其最后一次发布是在 2019 年 1 月。【参考方案23】:

您可以使用此库创建格式良好的 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;
    

【讨论】:

【参考方案24】:

http://www.codeproject.com/KB/cs/Excel_and_C_.aspx

只需使用本机方法就容易多了。

如果安装了它,您就可以使用它,这是 Windows 中最棒且使用率最低的功能,它在过去被称为 COM,它可以为您节省大量时间和痛苦。

或者更简单的是使用 ref lib MS 用品 - http://csharp.net-informations.com/excel/csharp-create-excel.htm

【讨论】:

为什么第二种方式更容易?不一样吗(将本机对象库添加到您的项目中)?是否需要安装 Excel 才能使该对象库正常工作? Microsoft 不推荐或支持来自非交互式应用程序(如 ASP.NET)的 Office 自动化。见support.microsoft.com/kb/257757 Excel 在自动化方面非常不可靠且速度慢。【参考方案25】:

Infragistics 或 Syncfusion 等一些第 3 方组件供应商提供了非常出色的 Excel 导出功能,无需安装 Microsoft Excel。

由于这些供应商还提供高级 UI 网格组件,因此如果您希望 Excel 导出的样式和布局模仿应用程序用户界面中网格的当前状态,这些组件会特别方便。

如果您的导出旨在在服务器端执行,重点是要导出的数据并且没有指向 UI 的链接,那么我会选择免费的开源选项之一(例如 ExcelLibrary)。

我之前参与过尝试在 Microsoft Office 套件上使用服务器端自动化的项目。基于这种经验,我强烈建议不要使用这种方法。

【讨论】:

【参考方案26】:
public class GridViewExportUtil

    public static void Export(string fileName, GridView gv)
    
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.AddHeader(
            "content-disposition", string.Format("attachment; filename=0", fileName));
        HttpContext.Current.Response.ContentType = "application/ms-excel";

        using (StringWriter sw = new StringWriter())
        
            using (HtmlTextWriter htw = new HtmlTextWriter(sw))
            
                //  Create a form to contain the grid
                Table table = new Table();

                //  add the header row to the table
                if (gv.HeaderRow != null)
                
                    GridViewExportUtil.PrepareControlForExport(gv.HeaderRow);
                    table.Rows.Add(gv.HeaderRow);
                

                //  add each of the data rows to the table
                foreach (GridViewRow row in gv.Rows)
                
                    GridViewExportUtil.PrepareControlForExport(row);
                    table.Rows.Add(row);
                

                //  add the footer row to the table
                if (gv.FooterRow != null)
                
                    GridViewExportUtil.PrepareControlForExport(gv.FooterRow);
                    table.Rows.Add(gv.FooterRow);
                

                //  render the table into the htmlwriter
                table.RenderControl(htw);

                //  render the htmlwriter into the response
                HttpContext.Current.Response.Write(sw.ToString());
                HttpContext.Current.Response.End();
            
        
    

    /// <summary>
    /// Replace any of the contained controls with literals
    /// </summary>
    /// <param name="control"></param>
    private static void PrepareControlForExport(Control control)
    
        for (int i = 0; i < control.Controls.Count; i++)
        
            Control current = control.Controls[i];
            if (current is LinkButton)
            
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text));
            
            else if (current is ImageButton)
            
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText));
            
            else if (current is HyperLink)
            
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text));
            
            else if (current is DropDownList)
            
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedItem.Text));
            
            else if (current is CheckBox)
            
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "True" : "False"));
            

            if (current.HasControls())
            
                GridViewExportUtil.PrepareControlForExport(current);
            
        
    

您好,此解决方案是将您的网格视图导出到您的 excel 文件,它可能会帮助您

【讨论】:

不,这会生成标记为 Excel 文件而不是真正的 Excel 文件的 HTML。是的,Excel 本身会打开它,但其他使用电子表格的程序(例如 Microsoft 的免费 Excel 查看器)不会接受它。您最好使用此处的库之一创建一个真正的 Excel 文件。 您还应该使用System.Net.Mime.ContentDisposition 来生成内容处置标题文本,而不是附加字符串 - 这将正确处理包含空格等的文件名。 GridViewExportUtil 仅适用于 Web。对于 Windows 窗体、WPF、控制台、服务窗口、单元测试或插件?【参考方案27】:

那么使用 Open XML SDK 2.0 for Microsoft Office 怎么样?

一些好处:

不需要安装 Office 由 Microsoft 制造 = 不错的 MSDN 文档 项目中只需使用一个 .Net dll SDK 附带了许多工具,例如 diff、validator 等

链接:

Github Main MSDN Landing "How Do I..." starter page blogs.MSDN brian_jones announcing SDK blogs.MSDN brian_jones describing SDK handling large files without crashing (unlike DOM method)

【讨论】:

需要注意的是,用于此的 DLL 刚刚超过 5 MB,并且仅限于 Office 2007 格式。但肯定是对我有用的最简单、最快的解决方案。 请注意,v2.5 已经发布,可以下载here。 SDK 将 XML 建模为类,以便每个 XML 标签映射到一个标签,然后您必须正确构建类层次结构(每个实例都有一个子实例/标签的集合)。这意味着您必须了解 Excel 文件的 XML 结构,这非常复杂。使用上面提到的 EPPlus 等包装器要容易得多,它可以简化事情。 可以在polymathprogrammer.com/2012/08/06/… 找到 Microsoft Open XML SDK - Open XML Writer 的一个很好的示例或查看 Stack Overflow 解决方案***.com/questions/11370672/… 我发现 Microsoft Open XML SDK 的 Open XML Writer 很棒。使用上面的解决方案(特别是文森特汤姆的示例(Poly Math)),很容易构建一个通过大量数据流传输的写入器,并以与您的工作相似且不太复杂的方式写入记录CSV;但是您正在编写xml。 Open XML 是 Microsoft 认为它是新的 Office 格式的心态。如果您想查看它们的 XML 内容,您可以随时将它们从 .xslx 重命名为 .zip 文件。【参考方案28】:

只想添加对直接解决您的问题的第三方解决方案的另一个引用:http://www.officewriter.com

(免责声明:我为制作 OfficeWriter 的公司 SoftArtisans 工作)

【讨论】:

【参考方案29】:

这是一个完全免费的 C# 库,可让您使用 OpenXML 库从 DataSetDataTableList&lt;&gt; 导出到真正的 Excel 2007 .xlsx 文件:

http://mikesknowledgebase.com/pages/CSharp/ExportToExcel.htm

免费提供完整的源代码以及说明和演示应用程序。

将此类添加到您的应用程序后,您只需一行代码即可将 DataSet 导出到 Excel:

CreateExcelFile.CreateExcelDocument(myDataSet, "C:\\Sample.xlsx");

没有比这更简单的了......

而且它甚至不需要 Excel 出现在您的服务器上。

【讨论】:

这似乎有点误导,因为您要求捐款以获得所有功能。 部分正确:完全免费的版本将为您生成完美的.xlsx 文件,并提供所有源代码。如果您向这两个慈善机构之一捐赠 10 美元或更多(我绝对没有收到任何捐款),那么您会得到一个“更好”的版本,显示如何进行格式化、日期等。考虑到第三方产品的成本,我认为相反,向一个好的事业捐赠 10 美元是非常值得的!【参考方案30】:

我正在使用以下代码创建 excel 2007 文件,该文件创建文件并写入该文件,但是当我打开文件但它给了我错误 exel 无法打开文件 bcz 文件可能已损坏或文件扩展名不兼容。 但如果我使用 .xls 作为文件,它可以正常工作

for (int i = 0; i < TotalFile; i++)

    Contact.Clear();
    if (innerloop == SplitSize)
    
        for (int j = 0; j < SplitSize; j++)
        
            string strContact = DSt.Tables[0].Rows[i * SplitSize + j][0].ToString();
            Contact.Add(strContact);
        
        string strExcel = strFileName + "_" + i.ToString() + ".xlsx";
                         File.WriteAllLines(strExcel, Contact.ToArray());
    

参考链接

http://dotnet-magic.blogspot.in/2011/10/createformat-excel-file-from-cnet.html

【讨论】:

这一切都依赖于您的Contact 课程,而您还没有告诉我们那是什么。如果它适用于 xls,那么您实际上可能正在写出不是真正的 Excel 文件的 HTML。而且您的链接正在使用互操作,as mentioned above 不应该在服务器端使用,并且填充大表可能会很慢。 联系人是链表而不是类。声明一个链表并使用它,因为我不知道数据的大小,所以我使用链表。 哦,所以您正在生成一个每行一个项目的纯文本文件?所以 Excel 将其视为没有逗号的 CSV?

以上是关于如何在C#中写Excel文件的主要内容,如果未能解决你的问题,请参考以下文章

Java 出力Excel 文件,并向该文件中写固定格式的日期。我往文件里写的是yyyy-mm-dd

如何在 C# 中将文件导出到 excel 2007+

如何在 C# 中读取 excel 文件而不使用 Microsoft.Office.Interop.Excel 库

c# 如何设置excel文件名

C#如何读取带密码的Excel文件

如何在 C# 中将 Excel 文件的一部分转换为简化的 DataSet?