请教一个问题的思路

问题描述

我想用C#实现将excel表中的数据导入到access数据库的a表中.在导入时,我想让数据库中接受excel数据的那张表(a表)的列名自动创建,而不用手动创建.请问上述问题的实现思路.谢谢.

解决方案

解决方案二:
在access里写脚本。access除了数据库,还内含VB的脚本功能,可惜我们大多数人都没研究过,里面可以实现一切access菜单里的功能,包括你想要的导入。
解决方案三:
usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Data.OleDb;usingSystem.Data;usingSystem.Windows.Forms;usingMicrosoft.Office.Interop.Excel;namespaceLandaControl7_ValidateExcel{///<summary>///读取Excel///</summary>classExcelForCheck{#region通用读取Excel(多表读取,一次读取,集中处理)/**http://www.qudong.com/soft/program/asp/asp-netshili/20080317/1169.html*对于MicrosoftExcel8.0(97)、9.0(2000)、10.0(2002)和11.0(2003)工作簿,请使用Excel8.0。*对于MicrosoftExcel5.0和7.0(95)工作簿,请使用Excel5.0。*对于MicrosoftExcel4.0工作簿,请使用Excel4.0。*对于MicrosoftExcel3.0工作簿,请使用Excel3.0。*Provider=Microsoft.Jet.OLEDB.4.0;ExtendedProperties="Excel8.0;HDR=NO";datasource="+xlsPath;*如果希望第一行作为数据显示,而非列名,可以在连接串的ExtendedProperties属性指定:HDR=NO,*注意:Excel8.0;HDR=NO需要使用双引号(这里的反斜扛,是C#中的转义)*可以通过ExtendedProperties中指定IMEX=1,"IMEX=1;"通知驱动程序始终将“互混”数据列作为文本读取*有网友说,将每个单元都加上引号,这固然是个方案,但是工作量何其大啊,又不零活,庆幸找到"治本药方"**这里我们就不需要对SELEC语句进行“硬编码”,可以根据需要动态的构造FROM字句的“表名”。*不仅可以,获取表明,还可以获取每张表内的字段名、字段类型等信息:*tblSchema=conn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,newobject[]{null,null,null,null});*在ADO.nET1.x时候只有OleDb提供了GetOleDbSchemaTable方法,而SqlClient或者OrcaleClient没有对应的方法,*因为对应数据库已经提供了类似功能的存储过程或者系统表供应用程序访问,比如对于SqlServer:*SELECT*FROMNorthwind.INFORMATION_SCHEMA.COLUMNSWHERETABLE_NAME=N'Customers'**HDR用来设置是否将Excel表中第一行作为字段名,“YES”代表是,“NO”代表不是即也为数据内容;*IMEX是用来告诉驱动程序使用Excel文件的模式,其值有0、1、2三种,分别代表导出、导入、混合模式**HKEY_LOCAL_MACHINESOFTWAREMicrosoftJet4.0EnginesExcel”下的该注册表值来更改采样行数。*但是这种改进还是没有根本上解决问题,即使我们把IMEX设为“1”,TypeGuessRows设得再大,例如1000,假设数据表有1001行,某列前1000行全为纯数字,*该列的第1001行又是一个文本,ISAM驱动的这种机制还是让这列的数据变成空**/publicDataSetExcelReader(stringexcelName){DataSetds=newDataSet();OleDbConnectionconn=null;try{//拼写连接字符串,打开连接stringstrConn="Provider=Microsoft.Jet.OleDb.4.0;"+"datasource="+excelName+";ExtendedProperties='Excel8.0;HDR=YES;IMEX=1'";conn=newOleDbConnection(strConn);conn.Open();//取得Excel工作簿中所有工作表System.Data.DataTableschemaTable=conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,null);//获取Excel中的对应表名称//System.Data.DataTablecolTable=conn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,null);//获取Excel中的对应列名称OleDbDataAdaptersqlada=newOleDbDataAdapter();//遍历工作表取得数据并存入Datasetforeach(DataRowdrinschemaTable.Rows){stringstrSql="Select*From["+dr[2].ToString().Trim()+"]";OleDbCommandobjCmd=newOleDbCommand(strSql,conn);sqlada.SelectCommand=objCmd;sqlada.Fill(ds,dr[2].ToString().Trim());}}catch{returnnull;}finally{if(conn.State!=ConnectionState.Closed&&conn!=null){conn.Close();//KillProcess("excel");}}returnds;}#endregion#region指定文件名[Sheet1$]导出publicDataSetGetDataFromExcel(stringfilePath){//DataSetmyDataSet=newDataSet();////创建一个数据链接////stringstrCon="Provider=Microsoft.Jet.OLEDB.4.0;DataSource=c:\sample.xls;ExtendedProperties=Excel8.0";//stringstrCon="Provider=Microsoft.Jet.OLEDB.4.0;DataSource="+filePath+";ExtendedProperties=Excel8.0;HDR=NO;IMEX=1";//OleDbConnectionmyConn=newOleDbConnection(strCon);//stringstrCom="SELECT*FROM[Sheet1$]";////myConn.Open();////打开数据链接,得到一个数据集//OleDbDataAdaptermyCommand=newOleDbDataAdapter(strCom,myConn);////创建一个DataSet对象//myDataSet=newDataSet();////得到自己的DataSet对象//myCommand.Fill(myDataSet);////myCommand.Fill(myDataSet,"[Sheet1$]");////关闭此数据链接////myConn.Close();//returnmyDataSet;stringstrCon="Provider=Microsoft.Jet.OLEDB.4.0;DataSource="+filePath+";ExtendedProperties=Excel8.0";System.Data.OleDb.OleDbConnectionconn=newSystem.Data.OleDb.OleDbConnection(strCon);stringsql="Select*FROM[Sheet1$]";System.Data.OleDb.OleDbDataAdapteradp=newSystem.Data.OleDb.OleDbDataAdapter(sql,conn);DataSetdss=newDataSet();adp.Fill(dss,"[Sheet1$]");returndss;}#endregion#region从指定行处读取ExcelpublicvoidReadExcel(stringsExcelFile,System.Windows.Forms.DataGridViewdgBom){System.Data.DataTableExcelTable;DataSetds=newDataSet();//Excel的连接OleDbConnectionobjConn=newOleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;DataSource="+sExcelFile+";"+"ExtendedProperties=Excel8.0;");objConn.Open();System.Data.DataTableschemaTable=objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables,null);stringtableName=schemaTable.Rows[0][2].ToString().Trim();//获取Excel的表名,默认值是sheet1stringstrSql="select*from["+tableName+"]";OleDbCommandobjCmd=newOleDbCommand(strSql,objConn);OleDbDataAdaptermyData=newOleDbDataAdapter(strSql,objConn);myData.Fill(ds,tableName);//填充数据dgBom.DataSource=ds;objConn.Close();ExcelTable=ds.Tables[tableName];intiColums=ExcelTable.Columns.Count;//列数intiRows=ExcelTable.Rows.Count;//行数//定义二维数组存储Excel表中读取的数据string[,]storedata=newstring[iRows,iColums];for(inti=0;i<ExcelTable.Rows.Count;i++)for(intj=0;j<ExcelTable.Columns.Count;j++){//将Excel表中的数据存储到数组storedata[i,j]=ExcelTable.Rows[i][j].ToString();}intexcelBom=0;//记录表中有用信息的行数,有用信息是指除去表的标题和表的栏目,本例中表的用用信息是从第三行开始//确定有用的行数for(intk=2;k<ExcelTable.Rows.Count;k++)if(storedata[k,1]!="")excelBom++;if(excelBom==0){//Response.Write("<scriptlanguage=javascript>alert('您导入的表格不合格式!')</script>");}else{//LoadDataToDataBase(storedata,excelBom)//该函数主要负责将storedata中有用的数据写入到数据库中,在此不是问题的关键省略}}#endregion#region杀死Excel进程,okprivatevoidKillProcess(stringprocessName){System.Diagnostics.Processmyproc=newSystem.Diagnostics.Process();//得到所有打开的进程try{foreach(System.Diagnostics.ProcessthisprocinSystem.Diagnostics.Process.GetProcessesByName(processName)){thisproc.Kill();}}catch(ExceptionExc){thrownewException("",Exc);}}#endregion}}

解决方案四:
到网上搜ADOX,ADODB,有源码,直接拿来使用,建库建表不需几行代码即可实现都是COM组件,要添加引用
解决方案五:
感谢楼上的代码提示针对代码,我有一个问题就是楼上省略的部分:LoadDataToDataBase(storedata,excelBom)//该函数主要负责将storedata中有用的数据写入到数据库中,在此不是问题的关键省略我想明白如何操作,能把数组storedata中的数据放入到数据库当中呢?谢谢!
解决方案六:
引用1楼bwangel的回复:

在access里写脚本。access除了数据库,还内含VB的脚本功能,可惜我们大多数人都没研究过,里面可以实现一切access菜单里的功能,包括你想要的导入。

这个是VBAAccess可以写,excel也可以写。
解决方案七:
我现在不是很明白在C#中如何将Dataset中得到的excel表数据放入数据库的相应表中.就是上面例子中的用数组storedata取得的有效数据导入数据库的具体过程.请高手指点一下.谢谢!

时间: 2024-08-30 23:36:08

请教一个问题的思路的相关文章

请教一个数据存储思路。

问题描述 请教一个数据存储思路. 我有几台服务器不停的在产生数据,每秒钟大概有15000条数据,我要把这些数据插入MySQL数据库中,但是现在发现MySQL好像不能胜任,因为数据是在几台服务器上不停产生的,我每台服务器都会向数据库建立一个长连接,大概每台服务器向数据库建立20个长连接,但经常有些数据插入不了,请问一下,这些有没有更好的数据存储思路.. 解决方案 MySql用分布式方式 http://blog.chinaunix.net/uid-25979788-id-3270311.html

ext 权限 menu 动态-我想请教一个关于Ext JS4根据权限动态生成左侧树形菜单,和上侧Menu下拉菜单。

问题描述 我想请教一个关于Ext JS4根据权限动态生成左侧树形菜单,和上侧Menu下拉菜单. 我现在根据自己想的写了一个动态生成树的例子:数据库有 用户表 : 里面有个角色id ,角色表: 里面有个可以访问页面的Id号.然后我登陆的时候会判断用户拥有哪些id号,再根据id号生成树形菜单. 现在我在页面上侧加Menu的下拉菜单.也想根据权限生成,但是没有思路..想请教下各位,有什么例子可以借鉴 或者指点一下.谢谢啦 ~~

vc++-请教一个VC++找图的问题

问题描述 请教一个VC++找图的问题 请问下,VC++能找图吗?就是先给定一个图片,然后在指定的地方找这个图片,就像按键 精灵那样一样的. 解决方案 可以,但是算法要自己写,没有现成的函数可以调用 解决方案二: 屏幕截图,然后比较每个像素啊,写一个图片比较的算法,笨点的算法大致思路是,获取被找图第一行像素,然后在屏幕截图上依次比较,找到后是第二行,第三行,,,图形处理可以用第三方图形库,或者用微软在Windows中自带的GDI/GDI+(图形设备接口) 解决方案三: 图片相似度比较,有很多图像处

ios开发 布局-大家好,探讨请教一个滑动翻页,蚂蜂窝的实现效果

问题描述 大家好,探讨请教一个滑动翻页,蚂蜂窝的实现效果 对于滑动翻页的效果,我认为是用scrollView实现的,里面显示效果的页面是webView,每次滑动webView头部下拉刷新效果变成上翻上一页(改变scrollView的contentOffSet),对于UI的实现我是这么认为的,我不知道有没有更好的方法,如果有,请指教,谢谢. 至于webView里面的内容,而且还有类似于tableViewCell的交互,其实还是网页上的链接,这才是重要的,我不清楚这个后台该如何实现,前端目前我有大概

算法 选择排序-请教一个选择排序的算法问题

问题描述 请教一个选择排序的算法问题 你好, 我刚刚开始接触JAVA, 问一个选择排序的问题. private static void SelectionSort (int[] arr) { for(int i=0; i for(int j=i+1;j if (arr[i] > arr[j]) { int m; m = arr[i]; arr[i] = arr[j]; arr[j] = m; } } } } 这个方法正确,但是交换次数多了,所以我想改进一下. private static voi

c语言-请教一个C编程 打印输出图像的算法编程

问题描述 请教一个C编程 打印输出图像的算法编程 解决方案 大概就是这样,建立笛卡尔坐标系. 用point()函数里的嵌套for循环来输出每一个字符,然后把代表坐标的i和j传递给getChar()函数通过坐标来决定输出的是什么字符. 解决方案二: char getChar(int x,int y,int n) { if(x<0) x=-x; if(y<0) y=-y; if(x>y) { if(n-x<=2) return 'x'+n-x; else return '0'+n-x-

请教一个数据库分组问题

问题描述 请教一个数据库分组问题 我写了这么一个脚本 SELECT da_sp.spdm da_sp.sp da_sp.jldw da_sp.ggxh da_sp.wbdw da_sp.wbbzl da_sp.nbdw da_sp.nbbzl da_sp.cbj da_sp.zhjj da_sp.pddw da_sp.pdxs da_sp.fdyclbj da_sp.zjpsbj xs_jxcrb.spnm sum(xs_jxcrb.cksl) as cksl isnull(c.bqsl0) a

新人请教一个sscanf中的正则表达式的问题

问题描述 新人请教一个sscanf中的正则表达式的问题 比如一串字符我要取其中的数字,df3600sdf365dssdfwef2135fewe@35@#%dsaf54我用""%*[^0-9]%[0-9]""只能取到3600,""%*[^0-9]""也错误..应该怎么取啊 解决方案 正则 直接用 d+ 即可 解决方案二: 这个应该怎么写..求写法

java-小弟想请教一个问题.对于大神们来说很简单

问题描述 小弟想请教一个问题.对于大神们来说很简单 小弟的这个程序很简单 但是对于小弟来说实在是太难了 本来前面的已经实现了,但是算总分的时候第二个人的成绩总是要和第一个成绩相加,这是程序这是运行后的结果就想问问大神怎么做把两个人的总分成绩分开 求大神帮帮忙哈 解决方案 zhongfen[i]=bianliang; 下一行加上 bianliang=0; 解决方案二: 变量 bianliang 在每次输入学生姓名是清零.