WinForm读取Excel文件

这两天做东西,用到了Excel。需要将Excel中的数据读取到内存中,经过处理后,保存到数据库中。在网上找了好多方法,但都有错误。现总结下:

1.引用Microsoft.Office.Interop.Excel

2.代码:

 

 
 
  1. /// <summary>  
  2.         /// 导入Excel文件,并显示在列表  
  3.         /// </summary>  
  4.         /// <param name="sender"></param>  
  5.         /// <param name="e"></param>  
  6.         private void btnImport_Click(object sender, EventArgs e)  
  7.         {  
  8.             string worksheetname = string.Empty;  
  9.             importtpye = cmbTicketType.Text;  
  10.             supplier = cmbSupplier.SelectedValue.ToString();  
  11.  
  12.             #region 导入本地Excel文件  
  13.  
  14.             //导入本地文件  
  15.             OpenFileDialog file = new OpenFileDialog();  
  16.             file.Filter = "文档(*.xls)|*.xls";  
  17.             if (file.ShowDialog() == DialogResult.OK)  
  18.                 btnImport.Tag = file.FileName;  
  19.             //判断有没有文件导入  
  20.             if (file.FileName.Length == 0)  
  21.             {  
  22.                 MessageBox.Show("请选择要导入的文件""提示", MessageBoxButtons.OK, MessageBoxIcon.Information);  
  23.                 return;  
  24.             }  
  25.  
  26.             #endregion  
  27.  
  28.             #region 获取Excel的工作表名称  
  29.             //创建Excel实例,获取worksheet Name  
  30.             Microsoft.Office.Interop.Excel.Application oExcel = new Microsoft.Office.Interop.Excel.Application();  
  31.             object objMissing = System.Reflection.Missing.Value;  
  32.             Microsoft.Office.Interop.Excel.Workbook myBook = (Microsoft.Office.Interop.Excel.Workbook)oExcel.Workbooks.Open(file.FileName, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing);  
  33.             Microsoft.Office.Interop.Excel.Sheets sheets = myBook.Worksheets;  
  34.             Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)sheets.get_Item(1);  
  35.             worksheetname = worksheet.Name;//获取worksheet Name  
  36.             oExcel.Quit();  
  37.             #endregion   
  38.  
  39.             dataTable.Rows.Clear();  
  40.             //将Excel表中的数据导入到Datatable中  
  41.             DataTable table = LoadExcelToDataTable(file.FileName, worksheetname);  
  42.               
  43.         }  

3.代码:

 

 
 
  1. /// <summary>  
  2.        /// 加载Excel表到DataTable,跟原始Excel表形式一样,需要筛选自己有用的数据  
  3.        /// </summary>  
  4.        /// <param name="filename">需要读取的Excel文件路径</param>  
  5.        /// <param name="sheetname">工作表名称</param>  
  6.        /// <returns>DataTable</returns>  
  7.        public static DataTable LoadExcelToDataTable(string filename, string worksheetname)  
  8.        {   
  9.            DataTable table;  
  10.            //连接字符串  
  11.            String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filename + ";" + "Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"";  
  12.            OleDbConnection myConn = new OleDbConnection(sConnectionString);  
  13.            string strCom = " SELECT * FROM [" + worksheetname + "$]";  
  14.            myConn.Open();  
  15.            OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);  
  16.            table = new DataTable();  
  17.            myCommand.Fill(table);  
  18.            myConn.Close();  
  19.            return table;  
  20.        } 

4.注意:有的人的连接字符串写成这样:

 
 
  1. //连接字符串  
  2.             String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" +   
  3.  
  4. filename + ";" + "Extended Properties=Excel 8.0;"

这样也可以读取到数据,但是,如果Excel表里的某一列中既有文本类型的值,又有数字类型的值,即混合类型的列,那么就会只读取到一种类型的值,另一种类型的就会为NULL。

 
 
  1. //连接字符串  
  2.             String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filename + ";" + "Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\""

这样,后边加上"HDR=Yse;IMEX=1",并且这句必须用引号引住,这样就会把混合类型的数据同一当作文本读取,不会出现丢数据的现象。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值