2014-11-04 4 views
0

Файл с расширением .xlsx уже сохранен в базе данных из пользовательского интерфейса. теперь я читаю данные из базы данных, используя приведенный ниже код и записывая файл временного файла.Операции чтения/записи файла .xlsx

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.

+0

Вы получаете какое-либо исключение? Кажется, вы просто ловите исключения в 'GetFileData' и отбрасываете их. Не делайте этого - просто вытащите 'Try' /' Catch' для начала и разрешите распространение исключения. Если что-то пошло не так, вам нужно знать об этом. – Ben

+0

Откуда берется «TripCount»? – Ben

+0

@Ben - теперь я обновил код Ben. – picnic4u

ответ

0

Вопрос был о размере массива.

если размер файла составляет 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), чтобы accomdate размера файла.

Смежные вопросы