简单 问题 下班结帖!!

happy664618843 2010-06-22 10:06:17
导入单个excel sheet 现在一个excel中有146个sheet请问怎样花最少的时间导入到dataset中呢 高手帮帮忙!
         oleDbConnection =new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties=\"Excel 8.0;IMEX=1;\"");
10 OleDbCommand selectCommand = new OleDbCommand();
11 selectCommand.Connection = oleDbConnection;
12 selectCommand.CommandText = "select * from $sheet1";
13 selectCommand.CommandType = CommandType.Text;
14 OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand);
15 dataSet = new DataSet();
16 adapter.Fill(dataSet);
...全文
370 点赞 收藏 40
写回复
40 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wuyq11 2010-06-22
在SQL中直接导入数据到excel
通过二维数组赋值给单元格
回复
HappyKeKe 2010-06-22
偶不晓得
回复
昕颖 2010-06-22
个人觉得应当采用线程去控制。
回复
li295611650 2010-06-22
学习!!!!!!!!!!!!!11
回复
rui90102 2010-06-22
ding !
回复
adu_ado 2010-06-22
学习~~~
回复
huminghua 2010-06-22
噢!来晚啦!嘿嘿!帮顶!可以用循环啊!让后放到DataTable中啊!
回复
lester19872007 2010-06-22
[Quote=引用 10 楼 happy664618843 的回复:]
引用 3 楼 vip__888 的回复:

导入到一个sheet?
146 个 sheet 也就是146个DataTable
你看怎么样比较快呢?

呵呵 .... 我不知道所以才问高手散 有什么好的方法吗?
[/Quote]

至于这个问题 ,要看你这146个sheet的结构是否一样,如果是一样的还可以优化一下,如果这146个里面的 sheet格式都不一样,只有循环添加146个table了。。。
回复
liuyilin999 2010-06-22
路过,帮顶
回复
telankes2000 2010-06-22
这么多表 还是手动导入数据库吧 这样最快
我导过6000笔数据 大概10秒钟搞定(SqlServer2000)
146个表 如果数据量不大也是很快的
回复
向东 2010-06-22
帮顶!!!!!!!!!!!!!!!!!!!
回复
enderboy520 2010-06-22
mark
回复
yichuantigaoting 2010-06-22
学习学习
回复
gdlpc 2010-06-22
例如你要找某人(某个)的工作表所花时间一定不少!!!!
回复
gdlpc 2010-06-22
另外,不知道你的Excel为什么要添加这么多的工作表,这样也很难管理的,工作效率一定很低!
回复
灵雨飘零 2010-06-22
我想到的也只能遍历循环操作了。。。
还有更好的办法吗?
回复
qiuqingpo 2010-06-22
循环160次的.快不了
回复
gdlpc 2010-06-22
//连接Excel文件,读入myDstaSet,我只用过导入一个工作表的,你可以参考修改修改应该可以用的
String strConnectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;IMEX=1'", serverpath);//Excel文件名及位置
OleDbConnection Excel_conn = new OleDbConnection(strConnectionString);
Excel_conn.Open();
DataTable dtExcelSchema = Excel_conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });//建立连接Excel的数据表
string SheetName = "";
SheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();// 我只用单一的表取出第一个工作表我名称,//你在这里循环dtExcelSchema的工作表插入数据
Excel_conn.Close();

string query = "SELECT * FROM " + "[" + SheetName + "]";//查询Excel字符串
OleDbDataAdapter oleAdapter = new OleDbDataAdapter(query, Excel_conn);
DataSet myDataSet = new DataSet();
Excel_conn.Open();
oleAdapter.Fill(myDataSet, "Excel_Sheet1");
Excel_conn.Close();
回复
QQlvbo 2010-06-22
挨个倒,不知道多线程可不可以
回复
S_trance 2010-06-22
额。事件流就这样,只能一个个导了,
或者有高手能解决吧,
# region 将Excel中所有Sheet的数据导入一个DataSet
/**//// <summary>
/// 将Excel中所有Sheet的数据导入一个DataSet
/// </summary>
/// <returns></returns>
public static DataSet CreateDataSource(string strPath)
{
try
{
bool m_DelRow = false;
string strConn = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " + strPath + "; Extended Properties = 'Excel 8.0;HDR = Yes;IMEX = 1'";
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
System.Data.DataTable dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[]{null,null,null,"Table"});
//=======删除文件中的打印区域============================================================
for(int k = 0;k < dtSheetName.Rows.Count;k++)
{
if(dtSheetName.Rows[k]["TABLE_NAME"].ToString().EndsWith("Print_Area"))
{
dtSheetName.Rows[k].Delete();
}

}
dtSheetName.AcceptChanges();
//========================================================================
string strSql = string.Empty;
DataSet myDataSet = new DataSet();
//===========================================================================
for(int i = 0 ;i < dtSheetName.Rows.Count;i++)
{//用多个表来填充myDataSet
strSql = "Select * from [" + dtSheetName.Rows[i]["TABLE_NAME"].ToString() + "]";
OleDbDataAdapter myCommand = new OleDbDataAdapter(strSql,conn);
myCommand.Fill(myDataSet,dtSheetName.Rows[i]["TABLE_NAME"].ToString());

}
//==========删除空表=========================================
// for(int h =0;h < myDataSet.Tables.Count;h++)
// {
// if(myDataSet.Tables[h].Rows.Count == 0)
// {
// myDataSet.Tables[h].
// }
// }
//删除文件中的全为空的行
for(int j = 0;j < myDataSet.Tables.Count;j++)
{
for(int i = 0;i < myDataSet.Tables[j].Rows.Count;i++)
{
for(int k = 0; k < myDataSet.Tables[j].Columns.Count;k++)
{
if(myDataSet.Tables[j].Rows[i][k].ToString() != string.Empty)
{
m_DelRow = true;
}
}
if(!m_DelRow)
{
myDataSet.Tables[j].Rows[i].Delete();
}
m_DelRow = false;
}
}
myDataSet.AcceptChanges();
//================================================================================
m_DelRow = false;
return myDataSet;
}
catch(Exception err)
{
Console.WriteLine(err.Message + System.Environment.NewLine + err.StackTrace);
return null ;
}
}
#endregion
回复
加载更多回复
相关推荐
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2010-06-22 10:06
社区公告

让您成为最强悍的C#开发者