读写Excel文件C#

4

2
可能是从C#创建Excel(.XLS和.XLSX)文件的重复问题。 - Neil Knight
是的,如果您想完全阅读和编辑Excel文件,则自动化接口可能是最佳选择。根据您想要做什么,有时可以使用简单的CSV文件。Excel可以轻松处理这些。但这只能用于创建Excel文件...您提出的问题是读取Excel文件...自动化接口...学习和使用(在其完整性方面)比较复杂,但您可以像手动操作表格一样对表格进行任何操作。 - Frank Merrow
你是要创建一个WinForm来完成这个任务还是其他类型的应用程序? - NDraskovic
11个回答

5
尝试这个:http://epplus.codeplex.com
EPPlus 是一款 .net 库,可以使用 Open Office Xml 格式(xlsx)来读写 Excel 2007/2010 文件。

4
如果您愿意使用Excel的较新版本(2007+),您也可以查看OpenXML SDK。它是免费的,不需要在运行它的计算机上安装MS Office,并且有许多在线资源可用来学习如何使用它(包括OpenXML团队的博客)。

3

1
你可以使用ExcelLibrary,它仅适用于2003格式的.xls文件。
该项目旨在提供一种本地.NET解决方案,以创建、读取和修改Excel文件,而不使用COM互操作或OLEDB连接。
我有机会使用EPPLUS,它非常好用:),它适用于新的excel格式.xlsx,用于2007/2010版本。
EPPlus是一个.NET库,您可以读写Excel文件,创建图表、图片、形状等等,而且还有更多功能。
另请参考这个SO post

1

1

我喜欢使用ExcelDataReader进行读取,同时用上述的EPPlus进行写入。这里有一个例子

以下是使用它进行读取的示例:

            FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);

        // Reading from a binary Excel file ('97-2003 format; *.xls)
        //            IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);

        // Reading from a OpenXml Excel file (2007 format; *.xlsx)
        IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);

        // DataSet - The result of each spreadsheet will be created in the result.Tables
        DataSet result = excelReader.AsDataSet();

        // Free resources (IExcelDataReader is IDisposable)
        excelReader.Close();

        var cdm = new ValueSetRepository();

        for (int i = 0; i < result.Tables.Count; i++)
        {
            // CHECK if tableNames filtering is specified
            if (tableNames != null)
            {
                // CHECK if a table matches the specified tablenames
                var tablename = result.Tables[i].TableName;
                if (!tableNames.Contains(tablename))
                {
                    continue;
                }
            }

            var lookup = new ValueSetLookup();
            lookup.CmsId = result.Tables[i].Rows[2][0].ToString();
            lookup.NqfNumber = result.Tables[i].Rows[2][1].ToString();
            lookup.Data = new List<ValueSetAttribute>();

            int row_no = 2;
            while (row_no < result.Tables[i].Rows.Count) // i is the index of table
            // (sheet name) which you want to convert to csv
            {
                var currRow = result.Tables[i].Rows[row_no];
                var valueSetAttribute = new ValueSetAttribute()
                {
                    Id = currRow[0].ToString(),
                    Number = currRow[1].ToString(),
                    tName = currRow[2].ToString(),
                    Code = currRow[7].ToString(),
                    Description = currRow[8].ToString(),
                };

                lookup.Data.Add(valueSetAttribute);
                row_no++;
            }

            cdm.AddRecord(lookup);

0
我曾经工作过的一家公司对此进行了大量研究,决定使用SoftArtisans的产品OfficeWriter

我总是觉得Excel读写的支持非常薄弱。 我很确定,如果你使用微软的库,你必须要安装Excel,这是像OfficeWriter一样的额外开销。


0

你可以选择使用VBA,或者使用FileHelpers提供的免费库。如果你计划购买一些商业解决方案,我建议使用ASPOSE


0
根据这个网站的说法,您需要包含对Microsoft Excel 12.0对象库的引用。然后,您需要执行一些操作来打开文件。该网站上有一个代码示例。
PS-很抱歉这不是太详细,但我找不到更多详细信息的Microsoft Office开发人员参考资料。

0

Excel库存在一个漏洞,无法在Excel 2010中打开由其生成的文件(至少不能针对<100列和行)。 - Stefan Steiger
真的吗?实际上,我处理的文件最多只有70-80行,从未出现过这个问题!感谢您让我知道! - Roberto Conte Rosito
更正:神奇数字是50,但通常似乎有些任意。我认为适当的定义是如果生成的文件流长度小于4096字节。而且只有在Excel 2010中会出现问题,在其他所有版本中都可以正常工作。 - Stefan Steiger

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