使用C#读写Excel文件(.xls/.xlsx)

24

我该如何在C#中读写Excel文件? 我已经将Excel Objects Library添加到我的项目中,但是我没有得到足够清晰的描述以访问这些文件。

请帮助我理解。在解释时,请记住我有些新手,但我不是完全的菜鸟。我学习很多,所以我并不完全无知。


2
这是一个起点。访问Excel文件的基本示例 - Pedro Ferreira
7个回答

15

我非常喜欢使用EPPlus来执行这类操作。EPPlus是一个库,您可以在项目中引用它并在服务器上轻松创建/修改电子表格。我将其用于需要导出功能的任何项目。

这里有一篇不错的博客文章介绍如何使用该库,但该库本身应该附带一些示例,说明如何使用它。

在我看来,第三方库比微软的COM对象要容易使用得多。建议尝试一下。


5
请注意条件: "EPPlus是一个.NET库,使用Open Office Xml格式(xlsx)读写Excel 2007/2010文件。" 因此,.xls文件将无法使用。 - Muflix
2
链接已失效。我认为现在它需要许可证? - Piotr Kula
很遗憾,EPPlus 从版本5开始需要商业使用许可证,否则会抛出LicenseException异常。https://epplussoftware.com/developers/licenseexception - Leszek Jezierski
寻找V4.x版本。虽然可能无法从epplus.com获得。NPOI.dll对你也许有用(它可以读取.xls和.xlsx文件)。 - undefined

9

5
直观而强大的解决方案是 ClosedXML 库。它非常简单,可以读取和写入'closed' Excel 文件中的单元格,主要逻辑如下:
using Excel = ClosedXML.Excel;

namespace Excel_Tests
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

     private void button1_Click(object sender, EventArgs e)
     {
        //create 'workbook' object
        var wb = new Excel.XLWorkbook("E:\\test1.xlsx");
        
        //create 'worksheet' object
        var ws = wb.Worksheets.Worksheet("Sheet1");

        //read cells
        var a = ws.Cell("A1").Value;
        var b = ws.Cell("B1").Value;

        Console.WriteLine(a.ToString());
        Console.WriteLine(b.ToString());

        //write cells
        ws.Cell("F2").Value = 9999999;
        ws.Cell("F2").Value = 2.333;
        ws.Cell("G2").Value = "This is cell G2";
        
        wb.Save();

    }
  }
}

2
这是最新和最佳的答案。由于原始答案以来,所有其他项目都走了一些不同的方向。 - Piotr Kula
1
不错的解决方案,但请注意它仅支持Excel 2007+格式(如xlsx等),而不支持xls格式。 - Ed Guiness
1
是的,但现在已经接近2023年了... - Lorenzo Bassetti

2

您可以使用Excel自动化(基本上是COM基础知识)例如:

Excel.Application xlApp ;
Excel.Workbook xlWorkBook ;
Excel.Worksheet xlWorkSheet ;


xlApp = new Excel.ApplicationClass();
xlWorkBook = xlApp.Workbooks.Open("1.xls", 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

Link to the full tutorial


1
但是您需要在服务器上安装Office DLL。EPPlus直接使用OOXML读写文件,这非常好。 - Piotr Kula

1
如果您想使用易于使用的库,可以使用NUGET包
  • ExcelDataReader - 用于读取Excel文件(大多数文件格式)
  • SwiftExcel - 用于编写Excel文件(.xlsx)
请注意这些是第三方包 - 您可以免费使用它们进行基本功能,但如果您想要更多功能,可能会有“专业版”。
它们使用二维对象数组(即object[][] cells)来读取/写入数据。

1
**Reading the Excel File:**

string filePath = @"d:\MyExcel.xlsx";
Excel.Application xlApp = new Excel.Application();  
Excel.Workbook xlWorkBook = xlApp.Workbooks.Open(filePath);  
Excel.Worksheet xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);  

Excel.Range xlRange = xlWorkSheet.UsedRange;  
int totalRows = xlRange.Rows.Count;  
int totalColumns = xlRange.Columns.Count;  

string firstValue, secondValue;   
for (int rowCount = 1; rowCount <= totalRows; rowCount++)  
{  
    firstValue = Convert.ToString((xlRange.Cells[rowCount, 1] as Excel.Range).Text);  
    secondValue = Convert.ToString((xlRange.Cells[rowCount, 2] as Excel.Range).Text);  
    Console.WriteLine(firstValue + "\t" + secondValue);  
}  
xlWorkBook.Close();  
xlApp.Quit(); 


**Writting the Excel File:**

Excel.Application xlApp = new Excel.Application();
object misValue = System.Reflection.Missing.Value;  

Excel.Workbook xlWorkBook = xlApp.Workbooks.Add(misValue);  
Excel.Worksheet xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);  

xlWorkSheet.Cells[1, 1] = "ID";  
xlWorkSheet.Cells[1, 2] = "Name";  
xlWorkSheet.Cells[2, 1] = "100";  
xlWorkSheet.Cells[2, 2] = "John";  
xlWorkSheet.Cells[3, 1] = "101";  
xlWorkSheet.Cells[3, 2] = "Herry";  

xlWorkBook.SaveAs(filePath, Excel.XlFileFormat.xlOpenXMLWorkbook, misValue, misValue, misValue, misValue,  
Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);  



xlWorkBook.Close();  
xlApp.Quit();  

0

如果您只需要进行简单的操作并且可以使用 xlsx 格式,那么您可以尝试自己操纵 XML。我已经这样做过,并发现它比解析 Excel 库更快。

还有一些第三方库可以更容易地使用... 并且可以在服务器上使用,而 Microsoft 的库则不能。


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