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

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

28.05.2020, 20:08. Показов 4080. Ответов 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
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 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
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 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
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 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
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 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
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 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
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 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 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru