以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- [求助]在导入EXCEL表数据的时候,如何不让列为空的数据导入 (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=107137) |
-- 作者:jjjeyes -- 发布时间:2017/9/21 22:44:00 -- [求助]在导入EXCEL表数据的时候,如何不让列为空的数据导入 在导入数据的时候,有一列的值如果有数据,则正常导入,如果没有数据则不导入此列,由代码赋值。 比如有一个excel的表,其中的一列“班主任”,如果上面有值,则正常导入到foxtable的“系统表”内, 如果excel表的“班主任”上没有值,则由“系统表”的DataColChanged事件中的代码附一个值: Dim dr As DataRow dr = DataTables("设置").DataRows(0) If e.DataCol.name = "学号" Then If e.DataRow("学号") IsNot Nothing Then e.DataRow("班主任") = dr("班主任") End If End If 导入代码如下:求高手帮忙 Dim dt As DataTable = DataTables("系统表") Dim Result As DialogResult Result = MessageBox.Show("确定要导入吗?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) If Result = DialogResult.Yes Then Dim dlg As New OpenFileDialog dlg.Filter = "Excel2003文件|*.xls|Excel2007文件|*.xlsx" dlg.MultiSelect = True \'允许选择多个文件 If dlg.ShowDialog =DialogResult.OK Then Dim Book As New XLS.Book(dlg.FileName) Dim Sheet As XLS.Sheet = Book.Sheets(0) dt.ResumeRedraw() dt.StopRedraw() \'systemready = False Dim nms As New Dictionary(Of String, Integer) Dim dic As new Dictionary(Of DataRow, Integer) Dim ls As new List(Of Integer) For c As Integer = 0 To sheet.Cols.Count - 1 If dt.DataCols.Contains(sheet(0,c).Text.replace(" ", "")) Then nms.Add(sheet(0,c).Text.replace(" ", ""), c) End If Next For n As Integer = 1 To Sheet.Rows.Count -1 Dim sfzhm As String = sheet(n,nms("学号")).Text If sfzhm = "" Then Continue For Dim dr As DataRow = dt.Find("学号 = \'" & sfzhm & "\'") If dr Is Nothing Then ls.add(n) Else dic.Add(dr, n) End If Next For Each key As DataRow In dic.Keys For Each m As String In nms.keys If dt.DataCols(m).IsBoolean Then If Sheet(dic(key),nms(m)).Text = "" OrElse Sheet(dic(key),nms(m)).Text = "False" OrElse Sheet(dic(key),nms(m)).Value = 0 Then key(m) = False Else key(m) = True End If Else If dt.DataCols(m).Expression > "" Then \'表达式列 Else If dt.DataCols(m).IsNumeric Then key(m) = val(Sheet(dic(key),nms(m)).Value) Else If dt.DataCols(m).IsDate Then Dim d As Date If Date.TryParse(Sheet(dic(key),nms(m)).Value, d) key(m) = d End If Else key(m) = Sheet(dic(key),nms(m)).Value End If Next Next For Each l As Integer In ls Dim ndr As DataRow = dt.AddNew For Each m As String In nms.keys If dt.DataCols(m).IsBoolean Then If Sheet(l,nms(m)).Text = "" OrElse Sheet(l,nms(m)).Text = "False" OrElse Sheet(l,nms(m)).Value = 0 Then ndr (m) = False Else ndr (m) = True End If Else If dt.DataCols(m).Expression > "" Then \'表达式列 Else If dt.DataCols(m).IsNumeric Then ndr (m) = val(Sheet(l,nms(m)).Value) Else If dt.DataCols(m).IsDate Then Dim d As Date If Date.TryParse(Sheet(l,nms(m)).Value, d) ndr (m) = d End If Else ndr (m) = Sheet(l,nms(m)).Value End If Next Next dt.ResumeRedraw() \'systemready = True End If End If |
-- 作者:jjjeyes -- 发布时间:2017/9/21 23:13:00 -- 我有办法了,先全部导入进来,然后对“班主任”为空的行用RaiseDataColChanged(DataRow)或RaiseDataColChanged(Filter) 可否?
|
-- 作者:有点甜 -- 发布时间:2017/9/21 23:27:00 -- datacolchanged事件的代码改一下 Dim dr As DataRow dr = DataTables("设置").DataRows(0) If e.DataCol.name = "班主任" Then If e.DataRow("班主任") = nothing Then e.DataRow("班主任") = dr("班主任") End If End If |
-- 作者:jjjeyes -- 发布时间:2017/9/22 0:11:00 -- 甜老师您的这个代码不成立!! 导入为空值的时候,不能改变!
|
-- 作者:有点甜 -- 发布时间:2017/9/22 8:46:00 -- 上传测试例子测试。 |
-- 作者:jjjeyes -- 发布时间:2017/9/22 11:36:00 -- 导入数据后没有内容的“素质导师”,“工号”,“素导电话”,“学院”应该被写入,可是没有。 登录后,必须输入红色部分内容,内容填写到“设置”表。 目标要求: 如果:导入Excel表中“素质导师”,“工号”,“素导电话”,“学院”字段有内容,则保持原有内容导入。 如果:导入Excel表中“素质导师”,“工号”,“素导电话”,“学院”字段无内容,则用“设置”表的第一行内容填充到“系统表”中。
[此贴子已经被作者于2017/9/22 12:15:48编辑过]
|
-- 作者:有点甜 -- 发布时间:2017/9/22 12:29:00 -- 导入后,重置列
DataTables("系统表").datacols("学号").RaiseDataColChanged("素质导师 is null") |
-- 作者:jjjeyes -- 发布时间:2017/9/22 13:01:00 -- 我也想到了,用的代码是: Dim sts() As String = {"素质导师","工号","素导电话","院系名称"} For Each st As String In sts For Each r As Row In Tables("系统表").Rows If r.IsNull(st) = True Then DataTables("系统表").DataCols("学号").RaiseDataColChanged(r.IsNull(st)) End If Next Next |
-- 作者:有点甜 -- 发布时间:2017/9/22 14:41:00 -- 直接执行7楼代码,不需要像8楼那样写。 |
-- 作者:jjjeyes -- 发布时间:2017/9/22 14:48:00 -- 因为我是有多列值为空时,任意一列没有值就重置列 |