我之前遇到这个问题就是这样处理的...把这个FileStream再写回到到硬盘形成个excel文件,然后再用上面的代码读取文件-_-#....

解决方案 »

  1.   

    这个问题我觉得最好可以这样处理.有一个应用程序读取了上面的那个excel文件(然后就删除这个excel文件),在内存中形成一个FileStream这时候出去生成一个FileStream之外直接生成一个DataTable, 之后操作直接对着DataTable
      

  2.   

    如果是我,我就不用 OleDb,或者写回硬盘。
    这问题很怪,不知道高手怎么解决。
      

  3.   

    up 不懂
    FileStream如果Excel的内容,那么这么只能转换为excel
      

  4.   

    这么用法是有些怪,实际上我是要实现一个接口,接口里有个方法类似这样:
    DataTable getData(FileStream excelStream)我的原料只能是Excel的FileStream。
      

  5.   

    用数据库 API 取连接 excel ,此时 excel 就当作一个 db 了,而 FileStream 仅仅是一个文件流,如何能提供 OleDb 需要的数据库架构信息?假如包含 excel 的 Stream 可以由类似 SQL Server/Oracle 数据库引擎管理,那么也许可以,否则还是写回磁盘,然后读取总之,
    FileStream 属于文件系统概念, OleDb 处理 excel 属于关系数据库系统概念 ....
      

  6.   

    并且,加载 excel 到内存之后,就删除了,那么,SQL Server 是不是加载了数据到内存,就可以将 .mdf 文件删了?
      

  7.   

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

  8.   

    我这里有两个应用,删除excel是前面那个应用的行为,不是后面应用能控制的。
      

  9.   

    excel文件的全部内容,跟excel硬盘上的文件没什么两样,所含信息是一样的,能从文件形式中获得的信息应该也可以从这个FileStream中获得。
    =========
    所以,我说
    “假如包含 excel 的 Stream 可以由类似 SQL Server/Oracle 数据库引擎管理,那么也许可以”
      

  10.   

    说的有道理。不管怎样,我就是不想把这个FileStream写回到硬盘,要找个办法直接去处理这个FileStream 获得内容
      

  11.   

    看到这个问题,心里真高兴
    但愿早点解决
    to chnking (kent) :
    我如果已经把fileStream 保存到一个byte[] bt 中了
    现在想还原这个excel文件,并对其进行数据填充
    (现在的办法如同 zhaochong12(超级大笨鸟) ( ) 信誉:100   所写
       先写回磁盘,再打开,编辑,另存)
    可不可以直接用bt 数组 作为数据源,直接打开为excel 文件,
    然后编辑?
      

  12.   

    LighBlade(脚踏实地)LighBlade(一步一个脚印) 
    你找找office组件中有没有直接通过fileStream 来new一个excel工作薄的方法
      

  13.   

    稍微查了下,没查到
    可怜公司只能上CSDN, chnking(kent) ( ) 信誉:93  
    你可以查吗?
      

  14.   

    近来很多关于操作excle的问题啊关注!~
      

  15.   

    http://community.csdn.net/Expert/topic/5756/5756157.xml?temp=.5503199这个是我上面问的问题
    没人理再帮你顶一下
      

  16.   

    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();
            }     }
    }
      

  17.   

    ...网上蛮多的,
    OLEDB的方式,读还好操作,写就很郁闷了如果要写的话,可以联系我[email protected]