Vb.net 对.xlsx文件的读/写操作

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

已将.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 \ 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
从何而来?也许这是错误的。