2010-10-25 5 views
1

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

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 

ответ

1

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

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

Create Excel (.XLS and .XLSX) file from C#

0

Мм, этот код, безусловно, должен быть более удобным для чтения, я уверен, что есть более простой способ сделать то, что вы хотите.
Хорошо, вы можете объяснить, что вы используете для просмотра «CRMOpenIssue»?

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

+1

Я приветствую то, что вы пытаетесь сделать, но это было бы лучше, как комментарий, а не ответ. –

1

Что-то не так с кодом, который вы загрузили. Вы должны удалить или добавить цикл 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 
Смежные вопросы