问题描述
求指教,代码如下!privatevoidsaveButton_Click(objectsender,EventArgse){stringstrExcelFileName=openFileDialog1.FileName;stringstrCon="Provider=Microsoft.ACE.OLEDB.12.0;DataSource="+strExcelFileName+";ExtendedProperties=*Excel12.0;HDR=YES;IMEX=0*";stringstrCom="SELECT*FROM[Sheet1$]";OleDbConnectionmyConn=newOleDbConnection(strCon);myConn.Open();OleDbDataAdaptermyDataAdapter=newOleDbDataAdapter(strCom,myConn);DataSetmyDataSet=newDataSet();myDataAdapter.Fill(myDataSet,"[Sheet1$]");myConn.Close();DataTabledt=myDataSet.Tables[0];foreach(DataGridViewColumnheaderCellindataGridView1.Columns){dt.Columns.Add(headerCell.HeaderText);//名为“序列号”的列已属于此DataTable}foreach(DataGridViewRowitemindataGridView1.Rows){DataRowdr=dt.NewRow();for(inti=0;i<dt.Columns.Count;i++){dr[0]=item.Cells[i].Value.ToString();}dt.Rows.Add(dr);}
解决方案
解决方案二:
要new一个Columns.不能把别的表的列加入新表.
解决方案三:
add列之前,线查找是否已经存在同名的列,如果有,先删除,再添加(或者略过)
解决方案四:
dataGridView1.Columns中存在相同名称的列名
解决方案五:
DataTabledt=myDataSet.Tables[0];你已经把整个表都赋值给dt了,而且是将dt指向了myDataSet.Tables[0](dt是个引用类型),而不是将表结构或表数据copy给dt你应该重新new一个dt,再执行下面的代码.
解决方案六:
回答Z65443344:1.我new过一个,但是现实要求我指向一个实例,也就是新的dt没有指向实例,不能够运行。
解决方案七:
我也尝试过将sheet1改成了sheet2,我的理解是即是实例,也没有那个列,但是还是错的,错误是索引为负数。
解决方案八:
回答bdmh:请问如何判断?如何删除?语句是什么?代码是什么?
解决方案九:
引用5楼u011612713的回复:
回答Z65443344:1.我new过一个,但是现实要求我指向一个实例,也就是新的dt没有指向实例,不能够运行。
1.谁要求你指向一个实例??2.stringstrCom="SELECT*FROM[Sheet1$]";这个SQL语句只能查询Sheet1,你怎么可能把dt指向Sheet2??
解决方案十:
3.foreach(DataGridViewColumnheaderCellindataGridView1.Columns){dt.Columns.Add(headerCell.HeaderText);//名为“序列号”的列已属于此DataTable}这代码你先写个伪代码出来,然后再翻译成代码行吗?逻辑十分混乱dataGridView1是前台的表格,你要查询数据库然后填充这个表格,怎么又循环表格去填充后台数据源??这表格里有数据吗?
解决方案十一:
先写个伪代码,过程可以省略,业务逻辑要详细比如循环,就写循环,不要写什么定义个i或者j什么的这样才能方便人家看懂你到底想干什么从你的代码,根本看不出来你到底想干什么
解决方案十二:
回答xue529290400:我知道此datatable中已经存在这个列,所以不能够再添加。你的意思是让我在这个datatable中重新建一个列是吗?可是我想覆盖掉之前的列。
解决方案十三:
这个表格里有数据,我的逻辑是先打开一个excel显示在dataviewgrid中,之后再dataviewgrid中修改,再保存到之前的excel中。我之前有一个打开代码如下:privatevoidopenButton_Click(objectsender,EventArgse){//OpenFileDialogfile=newOpenFileDialog();openFileDialog1.ShowDialog();readData(openFileDialog1.FileName);}privatevoidreadData(stringstrExcelFileName){stringstrConn="Provider=Microsoft.Ace.OleDb.12.0;"+"datasource="+strExcelFileName+";ExtendedProperties='Excel12.0;HDR=Yes;IMEX=1'";stringstrCom="SELECT*FROM[Sheet1$]";OleDbConnectionmyConn=newOleDbConnection(strConn);myConn.Open();OleDbDataAdaptermyDataAdapter=newOleDbDataAdapter(strCom,strConn);DataSetmyDataSet=newDataSet();myDataAdapter.Fill(myDataSet,"sheet1");myConn.Close();dataGridView1.DataSource=myDataSet.Tables["sheet1"].DefaultView;}
解决方案十四:
DataTabledt=myDataSet.Tables[0].Clone克隆表DataTabledt=myDataSet.Tables[0].Copy拷贝表
解决方案十五:
你应该查的是如何打开一个excel(open),然后修改,然后保存(save)而不是再去重新读一次excel而且,如果你想获取dataGridView1的数据,用datatabledt=dataGridView1.DataSource就可以获取到了,不过不推荐这样用你不要dataGridView1.DataSource=myDataSet.Tables["sheet1"].DefaultView;这样直接赋值而是先把myDataSet.Tables["sheet1"].DefaultView放到一个全局的dt里操作完dataGridView1,回头直接去dt里取数据就行了.不要来回折腾数据源了
解决方案:
1.点击打开按钮,打开excel,建立连接,数据到dataset2.绑定dataviewgrid到dataset.table,将数据显示到dataviewgrid中3.修改dataviewgrid中数据,例如添加和修改(没有删除)4.点击保存,将数据保存至excel中,我第一次贴的代码就是保存的代码5.保存:先建立连接;将dataviewgrid中数据添加至新建表dt中,dt指向了一个实例,dataset的table【0】,这个dataset填充的是之前打开的excel的sheet1ps:我做过改动,将下面这句DataTabledt=myDataSet.Tables[0];//初始化DataTable实例改为了DataTabledt=newDataTable();出现的错误为:
解决方案:
你还是立即停止研究这个套路根本不对写入excel和读取excel完全不是一个套路你先研究研究如何导出到excel的代码,稍作修改,不新建,而是打开已有的excel,就行了或者新建也可以,然后导出,覆盖掉原有的excel,效果一样.你把导入的代码研究烂了,也实现不了导出的功能.
解决方案:
还有,未将对象引用到实例的错误,是某个变量为null了,跟dt是否指向某个实例一点关系都没有出现错误,你先调试出到底哪行出现错误好吗,不要瞎猜啊
解决方案:
myDataSet.Tables[0];已经有序列号这个列,你再添加自然重复。你读取的Sheet1$里面已有序列号列,如果看不到请显示隐藏列。
解决方案:
还有,趁着你还没研究透彻OLEDB到底怎么用,趁早改学NPOI吧用OLEDB问题太多了,还要考虑32位和64位的问题,还要考虑不同目标机上安装的OFFICE版本不同(有些甚至是WPS)这里是下载地址
解决方案:
谢大神!我先整理思路!在打开的基础上导入,而不是新建再导入,这个我研究过,没有成功。。。所以才想的这个办法。
解决方案:
刚开始学习c#,摸着石头过河,参考了很多选了OLEDB,已经发现很多问题了!我本来想尝试excel对象方法!都没有接触过,不知哪个好,只能一个个试过来,再次感谢大家!
解决方案:
刚才那个问题确实是乱猜了,那个null指的是dataviewgrid中的新增的表格为空?这个我不能理解.1.打开excel,数据到了dataviewgrid中2.修改dataviewgrid,在里面添加了一行3.将dataviewgrid中所有数据复制到dt中,当运行至增加的行时,出现了错误。表格入下:第五行,序列号4为新增,在页面增加,手动增加。代码如下:foreach(DataGridViewColumnheaderCellindataGridView1.Columns){dt.Columns.Add(headerCell.HeaderText);}introwCount=0;foreach(DataGridViewRowitemindataGridView1.Rows){rowCount++;DataRowdr=dt.NewRow();for(inti=0;i<dt.Columns.Count;i++){dr[0]=item.Cells[i].Value.ToString();}dt.Rows.Add(dr);}错误如下:
解决方案:
因为你设置了表格可以用户新增行那么最后一行是空行,里面是nullnull执行ToString(),当然就报错了
解决方案:
名称不能一样你sql换个别名吧
解决方案:
放灵活一点,错误提示已经说得很清楚了
解决方案:
在我的不懈努力之下终于可以更新了,但是更新有问题啊!!!我在dataviewgrid中添加了一行4yy,但是excel中添加了四行:代码如下:privatevoidsaveButton_Click(objectsender,EventArgse){stringstrExcelFileName=openFileDialog1.FileName;stringstrCon="Provider=Microsoft.ACE.OLEDB.12.0;DataSource="+strExcelFileName+";ExtendedProperties='Excel12.0;HDR=YES;IMEX=0'";stringstrCom="SELECT*FROM[Sheet1$]";OleDbConnectionmyConn=newOleDbConnection(strCon);myConn.Open();OleDbDataAdaptermyDataAdapter=newOleDbDataAdapter(strCom,myConn);DataSetmyDataSet=newDataSet();myDataAdapter.Fill(myDataSet,"[Sheet1$]");myConn.Close();myDataSet.Tables[0].Clear();DataTabledt=myDataSet.Tables[0];/*foreach(DataGridViewColumnheaderCellindataGridView1.Columns){dt.Columns.Add(headerCell.HeaderText);dt.columns}*/introwCount=0;foreach(DataGridViewRowitemindataGridView1.Rows){rowCount++;DataRowdr=dt.NewRow();for(inti=0;i<dt.Columns.Count;i++){if(item.Cells[i].Value!=null)dr[i]=item.Cells[i].Value.ToString();}dt.Rows.Add(dr);}OleDbCommandBuilderodcb=newOleDbCommandBuilder(myDataAdapter);odcb.QuotePrefix="[";//用于搞定INSERTINTO语句的语法错误odcb.QuoteSuffix="]";myDataAdapter.Update(myDataSet,"[Sheet1$]");//更新数据集对应的表dataGridView1.DataSource=myDataSet.Tables[0].DefaultView;//显示到datagridview}
解决方案:
废话嘛.你这是又去数据库里查询了一次,把数据放到dt里然后循环表,追加到dt的后面去你不敢直接new个dt出来或者dt赋值完先clear掉,再add
解决方案:
1.我clear了啦,加粗看到没,dt我也clear过,没有效果。2.也尝试过将myConn.Close();放置最后,也没有效果。
解决方案:
可是这样更新就没问题啊:privatevoidForm1_Load(objectsender,EventArgse){stringstrCon="Provider=Microsoft.ACE.OLEDB.12.0;DataSource="+@"d:/成绩表2013.xlsx"+";ExtendedProperties='Excel12.0;HDR=YES;IMEX=0'";OleDbConnectionmyConn=newOleDbConnection(strCon);stringstrCom="SELECT*FROM[Sheet1$]";myConn.Open();OleDbDataAdaptermyDataAdapter=newOleDbDataAdapter(strCom,myConn);DataSetmyDataSet=newDataSet();myDataAdapter.Fill(myDataSet,"[Sheet1$]");myConn.Close();DataTabledt=myDataSet.Tables[0];//初始化DataTable实例dt.PrimaryKey=newDataColumn[]{dt.Columns["序列号"]};//创建索引列DataRowmyRow=dt.NewRow();myRow["序列号"]=4;myRow["人名"]=yz;dt.Rows.Add(myRow);OleDbCommandBuilderodcb=newOleDbCommandBuilder(myDataAdapter);odcb.QuotePrefix="[";//用于搞定INSERTINTO语句的语法错误odcb.QuoteSuffix="]";myDataAdapter.Update(myDataSet,"[Sheet1$]");//更新数据集对应的表dataGridView1.DataSource=myDataSet.Tables[0].DefaultView;//显示到datagridview}这个我试过,至增加一行!!不会将之前的也增加一遍!!
解决方案:
断点跟,clear之后,是否真的清空了MS上次听说某个版本的vs执行clear没有反应,需要执行rows.clear和columns.clear才行
解决方案:
我现在开始着手与研究新方法,不过老方法我也不会放弃!!!
解决方案:
真的清空了,我断点看过了,只有两个抬头了,数据都没得了。
解决方案:
我知道了.myDataAdapter.Update(myDataSet,"[Sheet1$]")这个你还是换个方式,不要这么用了它会自己检测哪些是新增的,哪些是已有修改的你如果不改动myDataSet,它会去更新,而不是插入而如果你clear掉了,重新add进去,它会认为所有4条都是新数据,所以就多出4条来
解决方案:
1.应该是的!如果不clear,那么添加的更多。2.弊病出现在,dataviewgrid中数据必须一个个拿出来添加到datatable中,不能只拿新增。3.如果可以只拿增加的出来,就不需要cleardatatable。4.添加对比,找到哪些是新增也是一个办法,应该麻烦!我可以尝试一下。