Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/19: Рейтинг темы: голосов - 19, средняя оценка - 4.53
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131

Ускорить перенос данных из StringGrid-а в таблицу документа Word

28.05.2020, 20:08. Показов 3911. Ответов 38

Студворк — интернет-сервис помощи студентам
помогите пожалуйста, в вопросе потоков новенький , не совсем понимаю принцип работы и действия, есть код добавления из стринггрида в ворд (таблицу), но очень долго особенно если записей в стринггриде более 1000 строк
как реализовать побыстрее выполнение кода, читал про потоки это возможно , помогите пожалуйста, может кто сталкивался?
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
if(!fStart)
 {
  try
  {
   vVarApp=CreateOleObject("Word.Application");
   fStart=true;
   if (MessageDlg("У ВАС АКТИВИРОВАН WORD?", mtConfirmation, TMsgDlgButtons() << mbYes << mbNo,0) == mrYes)
 
            {
 
vVarApp.OlePropertySet("Visible",false);
vVarDocs=vVarApp.OlePropertyGet("Documents").
OleFunction("Open",  WideString(ExtractFileDir(ParamStr(0))+"\\1.doc")) ;
vVarTable=vVarDocs.OlePropertyGet("Tables").OleFunction("Item",1);
for (int i=1; i<StringGrid1->RowCount-1; i++){
for (int j=0; j<StringGrid1->ColCount-1; j++)
                {
   vVarCell=vVarTable.OleFunction("Cell",i+2,j+1);
   vVarCell.OleFunction("Select");
   vVarCell.OlePropertyGet("Range").
         OlePropertySet("Text", WideString(StringGrid1->Cells[j][i]));
         if (j%4==0) {
v=vVarTable.OlePropertyGet("Rows").OleFunction("Item",i+2).OleFunction("Select");
  vVarApp.OlePropertyGet("Selection").OleProcedure("InsertRowsBelow",1);
  ProgressBar1->Position +=1;
}}}
ProgressBar1->Position =0;
vVarApp.OlePropertySet("Visible",true);
                        }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.05.2020, 20:08
Ответы с готовыми решениями:

Добавление срок в таблицу Word при заполнении документа Word из данных Excel
Всем привет! Я новичок в этом деле и нужна помощь. Есть таблица Excel с данными на основании которого заполняется документ Word по...

Импорт данных из документа Word в таблицу Excel
Здравствуйте! Есть документ Word с большим количеством однотипных страниц с данными, необходимо эти данные перенести в таблицу Excel. ...

Импорт таблиц из документа Word в StringGrid
Доброго времени суток. Если у кого есть исходник программы которая импортирует таблицу из Word документа в StringGrid программы на...

38
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33402 / 21512 / 8236
Регистрация: 22.10.2011
Сообщений: 36,912
Записей в блоге: 12
04.11.2020, 15:09
Студворк — интернет-сервис помощи студентам
\tab - это код для символа табуляции в RTF, так что где-то в строке есть символ табуляции, возможно, нужно пройти по строке перед тем, как ее переносить в Word, и поубирать оттуда всю табуляцию.
0
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131
04.11.2020, 15:35  [ТС]
volvo,
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
{
lst21=new TStringList();
RichEdit1->Font->Size=12;
StringGrid3->RowCount=StringGrid2->RowCount+1;
for (int i = 1; i < StringGrid2->RowCount+1; i++) {
     StringGrid3->Rows[i]=StringGrid2->Rows[i];
 
     lst21->Clear();
     RichEdit1->Clear();
     RichEdit1->Text=StringGrid3->Cells[1][i];
     StringGrid3->Objects[1][i] = new TObjClass(GetRTF(RichEdit1), lst21);
 
 
       RichEdit1->Clear();
       RichEdit1->Text=StringGrid3->Cells[2][i];
if (StringGrid3->Cells[6][i].Pos("=")){
       lst21->Clear();
       lst21->Text=StringGrid3->Cells[6][i];
       lst21->Text=StringReplace(lst21->Text, "!","\r\n",TReplaceFlags()<< rfReplaceAll << rfIgnoreCase);
         do
      {
        lst21->Text = StringReplace(lst21->Text, "\r\n\r\n", "\r\n", TReplaceFlags() << rfReplaceAll);
      } while (lst21->Text.Pos("\r\n\r\n") > 0);
         for(int f = 0; f < lst21->Count; f++)
        {
 
        RichEdit1->SelStart=StrToInt(lst21->Names[f])-1;
        RichEdit1->SelLength=StrToInt(lst21->ValueFromIndex[f]);
        RichEdit1->SelAttributes->Style=RichEdit1->SelAttributes->Style<<fsStrikeOut;
 
            }
        StringGrid3->Objects[2][i] = new TObjClass(GetRTF(RichEdit1), lst21);
}
else
{
StringGrid3->Objects[2][i] = new TObjClass(GetRTF(RichEdit1), lst21);
}
 
 
 
 
     lst21->Clear();
     RichEdit1->Clear();
     RichEdit1->Text=" "+StringGrid3->Cells[3][i];
     StringGrid3->Objects[3][i] = new TObjClass(GetRTF(RichEdit1), lst21);
 
     lst21->Clear();
     RichEdit1->Clear();
     RichEdit1->Text=" "+StringGrid3->Cells[4][i];
     StringGrid3->Objects[4][i] = new TObjClass(GetRTF(RichEdit1), lst21);
}
   StringGrid3->Invalidate();
   StringGrid3->RowCount-=1;
}
переношу из oдного стринггрид в другой и регистрирую текст в rtf при выводе на печать
Добавлено через 59 секунд
volvo,
Спасибо, понял пройдусь, скажу результат

Добавлено через 11 минут
volvo, я правильно понял, что проверять там где добавляем в ворд , а не при регистрациии
где то здесь?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for(int i = 1; i < StringGrid3->RowCount; i++)
    {
        for(int j = 1; j<=4; j++)
        {
            TObjClass *obj = static_cast<TObjClass*>(StringGrid3->Objects[j][i]);
            String as = obj->s;
            as = as.Delete(1, as.Pos("\r\n"));
            as = as.Delete(as.LastDelimiter("}") - 12, as.Length());
            st = st + as + tab;
        }
        st = st + newline;
    }
    st = String("{\\rtf1\\ansi\\ansicpg1251\\deff0\\deflang1049{\\fonttbl{\\f0\\fnil\\fcharset204 Times New Roman;}{\\f1\\fnil\\fcharset0 Times New Roman;}}") +
        st + "}";
    CopyRTFToClipboard(st);
    vVarApp.OlePropertyGet("Selection").OlePropertyGet("Range").OleProcedure("Paste");
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33402 / 21512 / 8236
Регистрация: 22.10.2011
Сообщений: 36,912
Записей в блоге: 12
04.11.2020, 17:05
А в каком месте при печати появляется эта строка? Может, не надо добавлять tab в конце строки, перед newline? Я не помню уже формат таблиц Word-а, а проверить сейчас негде.
0
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131
04.11.2020, 17:30  [ТС]
volvo,
красным это слэши между ними будет фамилия они получается смещаются
и в конце строк синим
0
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131
04.11.2020, 17:33  [ТС]
volvo,
получается в конце строк где во втором столбце
красным веделены слэши между ними БУДЕТ потом фамилия
и синим вообщем только во втором столбце
и то что по два пары слэша это правильно будет две фамилии
Миниатюры
Ускорить перенос данных из StringGrid-а в таблицу документа Word  
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33402 / 21512 / 8236
Регистрация: 22.10.2011
Сообщений: 36,912
Записей в блоге: 12
04.11.2020, 17:43
Что-то я в VirtualBox-е запустил свой код, вывел на печать через CutePDF (чтобы в pdf-файл сохранилось), не вижу никаких лишних символов. Можешь тоже самое сделать, и показать содержимое файла, которое печатается (хотя бы зацензуренное, но чтобы было видно расположение слов) и скрин результирующего PDF-файла, на котором видно лишние символы? Чтобы можно было хотя бы воспроизвести это поведение...
0
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131
04.11.2020, 17:43  [ТС]
volvo,
и где SD-1 и SD-2 не Т должно быть а №
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33402 / 21512 / 8236
Регистрация: 22.10.2011
Сообщений: 36,912
Записей в блоге: 12
04.11.2020, 17:44
А, вижу... Да, значит, надо убирать \tab перед переносом строки при подготовке данных к переносу.
0
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131
04.11.2020, 17:47  [ТС]
volvo,
Вложения
Тип файла: pdf 1.pdf (151.7 Кб, 2 просмотров)
0
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131
04.11.2020, 17:48  [ТС]
volvo,
Цитата Сообщение от serg6789 Посмотреть сообщение
st = st + as + tab;
здесь?
0
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131
04.11.2020, 17:59  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
А, вижу... Да, значит, надо убирать \tab перед переносом строки при подготовке данных к переносу.
вот результат убрал tab
Цитата Сообщение от serg6789 Посмотреть сообщение
st = st + as + tab;
Вложения
Тип файла: pdf 2.pdf (151.5 Кб, 4 просмотров)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33402 / 21512 / 8236
Регистрация: 22.10.2011
Сообщений: 36,912
Записей в блоге: 12
04.11.2020, 18:08
Не-не-не... Ты убрал везде. А надо только там, где заканчивается строка.
0
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131
04.11.2020, 18:26  [ТС]
volvo, подскажите пожалуйста в чем и как быть если \\ tab выскакивает в строках в которых есть исправления
точнее получается следующее: если во втором столбце есть исправления то \\tab// в конце стоки второго столбца хотя // должно быть в третьем столбце
0
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131
04.11.2020, 19:48  [ТС]
volvo,
зеленом отметил, что правильно формируется, а красным, что нет... заметил вот что где не правильно там в конце
\\tab с двумя слэшами, а где верно с одним как мне убрать этот tab и сформировать таблицу в ворде на печать
Миниатюры
Ускорить перенос данных из StringGrid-а в таблицу документа Word  
0
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131
04.11.2020, 21:06  [ТС]
volvo, а где она заканчивается?
0
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131
04.11.2020, 21:17  [ТС]
volvo,
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
lst21=new TStringList();
RichEdit1->Font->Size=12;
StringGrid3->RowCount=StringGrid2->RowCount+1;
for (int i = 1; i < StringGrid2->RowCount+1; i++) {
     StringGrid3->Rows[i]=StringGrid2->Rows[i];
 
     lst21->Clear();
     RichEdit1->Clear();
     RichEdit1->Text=StringGrid3->Cells[1][i]+"\n";
     StringGrid3->Objects[1][i] = new TObjClass(GetRTF(RichEdit1), lst21);
 
 
 
 
     if (StringGrid3->Cells[6][i].Pos('=')) {
        lst21->Clear();
        lst21->Add(StringGrid3->Cells[6][i]);
        lst21->Text=StringReplace(lst21->Text, "!","\r\n",TReplaceFlags()<< rfReplaceAll << rfIgnoreCase);
         do
      {
        lst21->Text = StringReplace(lst21->Text, "\r\n\r\n", "\r\n", TReplaceFlags() << rfReplaceAll);
      } while (lst21->Text.Pos("\r\n\r\n") > 0);
     lst21->Text=StringReplace(lst21->Text, "\n","",TReplaceFlags()<< rfReplaceAll << rfIgnoreCase);
 
     RichEdit1->Clear();
     RichEdit1->Text=StringGrid3->Cells[2][i];
     RichEdit1->Text= StringReplace(RichEdit1->Text, "\r\n", "", TReplaceFlags() << rfReplaceAll);
     RichEdit1->Text= StringReplace(RichEdit1->Text, "\n\r\n", "", TReplaceFlags() << rfReplaceAll);
 
     for(int f = 0; f < lst21->Count; f++)
        {
        RichEdit1->SelStart=StrToInt(lst21->Names[f])-1;
        RichEdit1->SelLength=StrToInt(lst21->ValueFromIndex[f]);
        RichEdit1->SelAttributes->Style=RichEdit1->SelAttributes->Style<<fsStrikeOut;
        }
 
 
    StringGrid3->Objects[2][i] = new TObjClass(GetRTF(RichEdit1), lst21);
 
}
else
{
     lst21->Clear();
     RichEdit1->Clear();
     RichEdit1->Text=StringGrid3->Cells[2][i]+"\n";
     StringGrid3->Objects[2][i] = new TObjClass(GetRTF(RichEdit1), lst21);
}
 
 
 
 
     lst21->Clear();
     RichEdit1->Clear();
     RichEdit1->Text=StringGrid3->Cells[3][i]+"\n";
     StringGrid3->Objects[3][i] = new TObjClass(GetRTF(RichEdit1), lst21);
 
 
     lst21->Clear();
     RichEdit1->Clear();
     RichEdit1->Text=StringGrid3->Cells[4][i]+"\n";
     StringGrid3->Objects[4][i] = new TObjClass(GetRTF(RichEdit1), lst21);
 
 
 
}
 
 
   StringGrid3->Invalidate();
   StringGrid3->RowCount-=1;
Этим кодом добился следующего результата
но \tab и ФИО-// остались в исправленной именно только в исправленной , строке , как быть уже голову сломал
Вложения
Тип файла: pdf 3.pdf (151.7 Кб, 3 просмотров)
0
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131
04.11.2020, 22:36  [ТС]
volvo, Владимир, пожалуйста, помогите, прошу Вас, не знаю как быть, уже все перепробовал, не выходит...((((

Добавлено через 48 минут
volvo,
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
String st = "";
    String as = "";
    String tab = "\\tab";
    String tab1="tab";
    String newline = "\\par\r\n";
 
    for(int i = 1; i < StringGrid3->RowCount; i++)
    {
        for(int j = 1; j<=4; j++)
        {
            if (StringGrid3->Cells[j][i].Pos("*")) {
                TObjClass *obj = static_cast<TObjClass*>(StringGrid3->Objects[j][i]);
                String as = obj->s;
                as = as.Delete(1, as.Pos("\r\n"));
                as = as.Delete(as.LastDelimiter("}") - 12, as.Length());
                st = st + as+tab1;
                //ShowMessage("1\r\n"+st);
            }
 
            if (!StringGrid3->Cells[j][i].Pos("*")) {
                TObjClass *obj = static_cast<TObjClass*>(StringGrid3->Objects[j][i]);
                String as = obj->s;
                as = as.Delete(1, as.Pos("\r\n"));
                as = as.Delete(as.LastDelimiter("}") - 12, as.Length());
                st = st + as+ tab;
                //ShowMessage("2\r\n"+st);
            }
                }
 
        st = st + newline;
            }
        st = String("{\\rtf1\\ansi\\ansicpg1251\\deff0\\deflang1049{\\fonttbl{\\f0\\fnil\\fcharset204 Times New Roman;}{\\f1\\fnil\\fcharset0 Times New Roman;}}") +
        st + "}";
 
 
 
 
    CopyRTFToClipboard(st);
    vVarApp.OlePropertyGet("Selection").OlePropertyGet("Range").OleProcedure("Paste");
помойму проблема решилась , выделил код, проанализировал что и как анализаторы закоментировал вывело четко все

Добавлено через 7 минут
volvo, работает не корректно
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33402 / 21512 / 8236
Регистрация: 22.10.2011
Сообщений: 36,912
Записей в блоге: 12
05.11.2020, 09:52
Опять же, проверять негде, но первое, что я бы попробовал сделать, глядя на приведенные скрины - это просто попробовал бы все \\ в строке заменить на один бэкслеш перед отсылкой в клипбоард. Как-то вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    for(int i = 1; i < StringGrid1->RowCount; i++)
    {
        for(int j = 0; j < StringGrid1->ColCount; j++)
        {
            TObjClass *obj = static_cast<TObjClass*>(StringGrid1->Objects[j][i]);
            String as = obj->s;
            as = as.Delete(1, as.Pos("\r\n"));
            as = as.Delete(as.LastDelimiter("}") - 12, as.Length());
            st = st + as + tab;
        }
        st = st + newline;
    }
    
    st = String("{\\rtf1\\ansi\\ansicpg1251\\deff0\\deflang1049{\\fonttbl{\\f0\\fnil\\fcharset204 Tahoma;}{\\f1\\fnil\\fcharset0 Tahoma;}}") +
        StringReplace(st, "\\\\", "\\", TReplaceFlags() << rfReplaceAll) + "}";
0
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131
05.11.2020, 23:10  [ТС]
volvo,
про слэши Вы были правы. Спасибо большое!!!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.11.2020, 23:10
Помогаю со студенческими работами здесь

Перенос таблицы из StringGrid в exel и word
Нашёл вот это &quot;Для того, чтобы запустить приложение Word или Excel из программы на &quot;Borland C++ Builder&quot; достаточно...

Перенос данных из одного StringGrid в другой StringGrid
Здравствуйте . Есть очередной вопрос с матрицами. Есть два StringGrid. В одном столбце первой матрицы есть цифровые значения. Есть Edit....

Перенос полей DbGrid в таблицу StringGrid
Доброго времени суток! Подскажите, пожалуйста, как в Delphi перенести определенные столбцы из таблицы DBGrid в таблицу StringGrid. ...

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

Перенос текста информации из StringGrid и Memo в Microsoft Word маркерами
Здравствуйте. При разработке курсового проекта у меня возникла проблема с транспортировкой информации из Delphi в Microsoft Word. У меня...


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru