【问题标题】:how to read .xls and .xlsx and .xlsm files in c#如何在 C# 中读取 .xls 和 .xlsx 和 .xlsm 文件
【发布时间】:2015-07-19 14:25:22
【问题描述】:

我使用 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


【解决方案1】:

您需要使用库来读取 XLS 文件,

参考Reading Excel files from C# & https://github.com/ExcelDataReader/ExcelDataReader

更新 1: 来自Github,如何使用,将包安装为nuget包。

推荐使用Nuget

安装包 ExcelDataReader

当前的二进制文件仍在 codeplex 网站上,但这些文件将 以后不再更新。如果有足够的请求 除了 nuget 之外的单独二进制托管,那么我们会想出一些 其他解决方案。

更新 2:从 Excel 数据阅读器读取代码

    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();

在第 3 步之后,您将在 DataSet 中获取 Excel 数据

 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());           
     }
} 

P.S:我使用Table[0] 只是为了指定第一个 DataTable 或第一个 Excel 表中的数据。您也可以遍历各种数据表。

【讨论】:

  • 我下载了 git 文件,但我如何在我的项目中使用它?
  • 用“如何安装软件包”的信息更新了答案
  • 谢谢!我有一个问题,我写了“excelReader.GetValue(0)”(在完成所有工作人员之前)并且它工作但我不能去其他行只是到 culloms。我该怎么办
  • 再次更新答案。请检查!
  • 此代码不适用于 .xlsm 文件,有什么建议吗?
【解决方案2】:

最新版本的 ExcelDataReader (v3.6) 支持读取 .xlsm 文件。它可以使用 Visual Studio 中的 NuGet 包管理器直接安装。 我已经在 VS2019 社区版中对其进行了测试,并且可以正常工作。 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”包。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-29
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    相关资源
    最近更新 更多