c#读取excel文件

原文地址:http://blog.csdn.net/dannywj1371/article/details/7447710


使用OLEDB可以对excel文件进行读取,我们只要把该excel文件作为数据源即可。

一 在D盘创建excel文件test.xls:


二 将工作表Sheet1的内容读取到DataSet

string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+
    "Extended Properties='Excel 8.0'";
DataSet ds = new DataSet();
OleDbDataAdapter oada = new OleDbDataAdapter( "select * from [Sheet1$]", strConn);
oada.Fill(ds);

读取的DataSet为:


从图中可以看出excel文件中的第一行变成了DataSet中的列名,这正是系统的默认设置。

三 如果想把第一行也作为数据行,那我们可以给连接字符串添加一个HDR=No属性

如:

string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+
    "Extended Properties='Excel 8.0;HDR=No'";
DataSet ds = new DataSet();
OleDbDataAdapter oada = new OleDbDataAdapter( "select * from [Sheet1$]", strConn);
oada.Fill(ds);
结果也许会让你有点想不到:


第一行的第一列和第三列都变成空的了,这是因为系统把第一列识别成了数字,把第三列识别成了日期,而第一行的数据不符合格式的要求,所以就变成空的了。

四 我们还可以把所有列都做为字符串来读取,只要添加属性IMEX=1即可

string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+
    "Extended Properties='Excel 8.0;HDR=No;IMEX=1'";
DataSet ds = new DataSet();
OleDbDataAdapter oada = new OleDbDataAdapter( "select * from [Sheet1$]", strConn);
oada.Fill(ds);
结果又会如何呢?


是不是再次出乎你的意料,第三行的日期怎么变成数字了,其实excel在转换格式的时候就自动把日期变成数字了,那这个数字是怎么来的呢 ? 如果你把日期改成1900年1月1日,那么你可以看到他的转换结果是1,以此类推,39902是哪一天就明白了吧。

五 也许你并不想读取整个excel的内容

如果只想读取前两列可以用:select * from [Sheet1$A:B]

如果只想读取A1到B2的内容,就用:select * from [Sheet1$A1:B2]

六 如果不知道工作表的名字或名字被人为修改了该怎么办呢?

我们可以通过索引来获取指定工作表的名字,以下方法可以用来获取工作表名称的数组:

ArrayList al = new ArrayList();
string strConn;
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+
    "Extended Properties=Excel 8.0;";
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
DataTable sheetNames = conn.GetOleDbSchemaTable
    (OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
conn.Close();
foreach (DataRow dr in sheetNames.Rows)
{
    al.Add(dr[2]);
}
return al;

 

 修正:

IMEX=1的时候并不是全都会作为字符串来处理,根据系统的默认设置,通常如果前8行有字符串,则该列会作为字符串来处理,如果全都为数字,则该列为数字列,日期也是一样。

如果你觉得8行不够或者太多了,则只能修改注册表HKEY_LOCAL_MACHINE/Software/Microsoft/Jet/4.0/Engines/Excel/TypeGuessRows,如果此值为0,则会根据所有行来判断使用什么类型,通常不建议这麽做,除非你的数据量确实比较少。

=====================================================================================

一.使用OleDb,这个法子好像不大好使.容易读错.
引用System.Data.OleDb;

     /// <summary>
        
/// 返回Excel数据源
        
/// </summary>
        
/// <param name="filename">文件路径</param>
        
/// <returns></returns>

     static   public  DataSet ExcelToDataSet( string  filename)
    
{
        DataSet ds;
        
string strCon = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                        
"Extended Properties=Excel 8.0;" +
                        
"data source=" + filename;
        OleDbConnection myConn 
= new OleDbConnection(strCon);
        
string strCom = " SELECT * FROM [Sheet1$]";
        myConn.Open();
        OleDbDataAdapter myCommand 
= new OleDbDataAdapter(strCom, myConn);
        ds 
= new DataSet();
        myCommand.Fill(ds);
        myConn.Close();
        
return ds;
    }

二.使用com.
导入Microsoft.Excel
使用命名空间
using Excel= Microsoft.Office.Interop.Excel;
using System.Diagnostics;
public    class  ExcelHelper
    
{
      
private Excel._Application excelApp;
      
private string fileName=string.Empty;
      
private Excel.WorkbookClass wbclass;
      
public ExcelHelper(string _filename)
      
{
          excelApp 
= new Excel.Application();
          
object   objOpt   =   System.Reflection.Missing.Value;
          wbclass 
= (Excel.WorkbookClass)excelApp.Workbooks.Open(_filename, objOpt, false, objOpt, objOpt, objOpt, true, objOpt, objOpt, true, objOpt, objOpt, objOpt, objOpt, objOpt);
      }

      
/// <summary>
      
/// 所有sheet的名称列表
      
/// </summary>
      
/// <returns></returns>

      public List<string> GetSheetNames()
      
{
          List
<string> list = new List<string>();
          Excel.Sheets sheets 
= wbclass.Worksheets;
          
string sheetNams = string.Empty;
          
foreach (Excel.Worksheet sheet in sheets)
          
{
            list.Add(sheet.Name);
          }

          
return list;
      }

      
public Excel.Worksheet GetWorksheetByName(string name)
      
{
          Excel.Worksheet sheet
=null;
          Excel.Sheets sheets
= wbclass.Worksheets;
          
foreach (Excel.Worksheet s in sheets)
          
{
              
if (s.Name == name)
              
{
                  sheet 
= s;
                  
break;
              }

          }

          
return sheet;
      }

      
/// <summary>
      
/// 
      
/// </summary>
      
/// <param name="sheetName">sheet名称</param>
      
/// <returns></returns>

      public Array GetContent(string sheetName)
      
{
          Excel.Worksheet sheet 
= GetWorksheetByName(sheetName);
          
//获取A1 到AM24范围的单元格
          Excel.Range rang = sheet.get_Range("A1""AM24");
          
//读一个单元格内容
          
//sheet.get_Range("A1", Type.Missing);
        
//不为空的区域,列,行数目
       
//   int l = sheet.UsedRange.Columns.Count;
         
// int w = sheet.UsedRange.Rows.Count;
        
//  object[,] dell = sheet.UsedRange.get_Value(Missing.Value) as object[,];
          System.Array values = (Array)rang.Cells.Value2;
          
return values;
      }


      
public void Close()
      
{
          excelApp.Quit();
          excelApp 
= null;
      }

   
    }

PS: 另贴一段我自己的程序里面的代码。
        #region 导入导出
        [HttpPost]
        public void Import(string file)
        {
            int num = 0;
            if (Request.Files.Count > 0)
            {
                try
                {

                    string filename = Server.MapPath("/Content/upload/Excel/" + Projects.Tool.Util.StringUtil.CreateRandomString(16) + ".config");
                    Request.Files[0].SaveAs(filename);


                    string tableName = GetExcelFirstTableName(filename);
                    //设置T_Sql
                    string TSql = "SELECT  * FROM [" + tableName + "]";
                    //读取数据
                    DataTable table = ExcelToDataSet(filename, TSql).Tables[0];
                    if (table != null && table.Rows.Count > 1)
                    {
                        for (int i = 0; i < table.Columns.Count; i++)
                        {
                            table.Columns[i].ColumnName = table.Rows[0][i].ToString();
                        }
                        for (int i = 1; i < table.Rows.Count; i++)
                        {
                            try
                            {
                                string lockpickId = table.Rows[i]["开锁器编号"].ToString().Replace("'", "");
                                string model = table.Rows[i]["型号"].ToString().Replace("'", "");
                                string bluetoothName = table.Rows[i]["蓝牙名称"].ToString().Replace("'", "");
                                string macAddress = table.Rows[i]["蓝牙地址"].ToString().Replace("'", "");
                                Lockpick pickEntity = lockpickService.GetlockpickById(lockpickId);
                                if (pickEntity == null)
                                {
                                    pickEntity = new Lockpick
                                    {
                                        LockpickId = lockpickId,
                                        Model = model,
                                        BluetoothName = bluetoothName,
                                        MacAddress = macAddress
                                    };
                                    lockpickService.Createlockpick(pickEntity);
                                }
                                else
                                {
                                    pickEntity.Model = model;
                                    pickEntity.BluetoothName = bluetoothName;
                                    pickEntity.MacAddress = macAddress;
                                    lockpickService.Updatelockpick(pickEntity);
                                }
                            }
                            catch
                            {
                                num++;
                            }
                        }

                    }
                }
                catch
                {
                    Response.Write("<script>alert('导入失败');</script>");
                    Response.End();
                    //return View();
                }
            }
            else
            {
                Response.Write("<script>alert('请选择Excel文件');</script>");
                Response.End();
                //return View();
            }
            if (num > 0)
            {
                Response.Write("<script>alert('数据导入失败" + num.ToString() + "条');</script>");
            }
            else
            {
                Response.Write("<script>alert('导入成功');location.href='/lockpick/index';</script>");
            }
            Response.End();
            //return View();
        }
        /// <summary>
        /// 返回Excel数据源
        /// </summary>
        /// <param name="filename">文件路径</param>
        /// <param name="TSql">TSql</param>
        /// <returns>DataSet</returns>
        public static DataSet ExcelToDataSet(string filename, string TSql)
        {
            DataSet ds;
            string strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + ";Extended Properties=\"Excel 12.0;HDR=No;IMEX=1\"";
            OleDbConnection myConn = new OleDbConnection(strCon);
            string strCom = TSql;
            myConn.Open();
            OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
            ds = new DataSet();
            myCommand.Fill(ds);
            myConn.Close();
            return ds;
        }
        /// <summary>
        /// 动态取Excel表名
        /// </summary>
        /// <param name="fullPath">文件路径</param>
        /// <returns></returns>
        public static string GetExcelFirstTableName(string fullPath)
        {
            string tableName = null;
            if (System.IO.File.Exists(fullPath))
            {
                //Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties="Excel 12.0;HDR=YES;IMEX=1;Data Source=1.xls"
                using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fullPath + ";Extended Properties=\"Excel 12.0;HDR=No;IMEX=1\""))
                {
                    conn.Open();
                    tableName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).Rows[1][2].ToString().Trim();
                }
            }

            return tableName;
        }
        #endregion


你可能感兴趣的:(c#读取excel文件)