如何使用C#创建Excel电子表格而不需要在运行代码的计算机上安装Excel?
当前回答
一些第三方组件供应商,如Infregistics或Syncfusion,提供了非常好的Excel导出功能,不需要安装Microsoft Excel。
由于这些供应商还提供高级UI网格组件,如果您希望excel导出的样式和布局模拟应用程序用户界面中网格的当前状态,这些组件特别方便。
如果您的导出是在服务器端执行的,重点是要导出的数据,并且没有到UI的链接,那么我会选择一个免费的开源选项(例如ExcelLibrary)。
我以前参与过一些试图在Microsoft Office套件上使用服务器端自动化的项目。根据这一经验,我强烈建议反对这种做法。
其他回答
从C#创建Excel文件的最简单和最快捷的方法是使用OpenXMLProductivity工具。OpenXMLProductivity工具随OpenXMLSDK安装一起提供。该工具将任何Excel文件反向工程为C#代码。然后可以使用C#代码重新生成该文件。
所涉及的流程概述如下:
使用该工具安装OpenXMLSDK。使用具有所需外观的最新Excel客户端创建Excel文件。将其命名为DesiredLook.xlsx。使用该工具打开DesiredLook.xlsx并单击顶部附近的Reflect Code按钮。文件的C#代码将在工具的右窗格中生成。将其添加到C#解决方案中,并生成具有所需外观的文件。
另外,此方法适用于任何Word和PowerPoint文件。作为C#开发人员,您将根据需要对代码进行更改。
我在github上开发了一个简单的WPF应用程序,将在Windows上运行。有一个名为GeneratedClass的占位符类,您可以在其中粘贴生成的代码。如果您返回文件的一个版本,它将生成如下excel文件:
要将xls保存为xlsx格式,我们只需要从Microsoft.Office.Interop.Excel库调用SaveAs方法。该方法将采用大约16个参数,其中一个参数是文件格式。
Microsoft文档:此处另存为方法参数
我们需要传递的对象如下
wb.SaveAs(filename, 51, System.Reflection.Missing.Value,
System.Reflection.Missing.Value, false, false, 1,1, true,
System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value)
这里,51是XLSX的枚举值
对于不同文件格式的另存为,可以参考xlFileFormat
商业解决方案SpreadsheetGearfor.NET将做到这一点。
您可以在此处查看ASP.NET(C#和VB)的实时示例,并在此处下载评估版本。
免责声明:我拥有SpreadsheetGear LLC
各种Office 2003 XML库适用于较小的excel文件。然而,我发现以XML格式保存的大型工作簿的大小是一个问题。例如,我使用的新XLSX格式的工作簿将是40MB(当然也更紧凑),它将变成360MB的XML文件。
就我的研究而言,有两个商业软件包允许输出到较旧的二进制文件格式。他们是:
宝石盒ComponentOne Excel
两者都不便宜(我认为分别为500美元和800美元)。但两者都独立于Excel本身。
我会好奇的是OpenOffice.org之类的Excel输出模块。我想知道它们是否可以从Java移植到.Net。
检查一下,不需要第三方库,您可以使用以下命令将数据表数据导出到excel文件
var dt = "your code for getting data into datatable";
Response.ClearContent();
Response.AddHeader("content-disposition", string.Format("attachment;filename={0}.xls", DateTime.Now.ToString("yyyy-MM-dd")));
Response.ContentType = "application/vnd.ms-excel";
string tab = "";
foreach (DataColumn dataColumn in dt.Columns)
{
Response.Write(tab + dataColumn.ColumnName);
tab = "\t";
}
Response.Write("\n");
int i;
foreach (DataRow dataRow in dt.Rows)
{
tab = "";
for (i = 0; i < dt.Columns.Count; i++)
{
Response.Write(tab + dataRow[i].ToString());
tab = "\t";
}
Response.Write("\n");
}
Response.End();
推荐文章
- _ViewStart的位置和方式。CSHTML布局文件链接?
- 新建T()
- 如何将枚举绑定到WPF中的组合框控件?
- 拒绝访问该路径
- Visual Studio - Resx文件默认“内部”为“公共”
- 使用linq转换列表到字典,不用担心重复
- 单元测试:日期时间。现在
- 什么是回调?
- .NET中的KeyDown和KeyPress有什么区别?
- 返回匿名类型的结果?
- 你能解释一下流的概念吗?
- 何时使用IList,何时使用List
- ConfigurationManager。AppSettings在.NET Core 2.0中可用?
- 在c#的控制台应用程序中使用'async
- 在单元测试中设置HttpContext.Current.Session