使用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,又是个问题 --------------------编程问答--------------------
顶!
--------------------编程问答-------------------- 路過學習了。
补充:.NET技术 , C#