今天写了一个将Excel表里的数据导入dataGridView的一个小程序,在网上找了很多材料,结果不是这有问题,就是那无法进行下去,真是一波三折呀,也让我长了很多见识。现在将遇到的问题和解决办法记录下来,供以后复习也供大家参考。

     实现功能:

      1、选择文件地址

      2、导入Excel表中的其中一张指定的表

      3、将指定的表里的内容显示到dataGridView中

     现将代码原型展示如下:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Drawing;
  5 using System.Linq;
  6 using System.Text;
  7 using System.Windows.Forms;
  8 using System.Data.OleDb;
  9 using System.Data;
 10 
 11 namespace CreatData
 12 {
 13     public partial class Form1 : Form
 14     {
 15         public Form1()
 16         {
 17             InitializeComponent();
 18         }
 19         /// <summary>
 20         /// 读取文件路径到textBox中
 21         /// </summary>
 22         /// <param name="sender"></param>
 23         /// <param name="e"></param>
 24         private void btn1_Click(object sender, EventArgs e)
 25         {
 26             OpenFileDialog odXls = new OpenFileDialog(); 
 27             odXls.InitialDirectory = "C://";  
 28             // 设置文件格式  
 29             odXls.Filter = "Excel files (*.xls)|*.xls";  
 30             odXls.FilterIndex = 2;  
 31             odXls.RestoreDirectory = true;
 32             if (odXls.ShowDialog() == DialogResult.OK & odXls.FileName.Length == 0)
 33             {
 34                 MessageBox.Show("请选择要导入的文件", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
 35                 return;
 36             }
 37             else
 38             {
 39                 txtFilePath.Text = odXls.FileName.ToString();
 40             }
 41         }
 42         /// <summary>
 43         /// 将excel里的数据填充到dataGridView中
 44         /// </summary>
 45         /// <param name="sender"></param>
 46         /// <param name="e"></param>
 47         private void btn2_Click(object sender, EventArgs e)
 48         {
 49             DataTable dt = ReadExcelToGrid();
 50             for (int i = 0; i < dt.Columns.Count; i++)
 51             {
 52                 comboBox1.Items.Add(dt.Columns[i].ToString());
 53             }   
 54         }
 55 
 56         private DataTable ReadExcelToGrid()
 57         {
 58             OleDbConnection ole = null;
 59             OleDbDataAdapter da = null;
 60             DataTable dt = null;
 61             string strConn = "Provider=microsoft.ACE.oledb.12.0;"
 62                                 + "Data Source=" + txtFilePath.Text.Trim() + ";"
 63                                 + "Extended Properties=Excel 12.0";
 64             string sTableName = tableName.Text.Trim();
 65             string strExcel = "select * from [" + sTableName + "$]";
 66             try
 67             {
 68                 ole = new OleDbConnection(strConn);
 69                 ole.Open();
 70                 da = new OleDbDataAdapter(strExcel, ole);
 71                 dt = new DataTable();
 72                 da.Fill(dt);
 73                 dataGridView1.DataSource = dt;
 74                 for (int i = 0; i < dt.Columns.Count; i++)
 75                 {
 76                     for (int j = 0; j < dt.Rows.Count; j++)
 77                     {
 78                         dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
 79                     }
 80                 }
 81 
 82                 ole.Close();
 83             }
 84             catch (Exception Ex)
 85             {
 86                 MessageBox.Show(Ex.Message);
 87             }
 88             finally
 89             {
 90                 if (ole != null)
 91                     ole.Close();
 92             }
 93             return dt;
 94         }
 95 
 96         private void CreatDateBtn_Click(object sender, EventArgs e)
 97         {
 98             string BiginData = textBox1.Text.Trim();
 99             int CountData = Convert.ToInt16(CountBox.Text.Trim());
100             string LongData = LongBox.Text.Trim();
101             string Temp = null;
102            if (radioButton2.Checked ==true)
103             {
104                 for (int i = 0; i < CountData; i++)
105                 {
106                     Temp = BiginData.Trim() + "1"; 
107                 }
108             }
109             if (radioButton1.Checked == true)
110             {
111                 for (int i = 0; i < CountData; i++)
112                 {
113                     Temp = BiginData.Trim() + new Random().ToString();
114                 }
115             }
116         }
117 
118     }
119 }

运行后的界面:

 

遇到的问题:

1、   选择好文件后,在“文件路径”的文本框内不显示文件路径

2、 在将Excel表中的数据填入dataGridView时,显示了三个异常:a、Microsoft Jet 数据库引擎找不到对象'Sheet1$'。请确定对象是否存在; b、“未在本地计算机上注册“Microsoft. ACB.OLEDB.12.0”提供程序。”; C、“Microsoft Office Access 数据库引擎找不到对象“通讯录”

对于问题1:是因为我将显示路径的地址放错了,要放在else里面

对于问题2:a、是因为我之前使用的Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/1.xls;Extended Properties='Excel 8.0',但是我电脑是安装的Excel2007以上的版本,导致了Provider驱动无法使用,所以将驱动改成: Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:/1.xlsx;Extended Properties='Excel 12.0'。一定要将“Jet”换成“ACB”,因为Jet自从4.0以后就已经停产了,不支持64位程序。所以使用“ACB”来代替。

当我将“Jet 4.0”换成“ACB 12.0”以后,又发生了异常b,这是因为我的计算机上没有安装Microsoft.ACE.OLEDB.12.0的驱动。在微软以下地址就可以下载驱动:http://www.microsoft.com/downloads/details.aspx?FamilyID=c06b8369-60dd-4b64-a44b-84b371ede16d&displayLang=zh-cn  (已验证,可以安心下载) 安装以后,重启以下程序就可以了。

之后又发生了异常c。这是因为对于表名,必须在后边加上 $ 如:Sheet1$ 否则会发生以下异常:Microsoft Office Access 数据库引擎找不到对象“Sheet1”。请确定该对象存在,并正确拼写其名称和路径名

二、提取Excel表中的第一行作为ComboBox的Items

1 for (int i = 0; i < dt.Columns.Count; i++)
2 
3      {
4 
5          comboBox1.Items.Add(dt.Columns[i].ToString());
6 
7      }

关键是comboBox1.Items.Add()方法和定位Excel表的第一行。

 

posted on 2013-01-09 16:27  小美女一枚  阅读(804)  评论(0编辑  收藏  举报