Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: COM, OLE, ActiveX
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
hodas4
234 / 27 / 17
Регистрация: 08.05.2011
Сообщений: 178
1

Из StringGrid в Word по шаблону

27.09.2017, 15:02. Просмотров 719. Ответов 2

Есть шаблон Word с закладками.
Вывожу в него данные из StringGrida при помощи кода:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void __fastcall TForm5::Button2Click(TObject *Sender)
{
bool DontOverwrite = true;
 Variant v2,v1, vApp, vDocs, vDoc, vSelection;
String vAsCurDir=GetCurrentDir();
String  path1 = vAsCurDir+"\\shablon\\BI_new.doc" ;    // файл шаблона
String  path2 = vAsCurDir+"\\directum\\BI.doc" ;   // куда будем сохранять результат
CopyFile(path1.c_str(),path2.c_str(),DontOverwrite);
String  imns = "imns";
String InsertText = "text", InsertText2 = "text2";
 
  vVarApp = CreateOleObject("Word.Application");
  vVarApp.OlePropertySet("Visible", true);
  vVarDocs = vVarApp.OlePropertyGet("Documents");
  vVarDocs.OleProcedure("Open", StringToOleStr(path2));
  vVarDoc = vVarDocs.OleFunction("Item", 1);
  vVarDoc.OleProcedure("Activate");
  v1 = vVarDoc.OlePropertyGet("Bookmarks");
 
    // заполняем данными в закладки
    for (int j=1;j<=(Form3->StringGrid1->RowCount);j++)
{         imns = "imns";
      imns=imns+j;
      InsertText=Form3->StringGrid1->Cells[0][j];
    v2 = v1.OleFunction("Item", StringToOleStr(imns));
  v2.OlePropertyGet("Range").OlePropertySet("Text", StringToOleStr(InsertText));
}
 
  // сохраняем и закрываем документ
     vVarDocs.OleProcedure("Save");
    vVarApp.OleProcedure("Quit");
}


Так вот проблема в том, что строк в шаблоне около 30. Данных выводится к примеру 5. Получается остается 25 пустых строк таблицы, что не красиво. Может подскажите как после заполнения данными удалять пустые строки? Или может будет другой вариант избавления от пустых строк?
0
Вложения
Тип файла: zip Новая папка.zip (34.9 Кб, 3 просмотров)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.09.2017, 15:02
Ответы с готовыми решениями:

Из StringGrid в Excel по шаблону
Здравствуйте! Подскажите пожалуйста, как реализовать такое: Есть файл шаблона Excel (1.xls). В...

Вывод в StringGrid из Word, а из StringGrid в круговую диаграмму
Изначально необходимо с первой формы из нескольких компонентов(эдиты, комбобоксы и дататайм)...

Отчет в Word по готовому шаблону
Здравствуйте! Помогите, пожалуйста, новичку разобраться. Необходимо полученные из БД данные вывести...

Создать документ Word по шаблону?
Если просто создавать документ, то все создается без проблем. MSWORD.Documents.Add; Но если...

Замена слов по шаблону Word (C#)
Всем добрый вечер! Помогите плз. Есть Ворд файл: Спарвка1.doc. В нем расставлены метки, например...

2
hodas4
234 / 27 / 17
Регистрация: 08.05.2011
Сообщений: 178
28.09.2017, 09:37  [ТС] 2
Проблему решил написав макрос VBA и запуская его из под с++
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Sub MacOfSet()
Application.ScreenUpdating = False
Dim Tbl As Table, cel As Cell, i As Long, n As Long, fEmpty As Boolean
With ActiveDocument
For Each Tbl In .Tables
n = Tbl.Columns.Count
For i = n To 1 Step -1
fEmpty = True
For Each cel In Tbl.Columns(i).Cells
If Len(cel.Range.Text) > 2 Then
fEmpty = False
Exit For
End If
Next cel
If fEmpty = True Then Tbl.Columns(i).Delete
Next i
Next Tbl
End With
With ActiveDocument
For Each Tbl In .Tables
n = Tbl.Rows.Count
For i = n To 1 Step -1
fEmpty = True
For Each cel In Tbl.Rows(i).Cells
If Len(cel.Range.Text) > 2 Then
fEmpty = False
Exit For
End If
Next cel
If fEmpty = True Then Tbl.Rows(i).Delete
Next i
Next Tbl
End With
Set cel = Nothing: Set Tbl = Nothing
Application.ScreenUpdating = True
End Sub


Запускаю из под с++ после заполнения данными вот так:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
void __fastcall TForm5::Button2Click(TObject *Sender)
{
bool DontOverwrite = true;
 Variant v2,v1, vApp, vDocs, vDoc, vSelection;
String vAsCurDir=GetCurrentDir();
String  path1 = vAsCurDir+"\\shablon\\BI_new.doc" ;    // файл шаблона
String  path2 = vAsCurDir+"\\directum\\BI.doc" ;   // куда будем сохранять результат
CopyFile(path1.c_str(),path2.c_str(),DontOverwrite);
String  imns = "imns";
String InsertText = "text";
 
String  fio = "fio";
String InsertText2 = "text";
 
String  stryk = "stryk";
String InsertText3 = "text";
 
String  ip = "ip";
String InsertText4 = "text";
 
String  tel = "tel";
String InsertText5 = "text";
 
  vVarApp = CreateOleObject("Word.Application");
  vVarApp.OlePropertySet("Visible", false);
  vVarDocs = vVarApp.OlePropertyGet("Documents");
  vVarDocs.OleProcedure("Open", StringToOleStr(path2));
  vVarDoc = vVarDocs.OleFunction("Item", 1);
  vVarDoc.OleProcedure("Activate");
  v1 = vVarDoc.OlePropertyGet("Bookmarks");
 
    // заполняем данными в закладки
    for (int j=1;j<=(Form3->StringGrid1->RowCount);j++)
{         imns = "imns";
 imns=imns+j;
 
fio = "fio";
fio = fio+j;
 
stryk = "stryk";
stryk = stryk+j;
 
ip = "ip";
ip = ip+j;
 
tel = "tel";
tel = tel+j;
 
      InsertText=Form3->StringGrid1->Cells[0][j];
    v2 = v1.OleFunction("Item", StringToOleStr(imns));
  v2.OlePropertyGet("Range").OlePropertySet("Text", StringToOleStr(InsertText));
 
      InsertText2=Form3->StringGrid1->Cells[1][j];
    v2 = v1.OleFunction("Item", StringToOleStr(fio));
  v2.OlePropertyGet("Range").OlePropertySet("Text", StringToOleStr(InsertText2));
 
      InsertText3=Form3->StringGrid1->Cells[2][j];
    v2 = v1.OleFunction("Item", StringToOleStr(stryk));
  v2.OlePropertyGet("Range").OlePropertySet("Text", StringToOleStr(InsertText3));
 
      InsertText4=Form3->StringGrid1->Cells[4][j];
    v2 = v1.OleFunction("Item", StringToOleStr(ip));
  v2.OlePropertyGet("Range").OlePropertySet("Text", StringToOleStr(InsertText4));
 
      InsertText5=Form3->StringGrid1->Cells[5][j];
    v2 = v1.OleFunction("Item", StringToOleStr(tel));
  v2.OlePropertyGet("Range").OlePropertySet("Text", StringToOleStr(InsertText5));
}
        
 
 
 
 //запуск макроса
WideString macr("MacOfSet");
        vVarApp.OleProcedure("Run",macr);
 
 
 
 
 
  // сохраняем и закрываем документ
     vVarDocs.OleProcedure("Save");
    vVarApp.OleProcedure("Quit");
    ShowMessage("Данные экспортированы в WORD");
}
2
Gagoose
Заблокирован
19.10.2017, 04:33 3
hodas4,

C++
1
2
C=Sheetxls.OlePropertyGet("Rows",3);
C.OleProcedure("Insert");
код вставляет строку в таблицу после


C++
1
2
C=Sheetxls.OlePropertyGet("Rows",3);
C.OleProcedure("Delete");
вероятно удалит)
0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2017, 04:33

Создание документа Word по шаблону
Добрый день! Подскажите, как сделать такой макрос. Нужно составить отчет в Word на основе данных...

Создание документа word по шаблону vb basic
Для работы разрабатываю програмку для быстрой печати заявок в ворде на перевозку груза. Кодировать...

Заполнение информации Word документа по шаблону
Здравствуйте, знатоки Access. Помогите разрешить проблему. Цель: сделать так, чтобы при нажатии на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru