• Бесплатный ВЕБИНАР по OSINT с Екатериной Тьюринг: ➡️9 февраля в 19:00 (мск) пройдет урок

    Как безопасно искать информацию в открытых источниках

    🔥 Записаться 🔥

Вывод в Excel информации по категориям

  • Автор темы Автор темы Irina
  • Дата начала Дата начала

Irina

Green Team
31.05.2019
145
2
BIT
0
подскажите, пожалуйста, а можно ли кнопкой в виде вывести в excel данные только категории и 2х подкатегорий, и при этом одна из колонок идет сумма данных
 
подскажите, пожалуйста, а можно ли кнопкой в виде вывести в excel данные только категории и 2х подкатегорий, и при этом одна из колонок идет сумма данных
причем здесь ёхсель?
программно получить значения из нужного вида можно через NotesViewNavigator (постоить его от нужной категории), далее POI или лепить
интерактивно - просто выдели нужное и Edit->Copy As->Table , вставить в хухель
вот код оттудова (там могут регаться запросить)
Код:
Sub Initialize
 
'I placed all of the code in a single sub
(normally I split it all out... but for this demo
purpose, I just put all code in one sub)
 
Dim doc As NotesDocument
Dim uidoc As NotesUIDocument
Dim tmpdir As String
Dim uiview As NotesUIView
Dim view As NotesView
Dim dc As NotesDocumentCollection
Dim ret As Integer

Dim session As NotesSession
Dim db As NotesDatabase
Dim workspace As NotesUIWorkspace
Dim tmpdatafilename As String
Dim tmpdatafilenumber As Integer

Dim memodoc As NotesDocument
Dim rtitem As NotesRichTextItem
Dim object As NotesEmbeddedObject


Set session = New NotesSession
Set workspace = New NotesUIWorkspace
Set db = session.CurrentDatabase

tmpdir = session.GetEnvironmentString
("Directory", True)

tmpdatafilenumber% = Freefile()
tmpdatafilename = tmpdir & "HRReport.xls"

'Open a file for output
Open tmpdatafilename  For Output As
tmpdatafilenumber

Set uiview = workspace.CurrentView
Set view = uiview.View

'Print to the file some basic CSS for easy
 formatting later if the users want a change
to the default.
Print # tmpdatafilenumber%, |
<HTML>
  <HEAD>
    <TITLE>Table example</TITLE>
    <STYLE type="text/css">
TABLE  { background: #ffffff; border: solid black;
               empty-cells: hide }
 TD     { border: solid black;
border-left: none;
border-right: none;
 }
TD.top     { border: solid black;
border-left: none;
border-right: none;
background: #C0C0C0;
font-weight: bold;
font-size: 11px;
text-align: center;
 }
TD.viewname     { border: solid black;
border-left: none;
border-right: none;
border-bottom: none;
background: #C0C0C0;
font-weight: bold;
font-size: 16px;
text-align: left;
 }
 TD.salary     { border: solid black;
border-left: none;
border-right: none;
background: #00FFFF;
 }
    </STYLE>
  </HEAD>
  <BODY>|
 
'Heart of the code....
'Print an HTML Table and then construct
the table from the column contents
of the current view.

Print # tmpdatafilenumber%, |<table>|

'Include the view name in the top of the
spreadsheet

Print # tmpdatafilenumber%, |<tr>|
Print # tmpdatafilenumber%,
|<td class="viewname"
colspan="| & Cstr((Ubound(view.Columns) + 1))
 & |">|
Print # tmpdatafilenumber%, view.Name
Print # tmpdatafilenumber%, |</td>|

Print # tmpdatafilenumber%, |</tr>|

'Start a row of headers (couldn't get TH CSS to work,
so I created my own class called top)
Print # tmpdatafilenumber%, |<tr>|
 
Forall vc In view.Columns
Print # tmpdatafilenumber%, |<td class="top">|
Print # tmpdatafilenumber%, vc.title
Print # tmpdatafilenumber%, |</td>|
End Forall

Print # tmpdatafilenumber%, |</tr>|

'Now loop though all of the documents in the
 view and create a HTML for each one.
'For each column, put in the cell tag.

Set doc = view.GetFirstDocument

Do While Not doc Is Nothing
 
Print # tmpdatafilenumber%, |<tr>|
 
Forall c In doc.ColumnValues
Print # tmpdatafilenumber%, |<td>|
 
If Isarray(c) Then  'Make sure you work with a
multivalued field.
For a = 0 To Ubound(c)
If a = 0 Then
Print # tmpdatafilenumber%, c(a)
Else
Print # tmpdatafilenumber%, "<br>" & c(a)
End If
Next
    
Print # tmpdatafilenumber%, |</td>|
Else
Print # tmpdatafilenumber%, c
End If
Print # tmpdatafilenumber%, |</td>|
 
End Forall
 
Print # tmpdatafilenumber%, |</tr>|
 
Set doc = view.GetNextDocument(doc)
Loop

'Now that you have all of your data, end the
table and html tags
Print # tmpdatafilenumber%, |</table>|
Print # tmpdatafilenumber%, |</body>|
Print # tmpdatafilenumber%, |</html>|
Close tmpdatafilenumber%

'Now you can either prompt them for where the
report is on their hard drive, or you can
email it to them
'If like email....

Set memodoc = db.CreateDocument
memodoc.Form = "Memo"
memodoc.Subject = "Exported View Report"
Set rtitem = New NotesRichTextItem
(memodoc, "Body")
Call rtitem.AppendText(memodoc.Subject(0))
Call rtitem.AppendText(Chr$(10) & Chr$(10))
Call rtitem.AppendText("Open the attached file
in Excel to view the report.")
Call rtitem.AppendText(Chr$(10) & Chr$(10))

Set object = rtitem.EmbedObject _
( EMBED_ATTACHMENT, "", tmpdatafilename)

memodoc.SendTo = session.UserName
Call memodoc.Send(False)
Kill tmpdatafilename  ' Delete the file from the
users hard drive if you email the report.

Messagebox "Please check your inbox for the
 report", 0 + 64, "Report Complete"
End Sub
 
Последнее редактирование:
  • Нравится
Реакции: NetWood
У нас всё ещё проще - все отчёты экспортируются в *.csv-файлы через разделитель ";" между значениями. И глобальными политиками у всех установлено открытие csv в Excel.
После экспорта файлы автоматом открываются в Excel.
 
причем здесь ёхсель?
программно получить значения из нужного вида можно через NotesViewNavigator (постоить его от нужной категории), далее POI или лепить
интерактивно - просто выдели нужное и Edit->Copy As->Table , вставить в хухель
вот код оттудова (там могут регаться запросить)
Код:
Sub Initialize

'I placed all of the code in a single sub
(normally I split it all out... but for this demo
purpose, I just put all code in one sub)

Dim doc As NotesDocument
Dim uidoc As NotesUIDocument
Dim tmpdir As String
Dim uiview As NotesUIView
Dim view As NotesView
Dim dc As NotesDocumentCollection
Dim ret As Integer

Dim session As NotesSession
Dim db As NotesDatabase
Dim workspace As NotesUIWorkspace
Dim tmpdatafilename As String
Dim tmpdatafilenumber As Integer

Dim memodoc As NotesDocument
Dim rtitem As NotesRichTextItem
Dim object As NotesEmbeddedObject


Set session = New NotesSession
Set workspace = New NotesUIWorkspace
Set db = session.CurrentDatabase

tmpdir = session.GetEnvironmentString
("Directory", True)

tmpdatafilenumber% = Freefile()
tmpdatafilename = tmpdir & "HRReport.xls"

'Open a file for output
Open tmpdatafilename  For Output As
tmpdatafilenumber

Set uiview = workspace.CurrentView
Set view = uiview.View

'Print to the file some basic CSS for easy
formatting later if the users want a change
to the default.
Print # tmpdatafilenumber%, |
<HTML>
  <HEAD>
    <TITLE>Table example</TITLE>
    <STYLE type="text/css">
TABLE  { background: #ffffff; border: solid black;
               empty-cells: hide }
TD     { border: solid black;
border-left: none;
border-right: none;
}
TD.top     { border: solid black;
border-left: none;
border-right: none;
background: #C0C0C0;
font-weight: bold;
font-size: 11px;
text-align: center;
}
TD.viewname     { border: solid black;
border-left: none;
border-right: none;
border-bottom: none;
background: #C0C0C0;
font-weight: bold;
font-size: 16px;
text-align: left;
}
TD.salary     { border: solid black;
border-left: none;
border-right: none;
background: #00FFFF;
}
    </STYLE>
  </HEAD>
  <BODY>|

'Heart of the code....
'Print an HTML Table and then construct
the table from the column contents
of the current view.

Print # tmpdatafilenumber%, |<table>|

'Include the view name in the top of the
spreadsheet

Print # tmpdatafilenumber%, |<tr>|
Print # tmpdatafilenumber%,
|<td class="viewname"
colspan="| & Cstr((Ubound(view.Columns) + 1))
& |">|
Print # tmpdatafilenumber%, view.Name
Print # tmpdatafilenumber%, |</td>|

Print # tmpdatafilenumber%, |</tr>|

'Start a row of headers (couldn't get TH CSS to work,
so I created my own class called top)
Print # tmpdatafilenumber%, |<tr>|

Forall vc In view.Columns
Print # tmpdatafilenumber%, |<td class="top">|
Print # tmpdatafilenumber%, vc.title
Print # tmpdatafilenumber%, |</td>|
End Forall

Print # tmpdatafilenumber%, |</tr>|

'Now loop though all of the documents in the
view and create a HTML for each one.
'For each column, put in the cell tag.

Set doc = view.GetFirstDocument

Do While Not doc Is Nothing

Print # tmpdatafilenumber%, |<tr>|

Forall c In doc.ColumnValues
Print # tmpdatafilenumber%, |<td>|

If Isarray(c) Then  'Make sure you work with a
multivalued field.
For a = 0 To Ubound(c)
If a = 0 Then
Print # tmpdatafilenumber%, c(a)
Else
Print # tmpdatafilenumber%, "<br>" & c(a)
End If
Next
  
Print # tmpdatafilenumber%, |</td>|
Else
Print # tmpdatafilenumber%, c
End If
Print # tmpdatafilenumber%, |</td>|

End Forall

Print # tmpdatafilenumber%, |</tr>|

Set doc = view.GetNextDocument(doc)
Loop

'Now that you have all of your data, end the
table and html tags
Print # tmpdatafilenumber%, |</table>|
Print # tmpdatafilenumber%, |</body>|
Print # tmpdatafilenumber%, |</html>|
Close tmpdatafilenumber%

'Now you can either prompt them for where the
report is on their hard drive, or you can
email it to them
'If like email....

Set memodoc = db.CreateDocument
memodoc.Form = "Memo"
memodoc.Subject = "Exported View Report"
Set rtitem = New NotesRichTextItem
(memodoc, "Body")
Call rtitem.AppendText(memodoc.Subject(0))
Call rtitem.AppendText(Chr$(10) & Chr$(10))
Call rtitem.AppendText("Open the attached file
in Excel to view the report.")
Call rtitem.AppendText(Chr$(10) & Chr$(10))

Set object = rtitem.EmbedObject _
( EMBED_ATTACHMENT, "", tmpdatafilename)

memodoc.SendTo = session.UserName
Call memodoc.Send(False)
Kill tmpdatafilename  ' Delete the file from the
users hard drive if you email the report.

Messagebox "Please check your inbox for the
report", 0 + 64, "Report Complete"
End Sub
попробовала, но получается, что просто все данные выгружаются, а как именно выгрузить суммирующее значение, которое по каждой категории идет, не пойму

пробую еще в одном варианте
Код:
    Set view = db.GetView( "view" )
    Set nav = view.CreateViewNav
    
    RowPointer= 1
    
    Set entry = nav.GetFirst
    
While Not ( entry Is Nothing )
        If entry.IsCategory Then

            xlSheet.Range( "A" & Cstr( RowPointer) ).value = entry.ColumnValues(0)
            xlSheet.Range( "B" & Cstr( RowPointer) ).value = entry.ColumnValues(1)
            ...
                    Set entry = nav.GetNext( entry )
        RowPointer = RowPointer + 1
    Wend
переносит все, делает по категориям, но есть пустые строки, так как там параметр идет в виде
123.jpg
 
попробовала, но получается, что просто все данные выгружаются, а как именно выгрузить суммирующее значение, которое по каждой категории идет, не пойм
этот код на для воспроизведения, а для принципа формирования файла! (без всякой КОМ)
КОМ - это очень медленно и глючно
а по навигатору
переносит все, делает по категориям, но есть пустые строки, так как там параметр идет в виде
ничего не понял
 
этот код на для воспроизведения, а для принципа формирования файла! (без всякой КОМ)
КОМ - это очень медленно и глючно
а по навигатору ничего не понял
например Тест у него есть документы 2019 - далее они группируются по месяцу, и там в сентябре 4 документа, в августе два. есть столбец с суммой , и вот в сентябре суммарно 1000, в августе 500, за 2019 всего суммарно 1500. вот он так и выводит, но только в каждом месяце добавляет пустые строки (4 сентябрь пустых, 2 в августе)
 
например Тест у него есть документы 2019 - далее они группируются по месяцу, и там в сентябре 4 документа, в августе два. есть столбец с суммой , и вот в сентябре суммарно 1000, в августе 500, за 2019 всего суммарно 1500. вот он так и выводит, но только в каждом месяце добавляет пустые строки (4 сентябрь пустых, 2 в августе)
если нужны данные только из строк-категорий, то и ходить навигатором надо только по категориям:
nav.GetNext(entry) => nav.GetNextCategory(enrty)

 
У нас всё ещё проще - все отчёты экспортируются в *.csv-файлы через разделитель ";" между значениями. И глобальными политиками у всех установлено открытие csv в Excel.
После экспорта файлы автоматом открываются в Excel.
По секрету скажу, что Excel замечательно открывает HTML файлы и даже XML, на худой конец, и даже лучше чем CSV. HTML таблицы легко "готовить", можно использовать какое-никакое оформление (цвет, заголовки и пр.), объединение ячеек.

P.S. но в CSV можно выгрузить штатно, без написания кода. И казалось бы "чего тут сложного?", но у нас таких пользователей единицы, всем специальную кнопку подавай...
 
Последнее редактирование:
если нужны данные только из строк-категорий, то и ходить навигатором надо только по категориям:
nav.GetNext(entry) => nav.GetNextCategory(enrty)
точно, спасибо!

По секрету скажу, что Excel замечательно открывает HTML файлы и даже XML, на худой конец, и даже лучше чем CSV. HTML таблицы легко "готовить", можно использовать какое-никакое оформление (цвет, заголовки и пр.), объединение ячеек.

P.S. но в CSV можно выгрузить штатно, без написания кода. И казалось бы "чего тут сложного?", но у нас таких пользователей единицы, всем специальную кнопку подавай...
ну вот нужна кнопка и причем простая выгрузка, без объединений строк и такого подобного
 
По секрету скажу, что Excel замечательно открывает HTML файлы и даже XML, на худой конец, и даже лучше чем CSV. HTML таблицы легко "готовить", можно использовать какое-никакое оформление (цвет, заголовки и пр.), объединение ячеек.
Я в курсе :) У нас раньше (когда свой продукт писали) так и было. А здесь в csv, т.к. не нужны эти цвета и прочее.

P.S. но в CSV можно выгрузить штатно, без написания кода.
Если вид сложной структуры, то нужно программирование, например чтобы при экспорте игнорировать колонки типа иконок и т.д. или вообще использовать конфигуратор для задания списка колонок для экспорта.
 
всётки, не ясно - зачем эхель?!?
штоб в нём аналитику проводить?? нотус прекрасно с этим справляется (если для неё данные ток из нотуса)...
штоб отчёт был "красивым"? так, тоже, нотус+html жёстко, или этот HTML отправить в PDF
если, тока если, послать кому то, на другой площадке, в другую аппликуху... в 1Цэ какойнить... а ТАМ, например, по-другому не умеют)
вопщем, яб подумал о целесообразности этого хода на досуге
 
У нас всё ещё проще - все отчёты экспортируются в *.csv-файлы через разделитель ";" между значениями. И глобальными политиками у всех установлено открытие csv в Excel.
После экспорта файлы автоматом открываются в Excel.
Если пересылать по почте или открывать по ссылке с web этот .csv в кодировке win-1251, то он кракозябит на эплах и разных линуксах и поэтому делаю два файла, дополнительно в utf-8.
Код:
Sub CreateFileCSV (view As Notesview, SessionID As String, FileName As String, dt As String , filecodepage As String, textorder As String)
 
    Dim fileNum As Integer
    Dim entry As NotesViewEntry
    Dim vc As NotesViewEntryCollection
    Dim doc As NotesDocument
    Dim rowstring As String
    Dim cns As String
 
    fileNum% = Freefile()
    If filecodepage="UTF-8" Then
        Open filename For Output As fileNum% Charset="UTF-8"  ''вариант UTF-8. для Apple, но открывается на WIN с кракозябами
    Else
        ''Запуск без параметра Charset="Windows-1251" генерит файл по умолчанию в кодировке платформы на котрой Domino. Соответственно на винде 1251.
        Open filename For Output As fileNum%  Charset="Windows-1251"
 
    Print #fileNum%, textorder+" "+dt
    Print #fileNum%, "№;Артикул;Наименование;Количество;Упаковка;"+textorder
 
     ' now get and print the values for each row and column
    Set vc = view.GetAllEntriesByKey(SessionID, True)    ' коллекшон сортированный по view        
    Set entry = vc.GetFirstEntry()
    n = 1
    While Not entry Is Nothing
        Set doc = entry.Document
        rowstring = Cstr(n)+";"+Cstr(doc.CatalogNumber(0))+";"+Cstr(doc.Title(0))+";"+Cstr(doc.Attribute(0))+";"+Cstr(doc.Packing(0))+";"+Cstr(doc.Qty(0))
        Print #fileNum%, rowstring
        n = n + 1
        Set entry = vc.GetNextEntry(entry)
    Wend
    Close fileNum%
 
 
End Sub
 
Последнее редактирование:
  • Нравится
Реакции: VladSh
Если пересылать по почте или открывать по ссылке с web этот .csv в кодировке win-1251, то он кракозябит на эплах и разных линуксах и поэтому делаю два файла, дополнительно в utf-8.
Код:
Sub CreateFileCSV (view As Notesview, SessionID As String, FileName As String, dt As String , filecodepage As String, textorder As String)

    Dim fileNum As Integer
    Dim entry As NotesViewEntry
    Dim vc As NotesViewEntryCollection
    Dim doc As NotesDocument
    Dim rowstring As String
    Dim cns As String

    fileNum% = Freefile()
    If filecodepage="UTF-8" Then
        Open filename For Output As fileNum% Charset="UTF-8"  ''вариант UTF-8. для Apple, но открывается на WIN с кракозябами
    Else
        ''Запуск без параметра Charset="Windows-1251" генерит файл по умолчанию в кодировке платформы на котрой Domino. Соответственно на винде 1251.
        Open filename For Output As fileNum%  Charset="Windows-1251"

    Print #fileNum%, textorder+" "+dt
    Print #fileNum%, "№;Артикул;Наименование;Количество;Упаковка;"+textorder

     ' now get and print the values for each row and column
    Set vc = view.GetAllEntriesByKey(SessionID, True)    ' коллекшон сортированный по view       
    Set entry = vc.GetFirstEntry()
    n = 1
    While Not entry Is Nothing
        Set doc = entry.Document
        rowstring = Cstr(n)+";"+Cstr(doc.CatalogNumber(0))+";"+Cstr(doc.Title(0))+";"+Cstr(doc.Attribute(0))+";"+Cstr(doc.Packing(0))+";"+Cstr(doc.Qty(0))
        Print #fileNum%, rowstring
        n = n + 1
        Set entry = vc.GetNextEntry(entry)
    Wend
    Close fileNum%


End Sub
спасибо. уже разобралась, но и ваш код сейчас тоже попробую
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!