使用OleDbDataAdapter读取excel文件的问题 我之前遇到这个问题就是这样处理的...把这个FileStream再写回到到硬盘形成个excel文件,然后再用上面的代码读取文件-_-#.... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个问题我觉得最好可以这样处理.有一个应用程序读取了上面的那个excel文件(然后就删除这个excel文件),在内存中形成一个FileStream这时候出去生成一个FileStream之外直接生成一个DataTable, 之后操作直接对着DataTable 如果是我,我就不用 OleDb,或者写回硬盘。这问题很怪,不知道高手怎么解决。 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 你可以查吗? 近来很多关于操作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的方式,读还好操作,写就很郁闷了如果要写的话,可以联系我[email protected] 两个查询结果相加 单元测试可以运行,但是无法调试 2个窗体传值的问题 关于线程之间协调的问题,急 用非公共的可访问性添加属性访问器 如何调试Windows服务? 怎么样才能吧C#学好!!! 请教C#怎么比较不区分大小写的byte? 如何在C#中编写主菜单中的文件打开功能 c# 写一个服务器 接收文件 C# Socket发送不出去怎么办? 关于PDFBox 中间数据对象的问题
这问题很怪,不知道高手怎么解决。
FileStream如果Excel的内容,那么这么只能转换为excel
DataTable getData(FileStream excelStream)我的原料只能是Excel的FileStream。
FileStream 属于文件系统概念, OleDb 处理 excel 属于关系数据库系统概念 ....
“而 FileStream 仅仅是一个文件流,如何能提供 OleDb 需要的数据库架构信息?”,这个文件流是整个的excel文件的全部内容,跟excel硬盘上的文件没什么两样,所含信息是一样的,能从文件形式中获得的信息应该也可以从这个FileStream中获得。“并且,加载 excel 到内存之后,就删除了,
那么,SQL Server 是不是加载了数据到内存,就可以将 .mdf 文件删了?”
我这里有两个应用,删除excel那个应用的行为,不是后面应用能控制的。
=========
所以,我说
“假如包含 excel 的 Stream 可以由类似 SQL Server/Oracle 数据库引擎管理,那么也许可以”
但愿早点解决
to chnking (kent) :
我如果已经把fileStream 保存到一个byte[] bt 中了
现在想还原这个excel文件,并对其进行数据填充
(现在的办法如同 zhaochong12(超级大笨鸟) ( ) 信誉:100 所写
先写回磁盘,再打开,编辑,另存)
可不可以直接用bt 数组 作为数据源,直接打开为excel 文件,
然后编辑?
你找找office组件中有没有直接通过fileStream 来new一个excel工作薄的方法
可怜公司只能上CSDN, chnking(kent) ( ) 信誉:93
你可以查吗?
没人理再帮你顶一下
{
/**//// <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的方式,读还好操作,写就很郁闷了如果要写的话,可以联系我[email protected]