多谢老师赐教 但我试了 另存成txt格式还是合并不进来。。。并且用talbe delimited 和unicode两种txt格式都试了,合并后还是不行,空的
导入到access可能有点麻烦,因为项目发布后给同事们用的 他们很多人都没有装access不会用access,即便会用,每天他们都要批量导进来一些数据的,这样他们嫌太麻烦
平常他们也只是用excel
最终我决定用您提到的编代码的方式,可还有好几类表也有可能要导数据进来,列数还很多,就想编个通用代码:
我试了一下,可以用了。但有些问题希望能得到老师指点:
1. 我本来想用datatables ,因为我不想打乱顺序,想从datatable的最后一行数据着往下加数据,可是试了一下不成功,提示什么键值不存在,请问老师用datatable这种方法可不可取?有没有办法实现?
2. 如果用tables,正常状态下,前台只显示一部分筛选的数据,这时把数据合并进来之后,datatable里原来的行的顺序都打被乱了(也不知道会不会出什么问题)。
请问老师如果用tables的方法,如何让合并进来的行,全部排到datatable所有行的最后面?以便不打乱原有的顺序
3. 能否看下这段代码还有哪些毛病或是隐患,帮忙再优化一下。
Dim dlg As New OpenFileDialog '定义一个新的 OpenFileDialog
dlg.Filter= "Excel 文件*.xls,*.xlsx|*.xls;*.xlsx" '设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then
Dim Book As New XLS.Book(dlg.filename) ' 定义选定的工作薄
Dim Sheet As XLS.Sheet = Book.Sheets(0) ' 定义第一个工作表
Dim sc As Integer = sheet.Rows.Count-1 ' 返回即将要导进来的表有多少行数据,比如有带标题栏共300行,sc初始值为299(不带标题行)
Dim nm As String =CurrentTable.Name ' 返回当前表的表名
Dim tr As Integer = Tables(nm).Rows.Count-1 '当前表有多少行数据,比如有 900000行 ,则tr初 始值为899999
Dim tc As Integer = Tables(nm).Cols.Count-1 '返回当前表有多少列数据,比如 有31 列 ,则tc初 始值为30
Dim x As Integer '定义写入的行坐标
Dim y As Integer '定义写入的列坐标
Tables(nm).AddNew(sc) ' 加299行,标题栏已经有了,不用再导进来
For i As Integer = 1 To sc '要写行来的行数从1到299往行坐标上增加, 大循环298次,第一个单元格sheet(1,0)开始 跳过第一行标题栏
x = tr+i ' 比如rows(900000)表示新的一行,rows(x)的初始值为rows(tr+i)=rows(899999+1)=rows(900000)
For y = 0 To tc ' 从第一列开始计数,一直递增到第30列即最后一列
If sheet(i,y) Is Nothing Then '判断导进来有没有空值
Tables(nm).Rows(x)(y) = Nothing '如果有空值,那单元格也不要赋值了
Else
Tables(nm).Rows(x)(y) = Sheet(i,y).Value ' 合并进来的数据逐行逐行赋值给当前表格
End If
Next
Next
End If