当前位置:编程学习 > C#/ASP.NET >>

使用OleDbDataAdapter读取excel文件的问题

如果使用OleDbDataAdapter直接读取excel文件,放入到DataTable中,这我知道怎么做,代码大概如下:
string constr = @"Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=Yes;IMEX=1';Data Source=C:\Samples\ODBCCustomPipe\WindowsApplication1\testData.xls";
OleDbConnection myOleDbConnection = new OleDbConnection(constr);
OleDbDataAdapter myOleDbDataAdapter = new OleDbDataAdapter("SELECT * FROM [sheet8$]", myOleDbConnection);
DataTable myDataTable = new DataTable();
myOleDbDataAdapter.Fill(myDataTable);

现在情况是这样的:有一个应用程序读取了上面的那个excel文件(然后就删除这个excel文件),在内存中形成一个FileStream。然后要做另一个程序跟它接口,接收前面那个应用excel文件的FileStream,然后需要以这个FileStream为原料实现上面那段代码的功能,就是把FileStream中的内容读到DateTable中。

知道有个办法可以做到,就是把这个FileStream再写回到到硬盘形成个excel文件,然后再用上面的代码读取文件,但是这么做有点不舒服,人家本来就是从文件读到内存了,应该可以直接从内存读取。但是不知道myOleDbDataAdapter 怎么直接读内存中的
FileStream来实现上述功能? --------------------编程问答-------------------- 我之前遇到这个问题就是这样处理的...

把这个FileStream再写回到到硬盘形成个excel文件,然后再用上面的代码读取文件

-_-#.... --------------------编程问答-------------------- 这个问题我觉得最好可以这样处理.

有一个应用程序读取了上面的那个excel文件(然后就删除这个excel文件),在内存中形成一个FileStream

这时候出去生成一个FileStream之外直接生成一个DataTable, 之后操作直接对着DataTable --------------------编程问答-------------------- 不行,前面那个应用是不能去修改的 --------------------编程问答-------------------- 学习
Mark --------------------编程问答-------------------- 我也是初學者不太懂呀,大家請多幫幫忙 --------------------编程问答-------------------- 如果是我,我就不用 OleDb,或者写回硬盘。
这问题很怪,不知道高手怎么解决。 --------------------编程问答-------------------- mark,友情UP一下 --------------------编程问答-------------------- 不好整,我也是用2楼的。 --------------------编程问答-------------------- up 不懂
FileStream如果Excel的内容,那么这么只能转换为excel --------------------编程问答-------------------- 这么用法是有些怪,实际上我是要实现一个接口,接口里有个方法类似这样:
DataTable getData(FileStream excelStream)

我的原料只能是Excel的FileStream。
--------------------编程问答-------------------- 自己顶一下 --------------------编程问答-------------------- 有趣的问题,关注下 --------------------编程问答-------------------- 用数据库 API 取连接 excel ,此时 excel 就当作一个 db 了,

而 FileStream 仅仅是一个文件流,如何能提供 OleDb 需要的数据库架构信息?

假如包含 excel 的 Stream 可以由类似 SQL Server/Oracle 数据库引擎管理,那么也许可以,

否则还是写回磁盘,然后读取

总之,
FileStream 属于文件系统概念, OleDb 处理 excel 属于关系数据库系统概念 ....
--------------------编程问答-------------------- 并且,加载 excel 到内存之后,就删除了,

那么,SQL Server 是不是加载了数据到内存,就可以将 .mdf 文件删了? --------------------编程问答-------------------- “用数据库 API 取连接 excel ,此时 excel 就当作一个 db 了”,这点我同意。
“而 FileStream 仅仅是一个文件流,如何能提供 OleDb 需要的数据库架构信息?”,这个文件流是整个的excel文件的全部内容,跟excel硬盘上的文件没什么两样,所含信息是一样的,能从文件形式中获得的信息应该也可以从这个FileStream中获得。

“并且,加载 excel 到内存之后,就删除了,
那么,SQL Server 是不是加载了数据到内存,就可以将 .mdf 文件删了?”
我这里有两个应用,删除excel那个应用的行为,不是后面应用能控制的。
--------------------编程问答-------------------- 我这里有两个应用,删除excel是前面那个应用的行为,不是后面应用能控制的。 --------------------编程问答-------------------- excel文件的全部内容,跟excel硬盘上的文件没什么两样,所含信息是一样的,能从文件形式中获得的信息应该也可以从这个FileStream中获得。
=========
所以,我说
“假如包含 excel 的 Stream 可以由类似 SQL Server/Oracle 数据库引擎管理,那么也许可以” --------------------编程问答-------------------- 说的有道理。

不管怎样,我就是不想把这个FileStream写回到硬盘,要找个办法直接去处理这个FileStream 获得内容 --------------------编程问答-------------------- 我感觉不能实现!两个不同的概念!关注中~ --------------------编程问答-------------------- 看到这个问题,心里真高兴
但愿早点解决
to chnking (kent) :
我如果已经把fileStream 保存到一个byte[] bt 中了
现在想还原这个excel文件,并对其进行数据填充
(现在的办法如同 zhaochong12(超级大笨鸟) ( ) 信誉:100   所写
   先写回磁盘,再打开,编辑,另存)
可不可以直接用bt 数组 作为数据源,直接打开为excel 文件,
然后编辑? --------------------编程问答-------------------- LighBlade(脚踏实地)LighBlade(一步一个脚印) 
你找找office组件中有没有直接通过fileStream 来new一个excel工作薄的方法 --------------------编程问答-------------------- 自己顶一下 --------------------编程问答-------------------- 沉得真快 --------------------编程问答-------------------- 好的,帮你顶一个 --------------------编程问答-------------------- 托起来 --------------------编程问答-------------------- 稍微查了下,没查到
可怜公司只能上CSDN, chnking(kent) ( ) 信誉:93  
你可以查吗? --------------------编程问答-------------------- 再顶上来 --------------------编程问答-------------------- up
--------------------编程问答-------------------- 近来很多关于操作excle的问题啊

关注!~ --------------------编程问答-------------------- 顶上去,看来解决的希望不是很大 --------------------编程问答-------------------- 再顶 --------------------编程问答-------------------- 顶 --------------------编程问答-------------------- 还能顶吗 --------------------编程问答-------------------- 兄弟们,帮顶啊 --------------------编程问答-------------------- 兄弟们,帮顶啊 --------------------编程问答-------------------- 我来了 --------------------编程问答-------------------- 关注,帮顶 --------------------编程问答-------------------- 路过 学习 帮顶~ --------------------编程问答-------------------- 谢谢楼上帮顶的朋友 --------------------编程问答-------------------- 放弃了,还是用写回硬盘的办法吧 --------------------编程问答-------------------- http://community.csdn.net/Expert/topic/5756/5756157.xml?temp=.5503199

这个是我上面问的问题
没人理

再帮你顶一下 --------------------编程问答-------------------- 顶住 --------------------编程问答-------------------- 顶住
学习 --------------------编程问答-------------------- 再顶一次,看来是没人回答了 --------------------编程问答-------------------- namespace ExcelHelp
{
    /**//// <summary>
    /// ExcelHelper Excel 操作助手。
    /// 主要用于实现从 Excel 文件(.xls 格式)形式的数据源中读取以及写入数据。
    /// </summary>
    public class ExcelHelper
    {
        //构造函数、私有实用方法#region 构造函数、私有实用方法

        /**//// <summary>
        /// 由于此类仅提供一些静态方法,设置默认构造函数私有化,以阻止使用 "new" 来创建实例。
        /// </summary>
        internal ExcelHelper()
        {
            // Do Nothing!
        }

       

        //静态方法#region 静态方法

        //获取 连接对象 GetExcelConnection#region 获取 连接对象 GetExcelConnection

        //strFullPath, isTreatedHeader, intIMEXMode#region strFullPath, isTreatedHeader, intIMEXMode
        /**//// <summary>
        /// 获取 Excel 连接对象。
        /// </summary>
        /// <param name="strFullPath">文件的完全路径</param>
        /// <param name="isTreatedHeader">是否处理表头</param>
        /// <param name="intIMEXMode">输入输出模式。1:设置输入为文本 Text 类型,通常使用该值。0/2:设置输入为 多数 Majority 类型,此设置极易导致数据缺失发生。</param>
        /// <returns>Excel 连接对象</returns>
        public static OleDbConnection GetExcelConnection( string strFullPath, bool isTreatedHeader, int intIMEXMode )
        {
            string connectionString = @"
Provider=Microsoft.Jet.OLEDB.4.0;
Data Source={0};
Extended Properties='Excel 8.0;HDR={1};IMEX={2};'
";
            string strTreatedHeader = string.Empty;

            if( isTreatedHeader ) strTreatedHeader = "Yes";
            else strTreatedHeader = "No";

            connectionString = string.Format( connectionString, strFullPath, strTreatedHeader, intIMEXMode );

            return new OleDbConnection( connectionString );
        }

        

      
        #region ExecuteDataTable

        /**//// <summary>
        /// 读取给定连接给定表的内容至 DataTable。
        /// </summary>
        /// <param name="cn">给定连接</param>
        /// <param name="sheetName">给定 WorkSheet 的名称</param>
        /// <returns>包含给定 Sheet 数据的 DataTable</returns>
        public static DataTable ExecuteDataTable( OleDbConnection cn, string sheetName )
        {
            DataTable dt = null;

            if( sheetName.Trim() != string.Empty )
            {
                string commandText = string.Format( "SELECT * FROM [{0}$]", sheetName );

                dt = new DataTable( sheetName );
                OleDbDataAdapter da = new OleDbDataAdapter( commandText, cn );
                da.Fill(dt);
            }

            return dt;
        }

        #endregion ExecuteDataTable

        #region ExecuteDataSet

        /**//// <summary>
        /// 读取给定连接中全部或给定表的内容至 DataSet。
        /// </summary>
        /// <param name="cn">给定连接</param>
        /// <param name="sheetNames">[可选参数]指定表名 的 sheet</param>
        /// <returns>包含全部或给定 Sheet 数据的 DataSet</returns>
        public static DataSet ExecuteDataSet( OleDbConnection cn, params string[] sheetNames )
        {
            DataSet ds = new DataSet();

            DataTable schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] {null, null, null, "TABLE"});
            string queryString;

            // 带 $ 的表名
            string fullTableName;

            // 不带 $ 的表名
            string realTableName;

            OleDbDataAdapter odda = new OleDbDataAdapter();

            foreach ( DataRow dr in schemaTable.Rows )
            {
                fullTableName = dr["TABLE_NAME"].ToString();

                realTableName = fullTableName.Remove( fullTableName.Length - 1, 1 );

                // 根据给定表导入
                if ( sheetNames.Length > 0 )
                {
                    // 若当前表不在给定表数组中,则不填充到数据集中。
                    if ( Array.IndexOf( sheetNames, realTableName ) < 0 )
                    {
                        continue;
                    }
                }

                queryString = string.Format( "SELECT * FROM [{0}]", fullTableName );

                odda.SelectCommand = new OleDbCommand( queryString, cn );
                odda.Fill(ds, realTableName);
            }

            return ds;
        }

        #endregion ExecuteDataSet

        public static void DSToExcel(string Path, DataSet oldds)
        {
            //先得到汇总EXCEL的DataSet 主要目的是获得EXCEL在DataSet中的结构 
            string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =" + Path + ";Extended Properties=Excel 8.0";
            OleDbConnection myConn = new OleDbConnection(strCon);
            string strCom = "select * from [Sheet1$]";
            myConn.Open();
            OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
            System.Data.OleDb.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方法将一行导入到news中,因为ImportRow将保留原来DataRow的所有设置(DataRowState状态不变)。在使用ImportRow后newds内有值,但不能更新到Excel中因为所有导入行的DataRowState!=Added 
                DataRow nrow = newds.Tables["Table1"].NewRow();
                for (int j = 0; j < newds.Tables[0].Columns.Count; j++)
                {
                    nrow[j] = oldds.Tables[0].Rows[i][j];
                }
                newds.Tables["Table1"].Rows.Add(nrow);
            }
            myCommand.Update(newds, "Table1");
            myConn.Close();
        } 



    }
} --------------------编程问答-------------------- ...网上蛮多的,
OLEDB的方式,读还好操作,写就很郁闷了

如果要写的话,可以联系我netusemaster@hotmail.com
--------------------编程问答-------------------- ...我看错了,对不起... --------------------编程问答-------------------- 沉了。。。 --------------------编程问答-------------------- 只顶到50,没人理的话,回收了吧 --------------------编程问答-------------------- 顶楼,最底层,可以回收了 --------------------编程问答-------------------- 將其轉換成xml,利用dataset的readxml不知道可行不.或者還可以利用memorystream來轉

StringReader stream = new StringReader(xml);
XmlTextReader reader = new XmlTextReader(stream);
DataSet xmlDS = new DataSet();
xmlDS.ReadXml(reader);
return xmlDS;

--------------------编程问答-------------------- 再顶。 --------------------编程问答-------------------- 下来要做这个功能,帮顶+学习 --------------------编程问答-------------------- playwarcraft(时间就像乳沟,挤挤还是有的)

如果要转成xml,excel的文件怎么转成xml,又是个问题 --------------------编程问答--------------------
引用 45 楼 netusemaster 的回复:
namespace   ExcelHelp
{
        /**////   <summary>
        ///   ExcelHelper   Excel   操作助手。
        ///   主要用于实现从   Excel   文件(.xls   格式)形式的数据源中读取以及写入数据。
        ///   </summary>
        publi……


顶!
--------------------编程问答-------------------- 路過學習了。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,