紧急求助:vb.net读取Excel问题

zhangfengyi 2011-05-05 11:22:20
问题描述:需要对多张Excel报表进行合并,首先需要用oledb的方式读取Excel 数据,然后写入到新Excel中。现在的问题是:在读取Excel时为什么总是最后一列找不到,有时明明有数据,确提示NULL,请高手指教。在线等
截图如下:实际第10列是有的,但是如果打开Excel任意改变一个单元格,然后保存就没问题了,但报表随机生成的,不可能每个都去改,这是不现实的。






...全文
143 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangfengyi 2011-05-10
  • 打赏
  • 举报
回复
tjficcbw(津津)帮忙,上边就是看的你的贴子
zhangfengyi 2011-05-06
  • 打赏
  • 举报
回复
这段代码把所有行都输出,现在要求输出一部分,怎么处理

'Dim i As Short
'Dim j As Short
Dim xlApp As Microsoft.Office.Interop.Excel.Application
Dim xlBook As Microsoft.Office.Interop.Excel.Workbook
Dim xlSheet As Microsoft.Office.Interop.Excel.Worksheet
Dim xlsName As String


Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click

Dim intColNum As Integer
Dim intRowNum As Integer
xlsName = My.Application.Info.DirectoryPath & "\IssSettDetails0754970089800019800000420110303.xls"

'用 Add方法 创建新的工作簿和工作表对象。
xlApp = New Microsoft.Office.Interop.Excel.Application
xlBook = xlApp.Workbooks.Open(xlsName)
xlSheet = xlBook.Worksheets("sheet1")
xlSheet.Name = "sheet1"
'xlAppExcelFile.ShowWindowsInTaskbar = False
xlSheet = xlBook.Sheets(1)
intRowNum = xlSheet.UsedRange.Rows.Count
intColNum = xlSheet.UsedRange.Columns.Count
' If Err.Number = 1004 Then
' xlSheet.Name = formatdatetime(DateTimePicker1, "yyyymm")
' MsgBox (DateTimePicker1 & "工作表已存在将自动产生sheel系列工作表")
' Err.Number = 0
' End If


'将data3的值赋给Microsoft Excel 单元。
'sqlString = "select * from worktable"
'If Conn.State = 1 Then
' If Rs.State = 1 Then Rs.Close()
' Rs.Open(sqlString, Conn, 1, 1)
'Else
' Conn.Open(conString)
' Rs.Open(sqlString, Conn, 1, 1)
'End If


'For i = 0 To 5
' For j = 0 To 7
' xlSheet.Cells._Default(i + 1, j + 1).Value = i & "," & j
' Next j
'Next i
'xlSheet.Cells(3, 1).Formula = "=R1C1 + R2C1"
'保存工作表
MessageBox.Show(xlSheet.Cells._Default(16, 8).Value.ToString + ":" + intColNum.ToString + ":" + intRowNum.ToString)
xlSheet.Cells._Default(18, 8).Value = 11
xlSheet.StandardWidth = 2
'xlSheet.SaveAs(App.path & "\" & FormatDateTime(DateTimePicker1, "yyyy年mm月值班表") & FormatDateTime(Now(), "hhmmss") & ".xls")
xlSheet.SaveAs("e:\1.xls")
xlBook.Save()
xlBook.Close()

'用 Quit 方法关闭 Microsoft Excel
xlApp.Quit()

'释放对象
Dim pro As Process
For Each pro In Process.GetProcesses
If pro.ProcessName = "EXCEL" Then
pro.Kill()
End If
Next
End Sub
zhangfengyi 2011-05-06
  • 打赏
  • 举报
回复
现在改成文件读取方式,取出Excel中的数据,上边的问题基本解决,但我怎样控制每一行,比如,最后三行不输出,怎么办,请指教。

Dim i As Short
Dim j As Short
Dim xlApp As Microsoft.Office.Interop.Excel.Application
Dim xlBook As Microsoft.Office.Interop.Excel.Workbook
Dim xlSheet As Microsoft.Office.Interop.Excel.Worksheet
Dim xlsName As String


Private Sub Botton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
xlsName = My.Application.Info.DirectoryPath & "\temp.xls"

'用 Add方法 创建新的工作簿和工作表对象。
xlApp = New Microsoft.Office.Interop.Excel.Application
xlBook = xlApp.Workbooks.Open(xlsName)
'Set xlBook = xlApp.Workbooks.Add
xlSheet = xlBook.Worksheets("work")
xlSheet.Name = "work"
' If Err.Number = 1004 Then
' xlSheet.Name = formatdatetime(DateTimePicker1, "yyyymm")
' MsgBox (DateTimePicker1 & "工作表已存在将自动产生sheel系列工作表")
' Err.Number = 0
' End If


'将data3的值赋给Microsoft Excel 单元。
'sqlString = "select * from worktable"
'If Conn.State = 1 Then
' If Rs.State = 1 Then Rs.Close()
' Rs.Open(sqlString, Conn, 1, 1)
'Else
' Conn.Open(conString)
' Rs.Open(sqlString, Conn, 1, 1)
'End If


For i = 0 To 5
For j = 0 To 7
xlSheet.Cells._Default(i + 1, j + 1).Value = i & "," & j
Next j
Next i
'xlSheet.Cells(3, 1).Formula = "=R1C1 + R2C1"
'保存工作表
'xlSheet.StandardWidth = 2
'xlSheet.SaveAs (App.path & "\" & formatdatetime(DateTimePicker1, "yyyy年mm月值班表") & formatdatetime(Now(), "hhmmss") & ".xls")
xlBook.Save()
xlBook.Close()

'用 Quit 方法关闭 Microsoft Excel
xlApp.Quit()

'释放对象
Dim pro As Process
For Each pro In Process.GetProcesses
If pro.ProcessName = "EXCEL" Then
pro.Kill()
End If
Next
lighting_pig 2011-05-06
  • 打赏
  • 举报
回复
比如你的代码
For i = 0 To 5
For j = 0 To 7
xlSheet.Cells._Default(i + 1, j + 1).Value = i & "," & j
Next j
Next i

如果你不想输出最后一行,循环变量-1不就好了??

//*****************************************
最后和你说一个问题,你这样写代码,数据稍微多一点,比如上万个格子, 很可能一个导出或导入要半个小时....客户会骂人的,不信你搞个50列,1万行的试试?

excel不管是导入还是导出,如果想要速度快,最好是首先定义一个excel.range,比如1000*12000,然后你定义一个1000*12000的二维数组,然后直接把二维数组赋值给那个excel.range,这样速度会很快,就算是上万条数据也可以在1秒内搞完
下面是一段c#的例子,vb类似,你可以参考一下

Array arrDetail = Array.CreateInstance(typeof(String), dtData.Rows.Count, 16);
Excel.Range rangeDetail = excel.GetRange(2, 1, dtData.Rows.Count + 1, 16);

for (int i = 0; i < dtData.Rows.Count; i++)
{
arrDetail.SetValue(dtData.Rows[i]["SENDBILLID"].ToString(), i, 0);
arrDetail.SetValue(dtData.Rows[i]["BillCode"].ToString(), i, 1);
arrDetail.SetValue(dtData.Rows[i]["CustomerCode"].ToString(), i, 2);
}

rangeDetail.Value2 = arrDetail;


lighting_pig 2011-05-06
  • 打赏
  • 举报
回复
不明白你说的意思,输出一部分?

用循环以及excel.range来控制不行吗?
zhangfengyi 2011-05-05
  • 打赏
  • 举报
回复
没人知道吗,大家帮忙看下,谢谢
zhangfengyi 2011-05-05
  • 打赏
  • 举报
回复
看了一下,这个组件跟直接调用COM组件比,效率怎样,不想用COM组件就是觉得导出速度太慢了,稳定性如何
lighting_pig 2011-05-05
  • 打赏
  • 举报
回复
这个世界有个东西叫npoi,专门用来干这个,你可以考虑用npoi试试看能不能解决你的问题

从excel导入数据是很麻烦

8,737

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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