【问题标题】:C# | How to display Excel sheets on DataGrindView?C# |如何在 DataGrindView 上显示 Excel 工作表?
【发布时间】:2021-04-19 19:37:26
【问题描述】:

我正在尝试在 DataGrindView 上显示 Excel 工作表。我在互联网上找到了一个解决方案,但是当我尝试浏览 Excel 文件时出现错误。有人可以帮我解决这个问题吗?

浏览按钮代码如下:

private void btnBrowse_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog openFileDialog = new OpenFileDialog() { Filter = "Excel 97-2003 Workbook|*.xls|Excel Workbook|*.xlsx" })
            {
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    txtFilename.Text = openFileDialog.FileName;
                    using (var stream = File.Open(openFileDialog.FileName, FileMode.Open, FileAccess.Read))
                    {
                        using (IExcelDataReader reader = ExcelReaderFactory.CreateReader(stream))
                        {
                            DataSet result = reader.AsDataSet(new ExcelDataSetConfiguration()
                            {
                                ConfigureDataTable = (_) => new ExcelDataTableConfiguration() { UseHeaderRow = true }
                            });
                            tableCollection = result.Tables;
                            cboxSheet.Items.Clear();
                            foreach (DataTable table in tableCollection)
                                cboxSheet.Items.Add(table.TableName);//add sheet to combobox
                        }
                    }
                }
            }
        }

编辑:

你好,

这是我第一次在 Stackoverflow 上发帖,对我的错误深表歉意。

我将更详细地解释项目和错误。

This's my Form Application format

这是表单代码。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using ExcelDataReader;
using System.Data.OleDb;

namespace emailsender
{
    public partial class Form2 : Form
    {

        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }



        private void cboxSheet_SelectedIndexChanged(object sender, EventArgs e)
        {

            dataGridView1.DataMember = cboxSheet.SelectedItem.ToString();
        }

        private void btnBrowse_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog openFileDialog = new OpenFileDialog() { Filter = "Excel 97-2003 Workbook|*.xls|Excel Workbook|*.xlsx" })
            {
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    txtFilename.Text = openFileDialog.FileName;
                    using (var stream = File.Open(openFileDialog.FileName, FileMode.Open, FileAccess.Read))
                    {
                        using (IExcelDataReader reader = ExcelReaderFactory.CreateReader(stream))
                        {
                            DataSet result = reader.AsDataSet(new ExcelDataSetConfiguration()
                            {
                                ConfigureDataTable = (_) => new ExcelDataTableConfiguration() { UseHeaderRow = true }
                            });
                            //tableCollection = result.Tables;
                            cboxSheet.Items.Clear();
                            foreach (DataTable table in result.Tables)
                                cboxSheet.Items.Add(table.TableName);//add sheet to combobox
                            dataGridView1.DataSource = result;
                            cboxSheet.SelectedIndex = 0;
                        }
                    } 
                }
            }
        }
    }
}

我尝试了@JohnG's 示例,但是当我使用文件资源管理器选择文件并按下打开按钮时,我得到了同样的错误。

System.NotSupportedException: 'No data is available for encoding 1252. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.

我无法完全理解我错过的重点......

【问题讨论】:

  • 之前有人问过这个问题,你看看这对你有用吗? import-excel-to-datagridview
  • 不适合我..
  • 你说它不起作用,你能解释一下到底是什么不起作用吗?
  • 我编辑了帖子并试图更详细地解释问题。抱歉解释不好..
  • 请看我更新的答案。您的应用程序似乎是使用不同编码的“.Net”应用程序。

标签: c# excel datagridview


【解决方案1】:

你的问题有点不清楚......标题表明你想要“在 DataGridView 上显示 Excel 工作表”......这当然是可行的,但是,我在代码中没有看到任何尝试将 DataGridView 设置为 Excel 工作表之一。发布的代码确实成功地将选定的 Excel 文件读入 DataSet. 然后代码将每个工作表名称作为一个项目添加到组合框中 cboxSheet.

这一切似乎都有效。因此,鉴于您的问题,我假设在同一 Form 上存在一个 DataGridView,其中包含由发布的代码填充的 ComboBox。我假设您希望用户能够从组合框中选择特定的工作表,然后将该工作表显示在 DataGridView. 如果这是您想要的,那么幸运的是,您已经完成了大部分艰苦的工作......即,创建一个DataSet,其中DataSet 中的每个DataTable 都是所选Excel 文件中的工作表之一。

假设Form上有一个DataGridView,代码读取Excel文件后需要将其设置为DataSource。幸运的是,代码正在创建一个名为resultDataSet,我们可以将其用作网格的DataSource。像……

dataGridView1.DataSource = result;

这会将网格的DataSource 设置为DataSet. 为了显示来自DataSet 的特定DataTable,代码需要将网格的DataMember 属性设置为DataTable 的名称我们想要显示...幸运的是,我们将所有这些名称方便地存储在组合框中。

因此,在代码设置了网格的DataSource之后,我们还可以将组合框选择设置为数据集中的第一个表,然后设置网格的DisplayMamber在网格中显示选中的工作表……或者……因为我们知道我们希望网格在用户更改组合框中的选择时显示不同的表格,所以无论如何我们都必须“连接/订阅”ComboBoxesSelectedIndexChanged 事件。

所以,在设置了 grids 数据源之后,如果我们简单地将组合框的选中项设置为组合框中的第一项,SelectedIndexChanged 事件应该会处理其余的事情。组合框SelectedIndexChanged 事件只需要一行代码即可更改网格显示表。它可能看起来像……

private void cboxSheet_SelectedIndexChanged(object sender, EventArgs e) {
  dataGridView1.DataMember = cboxSheet.SelectedItem.ToString();
}

组合框SelectedIndexChanged 事件连线后,您当前的代码只需添加两行,如下所示。注意我删除了tableCollection,因为它不需要。

private void ReadExcelFileFillCombo() {
  using (OpenFileDialog openFileDialog = new OpenFileDialog() { Filter = "Excel 97-2003 Workbook|*.xls|Excel Workbook|*.xlsx" }) {
    if (openFileDialog.ShowDialog() == DialogResult.OK) {
      txtFilename.Text = openFileDialog.FileName;
      using (var stream = File.Open(openFileDialog.FileName, FileMode.Open, FileAccess.Read)) {
        using (IExcelDataReader reader = ExcelReaderFactory.CreateReader(stream)) {
          DataSet result = reader.AsDataSet(new ExcelDataSetConfiguration() {
            ConfigureDataTable = (_) => new ExcelDataTableConfiguration() { UseHeaderRow = true }
          });
          //tableCollection = result.Tables;
          cboxSheet.Items.Clear();
          foreach (DataTable table in result.Tables)
            cboxSheet.Items.Add(table.TableName);//add sheet to combobox
          dataGridView1.DataSource = result;
          cboxSheet.SelectedIndex = 0;
        }
      }
    }
  }
}

我希望这是有道理的。

根据 OP 更新和 cmets 进行编辑

我只能猜测您收到所显示错误的原因是因为您“创建”了错误的应用程序“类型”。我将假设您当前的应用程序是使用 .Net “Core” 应用程序创建的。据我了解,.Net Core 使用了不同的“编码”,这导致了您看到的错误。我建议你看看 SO question...。

System.NotSupportedException: No data is available for encoding 1252

如果您想使用 .Net Core 应用程序,那么您可能需要遵循上述答案中的建议。但是,如果您创建“.Net Framework”而不是“.Net”应用程序,我相信这将解决问题。下面是使代码正常工作所需的正确应用程序的图片。注意……红色不是你想要的,绿色……“.Net Framework”是你想要使用的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 2013-03-10
    • 2017-05-08
    • 2011-03-31
    • 1970-01-01
    相关资源
    最近更新 更多