236 / 28 / 18
Регистрация: 08.05.2011
Сообщений: 185
1

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

27.09.2017, 15:02. Показов 1956. Ответов 2

Author24 — интернет-сервис помощи студентам
Есть шаблон 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 пустых строк таблицы, что не красиво. Может подскажите как после заполнения данными удалять пустые строки? Или может будет другой вариант избавления от пустых строк?
Вложения
Тип файла: zip Новая папка.zip (34.9 Кб, 3 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.09.2017, 15:02
Ответы с готовыми решениями:

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

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

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

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

2
236 / 28 / 18
Регистрация: 08.05.2011
Сообщений: 185
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
Заблокирован
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
19.10.2017, 04:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.10.2017, 04:33
Помогаю со студенческими работами здесь

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

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

Создание документа Word по шаблону из Excel
Пытаюсь создать документ Word из шаблона. Необходимо в шаблон добавить текст. Добавляю но шаблон...

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

Замена фразы, соответствующей шаблону, в Word
Word файл содержит текст с разными шрифтами, а так же таблицы/картинки. Требуется в нём найти текст...

Проверка соответствия текста шаблону в Word
Как программно проверить начинается ли абзац с заданной в шаблоне комбинации: число - знак или...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru