Экспорт в Excel, Lotus Notes Домино - PullRequest
1 голос
/ 25 октября 2010

У меня есть представление, отображающее 9 строк информации для каждого документа. В этом представлении у меня есть функция экспорта в Excel с использованием приведенного ниже кода для экспорта документа в Excel. Данные не экспортируются должным образом для первых двух документов, например, если у меня есть 7 строк для первого документа, то они должны экспортировать 7 строк, но экспортируются только 2 строки. Это происходит только для первых 2 документов, начиная с 3-го документа, независимо от того, в какой строке нет информации, которую он экспортирует, чтобы достичь совершенства. Я попытался изменить код для строки% с row% = row% + 2 на row% = row% + 3, 4 или 5, но создание ненужных строк в таблице Excel не является динамическим и выглядит также странно. Любая идея, что мне делать, чтобы строки динамически увеличивались.

Sub Initialize
 'On Error Goto errhandler
 On Error Resume Next
 Dim session As New NotesSession
 Dim db As NotesDatabase
 Dim doccoll As NotesDocumentCollection
 Dim view As NotesView 
 Dim doc As NotesDocument
 Dim otherdoc As NotesDocument

 Set db = session.CurrentDatabase 
 Set view = db.GetView("CRMOpenIssue") 
 Set doccoll=db.UnprocessedDocuments

 Set oExcel = CreateObject ( "Excel.Application" )
 Set oWorkbook = oExcel.Workbooks.Add
 Set oWorkSheet= oWorkbook.Sheets ( 1 )


 oWorkSheet.Cells(1,1).value="Quote# "
 oWorkSheet.Cells(1,2).value="Quote Line#" 
 oWorkSheet.Cells(1,3).value="Customer - fab"
 oWorkSheet.Cells(1,4).value="OppNum"
 oWorkSheet.Cells(1,5).value="OppLine#" 
 oWorkSheet.Cells(1,6).value="Open Issue#"
 oWorkSheet.Cells(1,7).value="Open Issue"
 oWorkSheet.Cells(1,8).value="Category"
 oWorkSheet.Cells(1,9).value="Due date"
 oWorkSheet.Cells(1,10).value="Owner to resolve issue"
 oWorkSheet.Cells(1,11).value="Owner/PME Verify when closed"
 oExcel.Worksheets(1).Range("A1:K1").Font.Bold = True

 oExcel.columns("A:A").ColumnWidth=15.00
 oExcel.columns("B:B").ColumnWidth=8.00
 oExcel.columns("C:C").ColumnWidth=15.00
 oExcel.columns("D:D").ColumnWidth=10.00
 oExcel.columns("E:E").ColumnWidth=8.00
 oExcel.columns("F:F").ColumnWidth=8.00 
 oExcel.columns("G:G").ColumnWidth=30.00
 oExcel.columns("H:H").ColumnWidth=30.00
 oExcel.columns("I:I").ColumnWidth=15.00
 oExcel.columns("J:J").ColumnWidth=15.00
 oExcel.columns("K:K").ColumnWidth=30.00

 row% = 1
 offset% = 0
 lastOffset% = 0 

 If doccoll.count >1 Then 'if more than one doc selected then confirm 
  resp = Messagebox("Do you want to export only the " & _
  "selected " & doccoll.count & " documents?", 36, "Selected only?" )
 Else
  Messagebox "Exporting all rows. (To export only selected " & _
  "rows tick those required in the left margin first.)"
 End If  '6= yes 

 oExcel.visible=True

 If resp=6 Then 'selected documents
  Set doc = doccoll.GetFirstDocument   
  While Not doc Is Nothing
   If resp=6 Then  
    row% = row%+2
    col% = 0 'Reset the Columns
    Set otherdoc = view.getnextdocument(doc)
    If otherdoc Is Nothing Then
     Set otherdoc = view.getprevdocument(doc)
     If otherdoc Is Nothing Then
      Print " >1 doc should be selected"
      End
     Else
      Set otherdoc = view.getnextdocument(otherdoc)
     End If
    Else 'got next doc
     Set otherdoc = view.getprevdocument(otherdoc)
    End If        
   End If
   Forall colval In otherdoc.ColumnValues
    col% = col% + 1
    If Isarray(colval) Then
     columnVal=Fulltrim(colval)
     For y = 0 To Ubound(columnVal)
      offset% = row% + y +lastOffset%   
      oWorkSheet.Cells(offset%,col%).value = columnVal(y) 
     Next
    Else
     oWorkSheet.Cells(row%, col%).value = colval  
    End If  

   End Forall
   Set doc = doccoll.GetNextDocument(doc)       
  Wend
 Else 'all documents
  Set otherdoc =view.GetFirstDocument  
  While Not otherdoc Is Nothing
   row% = row% + 2
   col% = 0 'Reset the Columns
  'Loop through all the column entries
  'Forall colval In entry.ColumnValues
   Forall colval In otherdoc.ColumnValues
    col% = col% + 1
    If Isarray(colval) Then
     columnVal=Fulltrim(colval)
     For y = 0 To Ubound(columnVal)
      offset% = row% + y +lastOffset%   
      oWorkSheet.Cells(offset%,col%).value = columnVal(y) 
     Next
    Else
     oWorkSheet.Cells(row%, col%).value = colval  
    End If         
   End Forall
   row%=offset%
   Set otherdoc=view.GetNextDocument(otherdoc)
  Wend
 End If
'errhandler:
 Call oExcel.quit()    
 Set oWorkSheet= Nothing
 Set oWorkbook = Nothing
 Set oExcel = Nothing
 Print "Done"
End Sub 

Ответы [ 3 ]

1 голос
/ 27 июля 2011

Что-то очень не так с кодом, который вы загрузили. Вы, должно быть, удалили или добавили цикл If, потому что первый цикл If закрывается, прежде чем закрыть цикл While, который он содержит. При этом, это должно работать, хотя я не проверял это.

Option Public
Option Declare

Sub Initialize
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim doccoll As NotesDocumentCollection
    Dim view As NotesView 
    Dim doc As NotesDocument
    Dim resp As Integer, row As Integer, offset As Integer, nextrow As Integer, col As Integer
    Dim oExcel As Variant
    Dim oWorkbook As Variant
    Dim oWorkSheet As Variant

    On Error GoTo olecleanup

    Set db = session.CurrentDatabase 
    Set view = db.GetView("CRMOpenIssue") 
    Set doccoll=db.UnprocessedDocuments

    Set oExcel = CreateObject ( "Excel.Application" )
    Set oWorkbook = oExcel.Workbooks.Add
    Set oWorkSheet = oWorkbook.Sheets ( 1 )

    oWorkSheet.Cells(1,1).value="Quote# "
    oWorkSheet.Cells(1,2).value="Quote Line#" 
    oWorkSheet.Cells(1,3).value="Customer - fab"
    oWorkSheet.Cells(1,4).value="OppNum"
    oWorkSheet.Cells(1,5).value="OppLine#" 
    oWorkSheet.Cells(1,6).value="Open Issue#"
    oWorkSheet.Cells(1,7).value="Open Issue"
    oWorkSheet.Cells(1,8).value="Category"
    oWorkSheet.Cells(1,9).value="Due date"
    oWorkSheet.Cells(1,10).value="Owner to resolve issue"
    oWorkSheet.Cells(1,11).value="Owner/PME Verify when closed"
    oExcel.Worksheets(1).Range("A1:K1").Font.Bold = True

    oExcel.columns("A:A").ColumnWidth=15.00
    oExcel.columns("B:B").ColumnWidth=8.00
    oExcel.columns("C:C").ColumnWidth=15.00
    oExcel.columns("D:D").ColumnWidth=10.00
    oExcel.columns("E:E").ColumnWidth=8.00
    oExcel.columns("F:F").ColumnWidth=8.00 
    oExcel.columns("G:G").ColumnWidth=30.00
    oExcel.columns("H:H").ColumnWidth=30.00
    oExcel.columns("I:I").ColumnWidth=15.00
    oExcel.columns("J:J").ColumnWidth=15.00
    oExcel.columns("K:K").ColumnWidth=30.00

    offset% = 0
    nextrow% = 3

    If doccoll.count >1 Then 'if more than one doc selected then confirm 
        resp = MessageBox("Do you want to export only the " & _
        "selected " & doccoll.count & " documents?", 36, "Selected only?" )
    Else
        MessageBox "Exporting all rows. (To export only selected " & _
        "rows tick those required in the left margin first.)"
    End If  '6= yes 

    oExcel.visible=True

    If resp=6 Then 'selected documents
        Set doc = doccoll.GetFirstDocument
        If doccoll.count = 1 Then
            Print " >1 doc should be selected"
        End If
    Else
        Set doc =view.GetFirstDocument
    End if

    While Not doc Is Nothing
        row% = nextrow%
        col% = 0 'Reset the Columns
        nextrow% = row% + 1

        ForAll colval In doc.ColumnValues
            col% = col% + 1
            If IsArray(colval) Then
                offset% = row%
                ForAll cv In colval
                    If CStr(cv) <> "" Then
                        oWorkSheet.Cells(offset%,col%).value = cv
                        offset% = offset% + 1
                    End If
                End ForAll
                If nextrow% < offset% Then nextrow% = offset% 
            Else
                oWorkSheet.Cells(row%, col%).value = colval  
            End If
        End ForAll

        If resp=6 Then 'selected documents
            Set doc = doccoll.Getnextdocument(doc)
        Else
            Set doc =view.Getnextdocument(doc)
        End If
    Wend

    oExcel.activeworkbook.close
    oExcel.quit
    Set oExcel = Nothing

Finish :
    Print "Done"
    Exit Sub

olecleanup :
'   Call LogError() 'Enable to use OpenLog
    If Not(IsEmpty(oExcel)) Then
        oExcel.activeworkbook.close
        oExcel.quit
        Set oExcel = Nothing
    End If
    Resume Finish
End Sub
1 голос
/ 25 октября 2010

Я вижу, вы используете автоматизацию Excel. Временами автоматизация Excel громоздка.

Я бы попробовал файлы NPOI для Excel XLS. Посмотрите на это. Действительно просто работать с:

Создание файла Excel (.XLS и .XLSX) из C #

0 голосов
/ 05 марта 2011

Э-э, этот код определенно должен быть более читабельным, я уверен, что есть более простой способ сделать то, что вы хотите.
Хорошо, вы можете объяснить, для чего вы используете представление "CRMOpenIssue"?Я предлагаю вам забыть о количестве строк, представляемых каждым документом в вашем представлении, и использовать поля документа в качестве источника данных вместо данных, отображаемых непосредственно в столбцах представления.

...