Vb.net 对.xlsx文件的读/写操作
已将.xlsx文件从UI保存到数据库中。现在我使用下面的代码从数据库中读取数据,并将其写入临时位置文件Vb.net 对.xlsx文件的读/写操作,vb.net,vba,excel,Vb.net,Vba,Excel,已将.xlsx文件从UI保存到数据库中。现在我使用下面的代码从数据库中读取数据,并将其写入临时位置文件 Dim Buffer() As Byte Dim Amount As Integer = 2000 Dim TripCount As Integer = 0 Dim reminder As Integer = 0 ReDim Buffer(FileSize) TripCount = FileSize \ Amoun
Dim Buffer() As Byte
Dim Amount As Integer = 2000
Dim TripCount As Integer = 0
Dim reminder As Integer = 0
ReDim Buffer(FileSize)
TripCount = FileSize \ Amount
reminder = FileSize Mod Amount
If reminder > 0 Then
TripCount = TripCount + 1
End If
For cnt As Integer = 0 To TripCount - 1
Dim Offset As Integer = 1
Offset = Offset + cnt * Amount
Dim ReadCount As Integer = Amount
If cnt = TripCount - 1 Then
ReadCount = CInt(FileSize) - (cnt * Amount)
End If
Dim b() As Byte = GetFileData(CLng(documentId), ReadCount, Offset) 'GetFileData methdo as last code segment
Array.Copy(b, 0, Buffer, Offset - 1, b.Length)
Next
Dim downloadFile As New FileInfo(selectedPath + "\" + FileName)
Using bw As New BinaryWriter(downloadFile.OpenWrite)
bw.Write(Buffer)
bw.Close()
End Using
Public Function GetFileData(ByVal documentId As Long, ByVal amount As Integer, ByVal offset As Integer) As Byte()
Dim RetVal() As Byte = Nothing
Dim b1 As Byte() = Nothing
Try
Dim sql As String = ""
ReDim RetVal(amount)
sql = " SELECT DBMS_LOB.SUBSTR(F.DF_FILE," + amount.ToString + "," + offset.ToString + " ) DATA"
sql += " FROM table_name F"
sql += " WHERE F.docid = " + documentId.ToString
Dim data As DataTable = FetchData(sql)
b1 = CType(data.Rows(0)("DATA"), Byte())
Array.Copy(b1, 0, RetVal, 0, b1.Length)
Catch ex As Exception
End Try
Return RetVal
End Function
在将文件放入临时位置后,我试图打开它,但它抛出以下错误
Excel在“filename.xlsx”中发现无法读取的内容是否要恢复此工作簿的内容?如果您信任此工作簿的来源,请单击“是”
但是相同的代码集适用于.xls格式的文件。问题在于数组大小 如果文件大小为2000字节。然后
Redim Buffer(FileSize)
在此之后,缓冲区数组大小的Redim将为2000+1=2001
然后从数据库中取出,放入缓冲区数组,并将其写入文件,如下所示
Dim downloadFile As New FileInfo(selectedPath + "\" + FileName)
Using bw As New BinaryWriter(downloadFile.OpenWrite)
bw.Write(Buffer)
bw.Close()
End Using
文件大小增加了1个字节。在这种情况下,文件大小为2001字节。所以它显示了错误
现在我把上面的换成了下面的,它工作得很好
Using bw As New BinaryWriter(downloadFile.OpenWrite)
Dim newBuffer(((Buffer.Length) - 2)) As Byte
Array.Copy(Buffer, 0, newBuffer, 0, ((Buffer.Length) - 2))
bw.Write(newBuffer)
bw.Close()
End Using
在上面的代码中,我声明了另一个新数组newBuffer,并将数据从旧数组缓冲区复制到新数组newBuffer,从0索引复制到(旧数组的长度-2),以适应文件的大小。是否有任何异常?您似乎只是在
GetFileData
中捕获异常并将其丢弃。不要这样做-只需取出Try
/Catch
作为开始,让异常传播。如果出现了问题,您需要了解它。TripCount
来自哪里?@Ben-现在我已经更新了代码Ben。将异常处理程序从GetFileData
中取出。它可能掩盖了这个问题。FileSize
从何而来?也许这是错误的。