麻烦各位大神帮帮忙!C#解析xml实现对应数据库中的字段,导入excel数据到orcel数据库

lalalanbai 2016-02-18 09:22:23
我现在已经写好了导入数据库了,可是字段是定死的,预防有时候excel表格有变化,方便修改,所以解析xml,然后在xml对应字段,然后再导入到数据库中。
可是不知道怎么编写xml,还有解析xml对应字段。
...全文
439 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
WEMT 2018-05-04
  • 打赏
  • 举报
回复
具体的是什么一个流程啊!跪求!我正在做这个功能!
qbilbo 2016-02-18
  • 打赏
  • 举报
回复
引用 14 楼 lalalanbai 的回复:
[quote=引用 12 楼 qbilbo 的回复:] <?xml version="1.0" encoding="utf-8" ?> <InputRules> <Rule Name="规则1" OracleTableName="表1" ExcelWithTitle="True" ExcelReadMode="ByName" > <Column ExcelColumn="列1" DisplayText="列名1" OracleColumn="字段1" OracleType="varchar2" /> <Column ExcelColumn="列2" DisplayText="列名2" OracleColumn="字段2" OracleType="int"/> ... </Rule> <Rule Name="规则2" OracleTableName="表1" ExcelWithTitle="False" ExcelReadMode="ByIndex"> <Column ExcelColumn="0" DisplayText="列名1" OracleColumn="字段1" OracleType="varchar2" /> <Column ExcelColumn="1" DisplayText="列名2" OracleColumn="字段2" OracleType="int"/> ... </Rule> ... </InputRules>
能不能解释一下,我就只有一个表,那个Rule Name ='规则12'什么意思,只要一个就好了吧就一个表。[/quote] 没规定必须要多个Rule的吧。 你都想到了字段可能会变,那你为什么没想过有可能多种Excel格式同时存在?同时有N种格式,你就写N个程序?如果说不可能同时存在多种Excel格式,那你就只留一个配置不就行了? 至于表名的问题,我想说的是:将Excel中的数据导入到数据库是个经常碰到的问题。与其每次都复制粘贴改代码,不如一劳永逸。
lalalanbai 2016-02-18
  • 打赏
  • 举报
回复
引用 20 楼 shingoscar 的回复:
就是把数据库的字段对应到excel的列?
大概这个意思。这个写在xml,解析xml导入。
Poopaye 2016-02-18
  • 打赏
  • 举报
回复
就是把数据库的字段对应到excel的列?
lalalanbai 2016-02-18
  • 打赏
  • 举报
回复
引用 16 楼 dongshaohua 的回复:
[quote=引用 15 楼 lalalanbai 的回复:] [quote=引用 13 楼 xdashewan 的回复:] [quote=引用 11 楼 lalalanbai 的回复:] 可是你要怎么对应数据库里的字段啊,是要读取列名然后对比吗。。。这样的话不行的呀。
原来如此,你的excel字段竟然对不上数据库。如果是这样其实也也不必生成额外的xml,直接使用appconfig,在里面加个Section,使用(NameValueCollection)ConfigurationManager.GetSection(strName)就能读取内容了[/quote] 没有生成额外的xml吖,只是你在导入的时候先解析xml知道哪个字段对应excel的哪个列名,然后就可以自动导入了。你说的那个appconfig我没懂啥意思。[/quote] appconfig 是和xml差不多的格式,后缀名是.config,配置文件 [/quote] 好心塞好心塞,智商不够用了,我自己好好想想吧。
dongshaohua 2016-02-18
  • 打赏
  • 举报
回复
//获得支付配置文件的路径 public static string url = System.AppDomain.CurrentDomain.BaseDirectory + "\\Config\\pay.config"; /// <summary> /// <summary> /// 获得支付配置文件的列表 /// </summary> /// <returns></returns> public static List<B_Pay> GetPayList() { XmlDocument xml = new XmlDocument(); xml.Load(url); XmlNode node = xml.SelectSingleNode("acf.pay/payList"); List<B_Pay> list = new List<B_Pay>(); foreach (XmlNode item in node.ChildNodes) { B_Pay pay = new B_Pay(); pay.name = item.Attributes["name"].Value; pay.desc = item.Attributes["desc"].Value; pay.gateway = item.Attributes["gateway"].Value; list.Add(pay); } return list; } 这是读取xml格式,解析XML的代码,B_Pay是一个实体类,可以根据你的业务需求做响应的修改
xdashewan 2016-02-18
  • 打赏
  • 举报
回复
引用 15 楼 lalalanbai 的回复:
没有生成额外的xml吖,只是你在导入的时候先解析xml知道哪个字段对应excel的哪个列名,然后就可以自动导入了。你说的那个appconfig我没懂啥意思。
既然xml已经有了就直接用吧,照此来看规则应该是可选的,如果你只需要1套规则也是没有问题的,多规则可能是他有界面可以控制使用哪套规则去对应字段,也有可能是循环自动匹配其中一套规则,可以同时应付多种格式excel
dongshaohua 2016-02-18
  • 打赏
  • 举报
回复
引用 15 楼 lalalanbai 的回复:
[quote=引用 13 楼 xdashewan 的回复:] [quote=引用 11 楼 lalalanbai 的回复:] 可是你要怎么对应数据库里的字段啊,是要读取列名然后对比吗。。。这样的话不行的呀。
原来如此,你的excel字段竟然对不上数据库。如果是这样其实也也不必生成额外的xml,直接使用appconfig,在里面加个Section,使用(NameValueCollection)ConfigurationManager.GetSection(strName)就能读取内容了[/quote] 没有生成额外的xml吖,只是你在导入的时候先解析xml知道哪个字段对应excel的哪个列名,然后就可以自动导入了。你说的那个appconfig我没懂啥意思。[/quote] appconfig 是和xml差不多的格式,后缀名是.config,配置文件
lalalanbai 2016-02-18
  • 打赏
  • 举报
回复
引用 13 楼 xdashewan 的回复:
[quote=引用 11 楼 lalalanbai 的回复:] 可是你要怎么对应数据库里的字段啊,是要读取列名然后对比吗。。。这样的话不行的呀。
原来如此,你的excel字段竟然对不上数据库。如果是这样其实也也不必生成额外的xml,直接使用appconfig,在里面加个Section,使用(NameValueCollection)ConfigurationManager.GetSection(strName)就能读取内容了[/quote] 没有生成额外的xml吖,只是你在导入的时候先解析xml知道哪个字段对应excel的哪个列名,然后就可以自动导入了。你说的那个appconfig我没懂啥意思。
lalalanbai 2016-02-18
  • 打赏
  • 举报
回复
引用 12 楼 qbilbo 的回复:
<?xml version="1.0" encoding="utf-8" ?> <InputRules> <Rule Name="规则1" OracleTableName="表1" ExcelWithTitle="True" ExcelReadMode="ByName" > <Column ExcelColumn="列1" DisplayText="列名1" OracleColumn="字段1" OracleType="varchar2" /> <Column ExcelColumn="列2" DisplayText="列名2" OracleColumn="字段2" OracleType="int"/> ... </Rule> <Rule Name="规则2" OracleTableName="表1" ExcelWithTitle="False" ExcelReadMode="ByIndex"> <Column ExcelColumn="0" DisplayText="列名1" OracleColumn="字段1" OracleType="varchar2" /> <Column ExcelColumn="1" DisplayText="列名2" OracleColumn="字段2" OracleType="int"/> ... </Rule> ... </InputRules>
能不能解释一下,我就只有一个表,那个Rule Name ='规则12'什么意思,只要一个就好了吧就一个表。
xdashewan 2016-02-18
  • 打赏
  • 举报
回复
引用 11 楼 lalalanbai 的回复:
可是你要怎么对应数据库里的字段啊,是要读取列名然后对比吗。。。这样的话不行的呀。
原来如此,你的excel字段竟然对不上数据库。如果是这样其实也也不必生成额外的xml,直接使用appconfig,在里面加个Section,使用(NameValueCollection)ConfigurationManager.GetSection(strName)就能读取内容了
qbilbo 2016-02-18
  • 打赏
  • 举报
回复
<?xml version="1.0" encoding="utf-8" ?> <InputRules> <Rule Name="规则1" OracleTableName="表1" ExcelWithTitle="True" ExcelReadMode="ByName" > <Column ExcelColumn="列1" DisplayText="列名1" OracleColumn="字段1" OracleType="varchar2" /> <Column ExcelColumn="列2" DisplayText="列名2" OracleColumn="字段2" OracleType="int"/> ... </Rule> <Rule Name="规则2" OracleTableName="表1" ExcelWithTitle="False" ExcelReadMode="ByIndex"> <Column ExcelColumn="0" DisplayText="列名1" OracleColumn="字段1" OracleType="varchar2" /> <Column ExcelColumn="1" DisplayText="列名2" OracleColumn="字段2" OracleType="int"/> ... </Rule> ... </InputRules>
lalalanbai 2016-02-18
  • 打赏
  • 举报
回复
引用 10 楼 xdashewan 的回复:
[quote=引用 9 楼 lalalanbai 的回复:] 如果这样说,那不就是定死了吗。。。
怎么能使定死呢,你用循环读excel里的列读到空认为结束。比如excel现在有a,b两列,你读单元格1的时候读到的字段名是a,读单元格2的时候读到的字段名是b,读到单元格3为空结束。然后照你说如果excel里a,b两列次序更改,你程序读单元格1的时候读到的字段名是b,读单元格2的时候读到的字段名是a,同样读到单元格3为空结束。再加入excel加了一列c,那么你程序会循环读到单元格4为空结束,这不就是动态吗[/quote] 可是你要怎么对应数据库里的字段啊,是要读取列名然后对比吗。。。这样的话不行的呀。
xdashewan 2016-02-18
  • 打赏
  • 举报
回复
引用 9 楼 lalalanbai 的回复:
如果这样说,那不就是定死了吗。。。
怎么能使定死呢,你用循环读excel里的列读到空认为结束。比如excel现在有a,b两列,你读单元格1的时候读到的字段名是a,读单元格2的时候读到的字段名是b,读到单元格3为空结束。然后照你说如果excel里a,b两列次序更改,你程序读单元格1的时候读到的字段名是b,读单元格2的时候读到的字段名是a,同样读到单元格3为空结束。再加入excel加了一列c,那么你程序会循环读到单元格4为空结束,这不就是动态吗
lalalanbai 2016-02-18
  • 打赏
  • 举报
回复
引用 8 楼 xdashewan 的回复:
[quote=引用 7 楼 lalalanbai 的回复:] 列名顺序会变得,顺序是会变得,不固定。
列名顺序的变化并不会印象到数据导入吧,insert table(a,b)和insert table(b,a)都可以完成数据插入[/quote] 如果这样说,那不就是定死了吗。。。
xdashewan 2016-02-18
  • 打赏
  • 举报
回复
引用 7 楼 lalalanbai 的回复:
列名顺序会变得,顺序是会变得,不固定。
列名顺序的变化并不会印象到数据导入吧,insert table(a,b)和insert table(b,a)都可以完成数据插入
xdashewan 2016-02-18
  • 打赏
  • 举报
回复
引用 5 楼 lalalanbai 的回复:
读取excel,如果以后excel列名改了我就要改代码了。解析xml我就直接修改xml就行了。
你读取excel不应该是按照单元格方式读取吗,至于同一单元格列名文字是a还是b没有关系吧
lalalanbai 2016-02-18
  • 打赏
  • 举报
回复
引用 6 楼 xdashewan 的回复:
[quote=引用 5 楼 lalalanbai 的回复:] 读取excel,如果以后excel列名改了我就要改代码了。解析xml我就直接修改xml就行了。
你读取excel不应该是按照单元格方式读取吗,至于同一单元格列名文字是a还是b没有关系吧[/quote] 列名顺序会变得,顺序是会变得,不固定。
lalalanbai 2016-02-18
  • 打赏
  • 举报
回复
引用 3 楼 xdashewan 的回复:
[quote=引用 2 楼 lalalanbai 的回复:] 有列名啊,列名是不变的,就是用xml来写,如果以后列名有改变就不用改代码了,直接修改xml文件就行了。
既然excel里有列名,那么你直接读excel里列名不就实现了动态列名,你xml能改excel就不能改吗[/quote] 读取excel,如果以后excel列名改了我就要改代码了。解析xml我就直接修改xml就行了。
lalalanbai 2016-02-18
  • 打赏
  • 举报
回复
引用 3 楼 xdashewan 的回复:
[quote=引用 2 楼 lalalanbai 的回复:] 有列名啊,列名是不变的,就是用xml来写,如果以后列名有改变就不用改代码了,直接修改xml文件就行了。
既然excel里有列名,那么你直接读excel里列名不就实现了动态列名,你xml能改excel就不能改吗[/quote] 我知道这样,可是修改xml方便一点,不用一个个读取还要对比那么麻烦,有办法吗。
加载更多回复(3)

110,534

社区成员

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

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

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