如何在C#中读取 .xls、.xlsx 和 .xlsm 文件

4

我使用openfiledialog并过滤它以获取:.xls,.xlsx和.xlsm文件。但是我不知道接下来该怎么做,我建立了一个拥有firstName和lastName的工人类,并且我想从Excel文件中取出数据并将其放入变量中。

这是我openfiledialog的代码:

 private void ExcelLoad_Click(object sender, EventArgs e)
    {
        int size = -1;
        openFileDialog1.Title = "Browse Excel file";
        openFileDialog1.Filter = "Excel Files|*.xls;*.xlsx;*.xlsm";
        DialogResult result = openFileDialog1.ShowDialog(); // Show the dialog.
        if (result == DialogResult.OK) // Test result.
        {
                string file = openFileDialog1.FileName;
                try
                {
                    string text = File.ReadAllText(file);
                    size = text.Length;
                }
                catch (IOException)
                {
                }
        }
        Console.WriteLine(size); // <-- Shows file size in debugging mode.
        Console.WriteLine(result); // <-- For debugging use.
        Stream  excelOpenFile= openFileDialog1.OpenFile();
    }

那么我如何读取这种类型的文件数据呢?(我已经成功打开了它,但不知道如何使用该文件并从中获取数据。)


在这里提问之前,您需要进行研究。请在谷歌上搜索“在C#中打开Excel文件”。 - Jeremy Thompson
可能是从C#读取Excel文件的重复问题。 - Jeremy Thompson
可能是重复的问题:如何在C#中打开Excel文件? - Behzad
2个回答

7
你需要使用读取XLS文件的库,参考从C#中读取Excel文件https://github.com/ExcelDataReader/ExcelDataReader
更新1:从Github上获取如何使用它,将其安装为Nuget包。

建议使用Nuget

Install-Package ExcelDataReader

当前的二进制文件仍然在codeplex网站上,但是这些文件不会再进行更新。如果有足够的要求,需要单独的二进制文件托管除了Nuget之外的其他解决方案。

更新2:用于从Excel Data Reader中读取的代码。
    FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);

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

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

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

//4. DataSet - Create column names from first row
excelReader.IsFirstRowAsColumnNames = true;
DataSet result = excelReader.AsDataSet();

//5. Data Reader methods
while (excelReader.Read())
{
    //excelReader.GetInt32(0);
}

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

在第三步之后,您将获得一个包含Excel数据的DataSet。
 DataSet result = excelReader.AsDataSet();

接下来,您可以使用以下代码迭代DataSet。
foreach (DataColumn col in result.Table[0].Columns)
{
     foreach (DataRow row in result.Table[0].Rows)
     {
          Console.WriteLine(row[col.ColumnName].ToString());           
     }
} 

PS:我只是用Table [0]来指定第一个数据表或来自第一个Excel工作表的数据。您也可以迭代各种数据表。


我下载了git文件,但如何在我的项目中使用它? - Nir
更新了答案,加入了“如何安装包”的信息。 - Abhinav Galodha
谢谢!我有一个问题,我写了“excelReader.GetValue(0)”(在之前做完所有工作后),它可以工作,但我无法去到其他行,只能到列。我该怎么办? - Nir
更新答案。请再次检查! - Abhinav Galodha
1
这段代码不能处理.xlsm文件,有什么建议吗? - Hany Hassan
@HanyHassan 它确实如此! - mlg

2
ExcelDataReader的最新版本(v3.6)支持读取.xlsm文件。它可以直接在Visual Studio中使用NuGet包管理器进行安装。我已经在VS2019 Community版中测试过,它可以工作。不需要安装Excel,也不使用Iterop或Oledb。但是,目标机器上运行应用程序需要.NET Framework v4.7或更高版本。
更多信息... https://www.youtube.com/watch?v=_h_4-HxrMMc 源代码
using ExcelDataReader;

...

class ExcelReader {

    public static DataTable ExcelToDataTable(String fileName) {

        using(var stream = File.Open(fileName, FileMode.Open, FileAccess.Read)) {
            using (var reader = ExcelReaderFactory.CreateReader(stream)) {
                var result = reader.AsDataSet(new ExcelDataSetConfiguration() {
                    ConfigureDataTable = (data) => new ExcelDataTableConfiguration() {
                        UseHeaderRow = true
                    }
                });

                DataTableCollection table = result.Tables;
                DataTable resultTable = table["Blad1"];
                return resultTable;
            }
        }

    }
}

注意: 不要忘记也安装“ExcelDataReader.Dataset”包。

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