2014-11-04 2 views
0

UI에서 데이터베이스에 이미 .xlsx 파일이 저장되어 있습니다. 이제 아래 코드를 사용하여 데이터베이스에서 데이터를 읽고 temp 위치 파일을 작성합니다..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) 

이 될 것입니다 2000 + 1 =

2001 다음 데이터베이스에서 받고 버퍼 배열에 넣고 아래 파일로 작성 후.

파일 크기가 1 바이트 증가합니다. 이 경우 파일 크기는 2001 바이트입니다. 그래서 그것은 오류를 보여주고 있었다.

이제 위 내용을 다음으로 대체했으며 완벽하게 작동합니다. 파일의 크기를 accomdate 투 -

  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 

위 코드에서 I (2 오래 어레이의 길이)에 대한 0 인덱스에서 새로운 배열 newBuffer 구 배열 버퍼에서 또 다른 새로운 배열 newBuffer 복사 데이터를 선언.

관련 문제