C# OleDb读取Excel数据

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.IO;
using System.Linq;
using System.Text;

namespace SYS_TEST.BaseClass
{
    ///OleDB方式
    ///优点:将Excel直接当做数据源处理,通过SQL直接读取内容,读取速度较快。
    ///缺点:读取数据方式不够灵活,无法直接读取某一个单元格,只有将整个Sheet页读取出来后(结果为Datatable)再在Datatable中根据行列数来获取指定的值。
    public class OLEDBClass
    {
        /// <summary>
        /// 获取EXCEL的Sheet表名
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static object[] GetExcelSheetName(string fileName)
        {
            ArrayList sheetNames = new ArrayList();
            try
            {
                if (File.Exists(fileName))
                {
                    OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=\"Excel 8.0\";Data Source=" + fileName);
                    conn.Open();
                    DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                    conn.Close();
                    for (int i = 0; i != dt.Rows.Count; i++)
                    {
                        sheetNames.Add(dt.Rows[i]["Table_Name"].ToString());
                    }
                }
            }
            catch { }
            return sheetNames.ToArray();
        }
        /// <summary>
        /// Excel转换成DataSet
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static DataSet ExcelToDataSet(string fileName)
        {
            DataSet ds = new DataSet();
            try
            {
                if (File.Exists(fileName))
                {
                    OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=\"Excel 8.0\";Data Source=" + fileName);
                    conn.Open();
                    string comm = "select * from [sheet1$]";
                    OleDbDataAdapter myCommand = new OleDbDataAdapter(comm, conn);
                    myCommand.Fill(ds, "table1");
                    conn.Close();
                }
            }
            catch { }
            return ds;
        }
        /// <summary>
        /// DataSet更新到Excel
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="oldDs"></param>
        public static void DataSetToExcel(string fileName, DataSet oldDs)
        {
            OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=\"Excel 8.0\";Data Source=" + fileName);
            conn.Open();
            string comm = "select * from [sheet1$]";
            OleDbDataAdapter myCommand = new OleDbDataAdapter(comm, conn);
            OleDbCommandBuilder builder = new OleDbCommandBuilder(myCommand);
            //QuotePrefix和QuoteSuffix主要是对builder生成InsertComment命令时使用。
            builder.QuotePrefix = "[";//获取insert语句中保留字符(起始位置)
            builder.QuoteSuffix = "]";//获取insert语句中保留字符(结束位置)

            DataSet newDs = new DataSet();
            myCommand.Fill(newDs, "table1");
            for (int i = 0; i < oldDs.Tables[0].Rows.Count; i++)
            {
                //此处不能使用ImportRow方法将一行导入到newDs中,因为ImportRow将保留原来DataRow的所有设置(DataRowState状态不变)。
                //在使用ImportRow后newds内有值但不能更新到Excel中,因为所有导入行的DataRowState!=Added
                DataRow newDr = newDs.Tables["Table1"].NewRow();
                for (int j = 0; j < newDs.Tables[0].Columns.Count; j++)
                {
                    newDr[j] = oldDs.Tables[0].Rows[i][j];
                }
                newDs.Tables["Table1"].Rows.Add(newDr);
            }
            myCommand.Update(newDs, "Table1");
            conn.Close();
        }
        /// <summary>
        /// 将Excel读取到DataSet(多Sheet表)
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static DataSet ExcelToDataTable(string fileName)
        {
            //选择源
            string strConn = "";
            strConn = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=" + fileName + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1;\"";
            if (Path.GetExtension(fileName).Trim().ToUpper() == ".XLSX")
            {
                strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties=\"Excel 12.0;HDR=YES\"";
            }
            //定义数据集
            DataSet ds = new DataSet();
            //连接数据源
            OleDbConnection conn = new OleDbConnection(strConn);
            conn.Open();
            DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
            for (int i = 0; i < schemaTable.Rows.Count; i++)
            {
                string strSheetName = schemaTable.Rows[i][2].ToString().Trim().Trim('\'');
                if (strSheetName.Contains("$") && !strSheetName.EndsWith("$"))
                    continue;
                if (schemaTable.Rows[i][3].ToString().Trim().ToUpper().Equals("TABLE"))
                {
                    //Sql语句
                    string strExcel = string.Format("select * from [{0}]", strSheetName);
                    //适配到数据源
                    OleDbDataAdapter adapter = new OleDbDataAdapter(strExcel, strConn);
                    adapter.Fill(ds, strSheetName);
                }
            }
            conn.Close();
            //删除空的Excel表单
            for (int i = 0; i < ds.Tables.Count; i++)
            {
                DataTable dt = ds.Tables[i];
                if (dt.Columns.Count == 1 && dt.Columns[0].ColumnName.Trim().ToUpper() == "F1")
                {
                    ds.Tables.Remove(dt);
                    i--;
                }
            }
            return ds;
        }
    }
}

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值