来自HRESULT的异常:0x800A03EC excel.range
我从excel.range中的HRESULT:0x800A03EC中获取此错误来自HRESULT的异常:0x800A03EC excel.range,excel,vb.net,excel-interop,Excel,Vb.net,Excel Interop,我从excel.range中的HRESULT:0x800A03EC中获取此错误异常 下面是我的代码 Private Sub excelInsertData(rowIndex As Integer, ColIndex As Integer, EDT As DataTable) Try Dim arr As Object(,) = New Object(EDT.Rows.Count - 1, EDT.Columns.Count - 1) {} Fo
异常
下面是我的代码
Private Sub excelInsertData(rowIndex As Integer, ColIndex As Integer, EDT As DataTable)
Try
Dim arr As Object(,) = New Object(EDT.Rows.Count - 1, EDT.Columns.Count - 1) {}
For r As Integer = 0 To EDT.Rows.Count - 1
Dim dr As DataRow = EDT.Rows(r)
For c As Integer = 0 To EDT.Columns.Count - 1
arr(r, c) = dr(c)
Next
Next
Dim c1 As Excel.Range = CType(xlWorkSheet.Cells(rowIndex, ColIndex), Excel.Range)
Dim c2 As Excel.Range = CType(xlWorkSheet.Cells(rowIndex + EDT.Rows.Count - 1, EDT.Columns.Count + ColIndex - 1), Excel.Range)
Dim range As Excel.Range = xlWorkSheet.Range(c1, c2)
range.Value = arr '---------ERROR THROWN HERE
Catch ex As Exception
MsgBox(ex.toString)
Finally
EDT.Rows.Clear() : EDT.Columns.Clear()
End Try
End Sub
我试图做的是将数据从Datatable(本例中为EDT)传输到Excel模板
以下是值范围、arr和EDT
范围。值-长度为5
长度与射程相同
我的数据表中的值(EDT)
此外,如果需要,我可以附加我的3b.xlsm文件的模板。
请询问我是否缺少任何需要提供的信息。第一行只是从函数中获取数据表。您也可以只向子对象添加一个参数并传入一个参数。此代码创建一个新的Excel文件。第一个循环添加列名,第二个循环添加数据
Private Sub FillExcelFromDataTable()
Dim dt = GetWorksheetData()
Dim oExcel As New Excel.Application
Dim oBook = oExcel.Workbooks.Add
Dim oSheet = DirectCast(oBook.Worksheets.Add, Excel.Worksheet)
Dim ColumnIndex = 1 'in Excel worksheet
For Each col As DataColumn In dt.Columns 'This loop adds the header row
oSheet.Cells(1, ColumnIndex) = col.ColumnName
ColumnIndex += 1
Next
ColumnIndex = 1 'The columns and rows in the spreadsheet
Dim RowIndex = 2 'The columns and rows in the spreadsheet
For rowI = 0 To dt.Rows.Count - 1
For Each col As DataColumn In dt.Columns
oSheet.Cells(RowIndex, ColumnIndex) = dt(rowI)(col)
ColumnIndex += 1
Next
ColumnIndex = 1 'Reset back to the first column
RowIndex += 1
Next
oBook.Save()
oBook.SaveAs(Filename:="ExcelDat.xlsx") 'Saved to "C:\Users\xxx\Documents\ExcelDat.xlsx"
oBook.Close()
oExcel.Quit()
End Sub
第一行只是从函数中获取数据表。您也可以只向子对象添加一个参数并传入一个参数。此代码创建一个新的Excel文件。第一个循环添加列名,第二个循环添加数据
Private Sub FillExcelFromDataTable()
Dim dt = GetWorksheetData()
Dim oExcel As New Excel.Application
Dim oBook = oExcel.Workbooks.Add
Dim oSheet = DirectCast(oBook.Worksheets.Add, Excel.Worksheet)
Dim ColumnIndex = 1 'in Excel worksheet
For Each col As DataColumn In dt.Columns 'This loop adds the header row
oSheet.Cells(1, ColumnIndex) = col.ColumnName
ColumnIndex += 1
Next
ColumnIndex = 1 'The columns and rows in the spreadsheet
Dim RowIndex = 2 'The columns and rows in the spreadsheet
For rowI = 0 To dt.Rows.Count - 1
For Each col As DataColumn In dt.Columns
oSheet.Cells(RowIndex, ColumnIndex) = dt(rowI)(col)
ColumnIndex += 1
Next
ColumnIndex = 1 'Reset back to the first column
RowIndex += 1
Next
oBook.Save()
oBook.SaveAs(Filename:="ExcelDat.xlsx") 'Saved to "C:\Users\xxx\Documents\ExcelDat.xlsx"
oBook.Close()
oExcel.Quit()
End Sub
请检查此项:新对象(EDT.Rows.Count-1,EDT.Columns.Count-1)
和对于r As Integer=0到EDT.Rows.Count-1,检查什么?这只是数组大小声明@Dang D.KhanhI认为它可能是:Dim arr(EDT.Rows.Count-1,EDT.Columns.Count-1)作为对象
。如果我真的这么说,我是从堆栈中复制的,以搜索“如何使用范围将数据插入excel”,所以我可以按照您的建议尝试,但我认为这不是问题@该死的卡恩,一定还有别的事。在我使用您发布的代码进行的测试中,没有出现您描述的错误,代码在几秒钟内成功地运行了一个包含10列和100行的数据表。你说原始文件是一个带有宏的模板,在我的测试中,这没有什么区别。您是否已使用可能不同的文件测试了此代码,以至少消除该文件的问题?请检查以下内容:新对象(EDT.Rows.Count-1,EDT.Columns.Count-1)
和对于r as Integer=0到EDT.Rows.Count-1,以及如何检查该文件?这只是数组大小声明@Dang D.KhanhI认为它可能是:Dim arr(EDT.Rows.Count-1,EDT.Columns.Count-1)作为对象
。如果我真的这么说,我是从堆栈中复制的,以搜索“如何使用范围将数据插入excel”,所以我可以按照您的建议尝试,但我认为这不是问题@该死的卡恩,一定还有别的事。在我使用您发布的代码进行的测试中,没有出现您描述的错误,代码在几秒钟内成功地运行了一个包含10列和100行的数据表。你说原始文件是一个带有宏的模板,在我的测试中,这没有什么区别。您是否使用可能不同的文件测试了此代码,以至少消除该文件的问题?这是我最初尝试的。您所做的是一次为特定单元格添加值。我这么做了,但是微软的互操作服务非常慢。我有一个SSD,大约用了5分钟来填充20x10(rowsx列)的数据。所以我研究了互联网,了解到增加数据使用范围,而不是像这样使用。讽刺的是,我的代码在我声明的其他方法中运行良好,没有错误。主要的问题是我不明白错误在说什么。若我并没有捕捉到它,那个么它就通过了,文件被完美地生成了,但这并没有什么好处。我还有一个宏文件.xlsm.com。互操作不是最好的。看看ePlus。你可以免费试用。我认为它有一个有用的方法<代码>ws.Cells[“A1”].LoadFromDataTable(dataTable,true)代码>我尝试了EPPlus、OpenXML、ClosedXML(长期使用ClosedXML,但最近的更新开始导致损坏我的模板文件。我也在ClosedXML git上打开了一个问题)除了我的模板文件之外,其他一切都让我头疼。我必须转换到interop,因为它不会损坏文件。我找到的最好的方法是射程转移。它转移得更快。所有数据传输大约需要3-4分钟。但是这ws.Cells[“A1”].LoadFromDataTable(dataTable,true)
会调整dataTable的列和行吗?比如,如果我想从B11单元开始,一行一直到F11,它会写在下一行吗?询问是因为我害怕触碰当前代码。@bonny看到了,等等,这就是我最初尝试的。您所做的是一次为特定单元格添加值。我这么做了,但是微软的互操作服务非常慢。我有一个SSD,大约用了5分钟来填充20x10(rowsx列)的数据。所以我研究了互联网,了解到增加数据使用范围,而不是像这样使用。讽刺的是,我的代码在我声明的其他方法中运行良好,没有错误。主要的问题是我不明白错误在说什么。若我并没有捕捉到它,那个么它就通过了,文件被完美地生成了,但这并没有什么好处。我还有一个宏文件.xlsm.com。互操作不是最好的。看看ePlus。你可以免费试用。我认为它有一个有用的方法<代码>ws.Cells[“A1”].LoadFromDataTable(dataTable,true)代码>我尝试了EPPlus、OpenXML、ClosedXML(长期使用ClosedXML,但最近的更新开始导致损坏我的模板文件。我也在ClosedXML git上打开了一个问题)除了我的模板文件之外,其他一切都让我头疼。我必须转换到interop,因为它不会损坏文件。我找到的最好的方法是射程转移。它转移得更快。所有数据传输大约需要3-4分钟。但是这ws.Cells[“A1”].LoadFromDataTable(dataTable,true)
会调整dataTable的列和行吗?比如,如果我想从B11单元开始,一行一直到F11,它会写在下一行吗?询问是因为我害怕触碰当前代码。@bonny See等等