【问题标题】:Displaying values of excel Workbook in DataGridView C#在DataGridView C#中显示excel工作簿的值
【发布时间】:2017-01-23 13:26:00
【问题描述】:

我需要一些帮助来在 datagridview 中显示 excel 的值。 我设法显示值,但缺少一些值(列和行的值)。我的 excel 文件中有 1000 行,数据网格视图中仅显示 333 个项目。我有 148 列,但它只显示其中的一部分。谁能告诉我问题出在哪里。

这是我的代码:

     public partial class MainBagsakan : Form
     [enter image description here][1]
      String WOmain=@"C:\Users\tjjtabije\Desktop\TestExcelUpdater\TestUnoREFARM.xlsx";
      private string Excel07ConString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\t-jjtabije\\Desktop\\TestExcelUpdater\\TestUnoREFARM.xlsx;Extended Properties='Excel 12.0 Xml;IMEX=1;HDR=YES;TypeGuessRows=0;ImportMixedTypes=Text'";
      private void WorkOrderTab()
     {

        string filePath = Path.GetFullPath(WOmain);
        string extension = Path.GetExtension(filePath);
        string conStr, sheetName;
        conStr = string.Empty;

        //Get the name of the First Sheet.
        using (OleDbConnection con = new OleDbConnection(Excel07ConString))
        {
            using (OleDbCommand cmd = new OleDbCommand())
            {
                cmd.Connection = con;
                con.Open();
                DataTable dtExcelSchema = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                sheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();
                con.Close();
            }
        }
        using (OleDbConnection con = new OleDbConnection(Excel07ConString))
        {
            using (OleDbCommand cmd = new OleDbCommand())
            {
                using (OleDbDataAdapter oda = new OleDbDataAdapter())
                {
                    DataTable dt = new DataTable();
                    cmd.Connection = con;
                    cmd.CommandText = "SELECT * [" +sheetName+ "]";
                    con.Open();
                    oda.SelectCommand = cmd;
                    oda.Fill(dt);
                    con.Close();

                    //Populate DataGridView.
                    WorkLoadDisp.DataSource = dt;
                    label1.Text = dt.Rows.Count.ToString();
                }
            }
        }
    }

【问题讨论】:

  • 您应该在WorkLoadDisp.DataSource = dt; 设置一个断点并检查dt 中的内容。我猜你可能没有得到你认为应该得到的所有数据。只是猜测。
  • 您好,先生。断点是什么意思?请进一步解释,对不起,我是编程新手。是的,我没有得到excel上的所有数据。谢谢你的帮助
  • 如果您使用的是像 Visual Studio 这样的 IDE,您可以在一行代码上设置断点。 (右键单击-> 断点)当您运行代码时,它将在断点处停止执行。当它停止时,您可以检查您的变量,如 dt 以查看它们包含的内容。想法是您指向 DataGridView 未正确显示,但这很可能是,但是,在寻找 DataGridView 问题之前……确保您从 excel 获得的数据是正确的。希望这是有道理的。
  • 我已经做了断点,我看不懂它在说什么。
  • 我建议您查看帮助部分。在 VS 中,调试时在底部有选项卡以显示局部变量值。

标签: c# excel datagridview


【解决方案1】:

没有必要像使用两个单独的 using 子句一样打开和关闭连接两次。第一个只是获取工作表的名称,因为也可以返回命名范围。我只是将所有代码放在一个组中,它似乎按预期工作。

在 select 语句中添加了一个缺失的 FROM

cmd.CommandText = "SELECT * FROM [" + sheetName + "]";

我所做的更改如下...

using (OleDbConnection con = new OleDbConnection(Excel07ConString)) {
  using (OleDbCommand cmd = new OleDbCommand()) {
    using (OleDbDataAdapter oda = new OleDbDataAdapter()) {
      cmd.Connection = con;
      con.Open();
      DataTable dtExcelSchema = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
      sheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();
      DataTable dt = new DataTable(); 
      cmd.Connection = con;
      cmd.CommandText = "SELECT * FROM [" + sheetName + "]";
      //con.Open();
      oda.SelectCommand = cmd;
      oda.Fill(dt);
      con.Close();
      //Populate DataGridView.
      WorkLoadDisp.DataSource = dt;
      label1.Text = dt.Rows.Count.ToString();
    }
  }
}

希望这会有所帮助。

【讨论】:

  • 很高兴你能成功。正如我所说,请注意命名范围,因为这是使用以下行返回的内容:sheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString(); 在您的工作表中创建一个命名范围,看看它是否没有通过上面的行返回。只是提醒一下。
  • 好的,先生,谢谢您的提醒:)
猜你喜欢
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多