c# - 读取excel表格 - npoi下载




从C#创建Excel(.XLS和.XLSX)文件 (20)

如何在运行代码的计算机上安装不需要Excel的情况下如何使用C#创建Excel电子表格?


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

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

如果您的导出目的是为了执行服务器端,强调要导出的数据并且没有链接到UI,那么我会选择其中一个免费的开源选项(例如ExcelLibrary)。

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


OpenXML也是一个很好的选择,它有助于避免在服务器上安装MS Excel。由Microsoft提供的Open XML SDK 2.0简化了操作包中的Open XML包和底层Open XML模式元素的任务。 Open XML应用程序编程接口(API)封装了开发人员在Open XML包上执行的许多常见任务。

检查一下OpenXML:可以避免在服务器上安装MS Excel的替代方法


Syncfusion Essential XlsIO可以做到这一点。 它不依赖于Microsoft Office,并且对不同的平台有特定的支持。

代码示例:

//Creates a new instance for ExcelEngine.
ExcelEngine excelEngine = new ExcelEngine();
//Loads or open an existing workbook through Open method of IWorkbooks
IWorkbook workbook = excelEngine.Excel.Workbooks.Open(fileName);
//To-Do some manipulation|
//To-Do some manipulation
//Set the version of the workbook.
workbook.Version = ExcelVersion.Excel2013;
//Save the workbook in file system as xlsx format
workbook.SaveAs(outputFileName);

如果您符合条件(少于100万美元的收入),整套控件可通过社区许可计划免费获得。 注意:我为Syncfusion工作。


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

我意识到,您可能不会在Web应用程序中编写此代码,但此处是通过HTML表格组成Excel文件的example 。 如果您正在编写控制台应用程序,桌面应用程序或服务,则可以使用此技术。



你实际上可能想查看互操作类 。 你说没有OLE(这不是),但互操作类很容易使用。

如果你还没有尝试过,你可能会留下深刻的印象。

请注意微软对此的stance

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


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

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


商业解决方案SpreadsheetGear for .NET将做到这一点。

您可以在这里看到实时的ASP.NET(C#和VB)示例herehere下载评估版本。

免责声明:我自己的SpreadsheetGear LLC


好,

您还可以使用Aspose等第三方库。

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


如果您对xlsx格式感到满意,请尝试使用我的codeplex GitHub项目。 EPPlus 。 从ExcelPackage的源头开始它,但今天它是一个完全重写。 支持范围,单元格样式,图表,形状,图片,名称范围,自动过滤器和其他许多东西。


对于较小的Excel文件,可以使用各种Office 2003 XML库。 但是,我发现以XML格式保存的大型工作簿的规模是一个问题。 例如,我使用的工作簿将是40MB(新的压缩包),XLSX格式将成为一个360MB的XML文件。

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

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

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


您可以使用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文件: http://officehelper.codeplex.com/documentation : 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};
    }
}


我刚刚使用FlexCel.NET ,发现它是一个优秀的图书馆! 我没有说太多的软件产品。 在这里给出整个销售点没有意义,你可以阅读他们网站上的所有功能。

它是一种商业产品,但如果您购买它,您将获得全部资源。 所以我想你可以编译成你的程序集,如果你真的想。 否则,它只是一个额外的xcopy组件 - 不需要配置或安装或类似的东西。

我认为如果没有第三方库,.NET框架就没有办法做到这一点,显然,它没有内置的支持,而OLE自动化只是一个痛苦的世界。



我用过的几个选项:

如果XLSX是必须的: ExcelPackage是一个好的开始,但是当开发人员退出时,它就离开了。 ExML从那里拿起并添加了一些功能。 ExML并不是一个糟糕的选择,我仍然在几个制作网站中使用它。

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



这里有一种方法可以用LINQ to XML来完成,并附有示例代码:

使用LINQ to XML快速导入和导出Excel数据

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

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






file-io