用OleDb方式连接excel,无法删除默认sheet的问题

ayun00 2013-10-08 10:46:33
现在 写入 数据 已经没有问题了,

但是 我create table 生成的表 只能在默认的 sheet1 后面,

现在能不能把 sheet1删除掉, 或者让我create 的表在第一位?

我用 drop table 只能清空 sheet1 的内容 ,不能删除 sheet1
...全文
324 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuezt 2015-12-24
  • 打赏
  • 举报
回复
同样需求等待中。。。
xuezt 2015-12-24
  • 打赏
  • 举报
回复
同样需求等待中。。。
xuezt 2015-12-24
  • 打赏
  • 举报
回复
同样需求等待中。。。
吕津 2014-06-02
  • 打赏
  • 举报
回复
明白楼主的concern. 支持一下!
ayun00 2013-10-16
  • 打赏
  • 举报
回复
自己顶一下!
ayun00 2013-10-09
  • 打赏
  • 举报
回复
1. 你这只是读excel的数据源 , 和 把不同的表插入excel 是不同的概念 2. 你这依然是读表名,不是改表名
引用 3 楼 kkkkkxiaofei 的回复:
1.参考下这个

//以datatable的形式返回sheet的内容
       public DataTable ShowSheet(string filePath, string sheetName)
       {
           string strConn = FatherForm.xml._excConn1 + filePath + FatherForm.xml._excConn2;
           OleDbConnection conn = new OleDbConnection(strConn);
           conn.Open();
           string sql = "select * from [" + sheetName + "$]";
           OleDbDataAdapter da = new OleDbDataAdapter(sql, conn);
           DataTable dt = new DataTable();
           da.Fill(dt);
           conn.Close();
           return dt;
       }
都能返回一个dt,插入到sheet不难,这里就不写了。 2.

//返回所有sheet名
       public string[] ImportExcel(string filePath)
       {
           string strConn = FatherForm.xml._excConn1 + filePath + FatherForm.xml._excConn2;
           OleDbConnection conn = new OleDbConnection(strConn);
           conn.Open();

           DataTable dt=conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[]{null,null,null,"table"});
           int len=dt.Rows.Count;
           string[] sheetNames = new string[len];
           int start;
           for (start = 0; start < len; start++)
           {
               string allName=dt.Rows[start]["TABLE_NAME"].ToString();
               sheetNames[start] = allName.Replace("$","");//remove $ sysmbol
           }          
           conn.Close();
           return sheetNames;
       }
ayun00 2013-10-09
  • 打赏
  • 举报
回复
我现在就是不想用excel com 方式, 使用这种方式老是碰到各种意外
引用 5 楼 jdcj413 的回复:
#region 去除多余SHEET for (int i = m_objBook.Sheets.Count; i >= 1; i--) { Excel.Worksheet worksheetDataDel = (Excel.Worksheet)m_objBook.Sheets.get_Item(i); if (worksheetDataDel.Name.ToLower() == "sheet1" || worksheetDataDel.Name.ToLower() == "sheet2" || worksheetDataDel.Name.ToLower() == "sheet3") { worksheetDataDel.Delete(); } } #endregion
cjh200102 2013-10-09
  • 打赏
  • 举报
回复
楼上可以试下
jdcj413 2013-10-09
  • 打赏
  • 举报
回复
#region 去除多余SHEET for (int i = m_objBook.Sheets.Count; i >= 1; i--) { Excel.Worksheet worksheetDataDel = (Excel.Worksheet)m_objBook.Sheets.get_Item(i); if (worksheetDataDel.Name.ToLower() == "sheet1" || worksheetDataDel.Name.ToLower() == "sheet2" || worksheetDataDel.Name.ToLower() == "sheet3") { worksheetDataDel.Delete(); } } #endregion
  • 打赏
  • 举报
回复
那你就不会先drop table把sheet1清空,然后把你自己create的table贴在sheet1里,再把sheet1的名字改了嘛。。。
  • 打赏
  • 举报
回复
1.参考下这个

//以datatable的形式返回sheet的内容
       public DataTable ShowSheet(string filePath, string sheetName)
       {
           string strConn = FatherForm.xml._excConn1 + filePath + FatherForm.xml._excConn2;
           OleDbConnection conn = new OleDbConnection(strConn);
           conn.Open();
           string sql = "select * from [" + sheetName + "$]";
           OleDbDataAdapter da = new OleDbDataAdapter(sql, conn);
           DataTable dt = new DataTable();
           da.Fill(dt);
           conn.Close();
           return dt;
       }
都能返回一个dt,插入到sheet不难,这里就不写了。 2.

//返回所有sheet名
       public string[] ImportExcel(string filePath)
       {
           string strConn = FatherForm.xml._excConn1 + filePath + FatherForm.xml._excConn2;
           OleDbConnection conn = new OleDbConnection(strConn);
           conn.Open();

           DataTable dt=conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[]{null,null,null,"table"});
           int len=dt.Rows.Count;
           string[] sheetNames = new string[len];
           int start;
           for (start = 0; start < len; start++)
           {
               string allName=dt.Rows[start]["TABLE_NAME"].ToString();
               sheetNames[start] = allName.Replace("$","");//remove $ sysmbol
           }          
           conn.Close();
           return sheetNames;
       }
ayun00 2013-10-08
  • 打赏
  • 举报
回复
引用 1 楼 kkkkkxiaofei 的回复:
那你就不会先drop table把sheet1清空,然后把你自己create的table贴在sheet1里,再把sheet1的名字改了嘛。。。
我每次create的表都不一样,是insert不进sheet1的, 另外 oledb 怎么修改 execel 工作薄 名的?
[SQL]将Excel表数据导入SQL Server2005的几种方法归纳 数据库 2010-07-27 11:14:26 阅读201 评论0 字号:大中小 订阅 近日在巨轮着手车间负荷数据处理,反馈回来的数据是保存在Excel文件中的,我必须将其导入SQL Server2005中,供存储过程计算。 由于之前没有将Excel数据导入SQL Server2005的经验,因此摸索着花了一天时间才搞定。下面将网上收集到的几种导入方法做个归纳。 方法一、利用SQL Server2005自带的DTS工具,手工导入: 第一步是点击开始并选择运行并输入CMD然后在命令提示符里输入DTSWIZARD。SQL Server 导入和导出向导的欢迎界面将显示出来,如下图所示:(也可以这样打开该界面:1、登录到 SQL Server Management Studio。2、在 “对象资源管理器 ”中右键单击 “管理 ”,在弹出列表中单击 “导入数据 ”。)   当你点击下一步按钮时,它将进入选择数据源向导界面。用户应该选择数据源为Microsoft Office 12.0 Access Database Engine OLE DB Provider 然后在向导界面中点击属性…按钮,它将弹出数据链接属性界面。在所有标签页中,双击数据源属性值并输入电子数据表的位置,例如“C:\Excel2007\Import\SampleData.xlsx”作为导入数据的数据源的Microsoft Office Excel 2007文件名称和路径。然后双击扩展属性并选择Excel 12.0作为属性值。   到Microsoft Office Excel 2007的连接可以通过点击测试连接按钮来进行测试,如下图所示:   在下一个页面中,数据源需要选为SQL Native Client,因为数据将导入到SQL Server 2005。然后你需要选择数据所要导入的服务器名称,并需要配置合适的验证模式,它之后跟着数据库名称。  在这个例子中,我们将使用windows验证连接到本地SQL Server实例,所使用的数据库将是ImportExcel。   在Specify Table Copy or Query(指定表复制或查询)向导界面中,选择copy data from one or more tables or views(从一个或多个表或视图复制数据)选项,并继续这个向导到下一个界面。   在Select Source Table and Views(选择源表和视图)向导界面中,用户需要在源中选择雇员电子数据表,然后在目标中就可以看到ImportExcel.dbo.Employee了。之后点击Edit Mappings…(编辑匹配…),扫描电子数据表中的可用数据,如果数据类型与SQL Server所建议的不同的话那么指定数据类型。   在Save and Execute Package(保存和执行包)向导界面中,有两个选项叫做Execute Immediately(立即执行)和Save SSIS Package as file system(保存SSIS包为文件系统)。你可以选择任何一个选项然后点击Finish(完成)按钮来运行和结束这个包配置。 方法二、在查询分析器里,直接写 SQL语句: 1、如果是导入数据到现有表,则采用 INSERT INTO 表 SELECT * FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$) 的形式 2、如果是导入数据并新增表,则采用 SELECT * INTO 表 FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$) 的形式。 以上语句是将 EXCEL文件里 SHEET1工作表中所有的列都读进来,如果只想导部分列,可以 INSERT INTO 表 (a1,a2,a3) SELECT a1,a2,a3 FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$) 其实可以将 OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)当成一个表,例如我就写过这样一个句子: INSERT INTO eval_channel_employee(channel,employee_id) SELECT CASE a.渠道 WHEN 'DIY' THEN 1 WHEN 'RDC' THEN 0 WHEN 'KCM' THEN 2 ELSE 3 END ,b.id FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'Excel 5.0;HDR=YES;DATABASE=c:\temp\name.xls',sheet1$) AS a,pers_employee b WHERE a.员工编码 =b.code 不管是哪种方式,哪种途径,系统都会默认将第一行上的内容作为字段名。 3、利用C#自己开发数据导入小工具 //连接串 string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" + [EXCEL文件,含路径] + ";"; OleDbConnection conn = new OleDbConnection(strConn); conn.Open(); DataTable dtSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[] {null, null, null, "TABLE"}); DataSet ds = new DataSet(); //一个EXCEL文件可能有多个工作表,遍历之 foreach( DataRow dr in dtSchema.Rows ) { string table = dr["TABLE_NAME"].ToString(); string strExcel = "SELECT * FROM [" + table + "]"; ds.Tables.Add(table); OleDbDataAdapter myCommand = new OleDbDataAdapter(strExcel,conn); myCommand.Fill(ds,table); } conn.Close(); 这样,读取出来的数据就藏在 DataSet里了。 采用这种方式,数据库所在机器不必装有 EXCEL。 总结: 当Excel表中数据完整时,利用SQL自带的导入工具手工导入比较方便。当数据不完整或数据格式对应不上时,使用导入工具会出错,利用SQL查询语句就更便捷。当结合以上两种方法的优点,利用C#自己开发出数据导入工具是最佳选择。

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧