Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/34: Рейтинг темы: голосов - 34, средняя оценка - 4.91
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663

Передача цвета строк и цвета текста из stringgrid в excel и обратно

15.05.2015, 18:28. Показов 7571. Ответов 70
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня. Интересует вопрос передачи цвета строк и цвета текста из stringgrid в excel и желательно обратно, а так же формирование шапки и ширина страницы excel Помогите плиз, ссылкой или примером. Нагуглил чтото похожее только для дельфи, но в итоге еще больше запутался.

Нашел такое - работает, но как сформировать шапку и передать в эксель цвета - в затруднении...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    WideString str;
    TStringList *sl = new TStringList;
    for(int i = 0 ; i<StringGrid1->RowCount ;++i)
        {
            for(int j = 0; j< StringGrid1->ColCount;++j)
            str +=StringGrid1->Cells[j][i]+ "\t";
            sl->Add(Trim(str));
            str = "\n\r" ;
        }
        if (SaveDialog1->Execute())
            sl->SaveToFile(SaveDialog1->FileName);
            delete sl;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.05.2015, 18:28
Ответы с готовыми решениями:

Изменение цвета текста, когда код цвета берется с сервера
Есть задание : Отправить на сервер название цвета, получить от сервера цвет в формате RGB и изменить цвет текста в поле на полученный от...

ContextMenu изменение цвета выбора и цвета текста
Добрый день подскажите как сделать так что бы после выбора пункта меню цвет текста менялся обратно class...

Изменение цвета при клике и обратно
подскажите простенький код. пробую $(&quot;.wpfp-link&quot;).on(&quot;click&quot;, function() { $(&quot;.fa-heart&quot;).css('color') === '#f71e1e' ? ...

70
Модератор
 Аватар для D1973
9966 / 6500 / 2464
Регистрация: 21.01.2014
Сообщений: 27,511
Записей в блоге: 3
22.05.2015, 05:53
Студворк — интернет-сервис помощи студентам
Все очень просто...
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
#include <ComObj.hpp>
 
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
  Variant app, books, book, sheet;
  String FileName = ExtractFilePath(Application->ExeName) + "111.xls";
  int MaxR, MaxC, BeginR, BeginC;
  BeginR = 3, BeginC = 1; 
  int k = 0;
  app = CreateOleObject("Excel.Application");
  books = app.OlePropertyGet("Workbooks");
  books.OleFunction("Open", WideString(FileName));
  book = books.OlePropertyGet("item",1);
  sheet = book.OlePropertyGet("WorkSheets",1);
  MaxR = sheet.OlePropertyGet("UsedRange").OlePropertyGet("Rows").OlePropertyGet("Count");
  MaxC = sheet.OlePropertyGet("UsedRange").OlePropertyGet("Columns").OlePropertyGet("Count");
  String s_grd = "";
  for(int i = BeginR; i <= MaxR; i++)
   {
     for(int j = BeginC; j <= MaxC; j++)
      {
        String s = sheet.OlePropertyGet("Cells").OlePropertyGet("Item",i,j).OlePropertyGet("Value");
        if(s.Trim().Length() == 0)
         s_grd += "";
        else s_grd += String().sprintf("\"%s\" ", s);
      }
     StringGrid1->Rows[k]->CommaText = s_grd;
     s_grd = "";
     k++;
     if(k > 2) StringGrid1->RowCount++;
   }
  app.OleProcedure("Quit");
}
//---------------------------------------------------------------------------
Миниатюры
Передача цвета строк и цвета текста из stringgrid в excel и обратно  
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
22.05.2015, 09:20  [ТС]
Спасибо, но ошибки
на месте
C++
1
"\"%s\" ", s
такие
C++
1
2
[BCC32 Error] Unit26_Monitoring.cpp(5177): E2034 Cannot convert 'const char *' to 'const wchar_t *'
[BCC32 Error] Unit26_Monitoring.cpp(5177): E2342 Type mismatch in parameter 'format' (wanted 'const wchar_t *', got 'const char *')
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33480 / 21578 / 8250
Регистрация: 22.10.2011
Сообщений: 37,041
Записей в блоге: 12
22.05.2015, 09:34
Добавь один символ:
C++
25
        else s_grd += String().sprintf(L"\"%s\" ", s);
- указанные ошибки пропадут
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
22.05.2015, 10:03  [ТС]
Да, пропали. А можно через опендиалог файл для загрузки выбирать?

Добавлено через 1 минуту
И подскажите пару слов про прагму и верх - чего после чего и почему- гуглил - боюсь не уловил..
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33480 / 21578 / 8250
Регистрация: 22.10.2011
Сообщений: 37,041
Записей в блоге: 12
22.05.2015, 10:17
Цитата Сообщение от Sergey_03 Посмотреть сообщение
А можно через опендиалог файл для загрузки выбирать?
Можно, как обычно:
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
    if (OpenDialog1->Execute())
    {
        Variant app, books, book, sheet;
        // String FileName = ExtractFilePath(Application->ExeName) + "111.xls";
        int MaxR, MaxC, BeginR, BeginC;
        BeginR = 3, BeginC = 1;
        int k = 0;
        app = CreateOleObject("Excel.Application");
        books = app.OlePropertyGet("Workbooks");
        books.OleFunction("Open", WideString(OpenDialog1->FileName));
        book = books.OlePropertyGet("item", 1);
        sheet = book.OlePropertyGet("WorkSheets", 1);
        MaxR = sheet.OlePropertyGet("UsedRange").OlePropertyGet("Rows").OlePropertyGet("Count");
        MaxC = sheet.OlePropertyGet("UsedRange").OlePropertyGet("Columns").OlePropertyGet("Count");
        String s_grd = "";
        for (int i = BeginR; i <= MaxR; i++)
        {
            for (int j = BeginC; j <= MaxC; j++)
            {
                String s = sheet.OlePropertyGet("Cells").OlePropertyGet("Item", i, j).OlePropertyGet("Value");
                if (s.Trim().Length() == 0) s_grd += "";
                else s_grd += String().sprintf(L"\"%s\" ", s);
            }
            StringGrid1->Rows[k]->CommaText = s_grd;
            s_grd = "";
            k++;
            if (k > 2) StringGrid1->RowCount++;
        }
        app.OleProcedure("Quit");
    }
Цитата Сообщение от Sergey_03 Посмотреть сообщение
пару слов про прагму
Все то, что подключено перед #pragma hdrstop, будет скомпилировано один раз. Все то, что после - будет компилироваться при каждой перекомпиляции модуля. То есть, подключать заголовки перед этой прагмой нужно только тогда, когда у тебя во всех модулях проекта подключаются одни и те же хидеры, и нет смысла их каждый раз перекомпилировать для каждой единицы компиляции. Скажем, очень удобно так подключать vcl.h - он однозначно требуется везде, tchar.h для работы с юникодом тоже подключается ко всем cpp-файлам проекта. А все остальные хидеры, которые используются в одном-двух cpp-файлах, нет необходимости подключать подобным образом, они подключаются после #pragma hrdstop
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
22.05.2015, 10:38  [ТС]
Огромное спасибо. Все работает.
я убрал
C++
1
2
if (s.Trim().Length() == 0) s_grd += "";
                else
потому что мне надо, чтобы и пустые ячейки тоже заходили. а реально в них убрать (null) ?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33480 / 21578 / 8250
Регистрация: 22.10.2011
Сообщений: 37,041
Записей в блоге: 12
22.05.2015, 11:11
Так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
        for (int i = BeginR; i <= MaxR; i++)
        {
            for (int j = BeginC; j <= MaxC; j++)
            {
                String s = sheet.OlePropertyGet("Cells").OlePropertyGet("Item", i, j).OlePropertyGet("Value");
                s_grd += String().sprintf(L"\"%s\" ", s);
            }
            StringGrid1->Rows[k]->CommaText = s_grd;
            StringGrid1->Rows[k]->CommaText = StringReplace(StringGrid1->Rows[k]->CommaText, "(null)", "", TReplaceFlags() << rfReplaceAll);
            s_grd = "";
            k++;
            if (k > 2) StringGrid1->RowCount++;
        }
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
22.05.2015, 12:45  [ТС]
Да, все работает. Спасибо. Какоеж я днище в этом всем
0
Модератор
 Аватар для D1973
9966 / 6500 / 2464
Регистрация: 21.01.2014
Сообщений: 27,511
Записей в блоге: 3
22.05.2015, 17:12
Цитата Сообщение от Sergey_03 Посмотреть сообщение
я убрал
C++
1
2
if (s.Trim().Length() == 0) s_grd += "";
* * * * * * * * else
Дык это и делалось, вообще-то, для того, чтобы (null) не было...
Хорошо, что volvo свой вариант предложил... Хотя не очень понятно, чем мой-то не угодил?
0
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
22.05.2015, 17:32  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
Хотя не очень понятно
Все правильно, просто мне нужно было не терять структуры таблицы. А так, если в ячейке ничего не было, следующая занимала её место.
1
Модератор
 Аватар для D1973
9966 / 6500 / 2464
Регистрация: 21.01.2014
Сообщений: 27,511
Записей в блоге: 3
22.05.2015, 17:58
Точно, косяк...

Добавлено через 7 минут
Вот так правильно будет...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for(int i = BeginR; i <= MaxR; i++)
   {
     for(int j = BeginC; j <= MaxC; j++)
      {
        String s = sheet.OlePropertyGet("Cells").OlePropertyGet("Item",i,j).OlePropertyGet("Value");
        if(s.Trim().Length() == 0)
         s_grd += ";";
        else s_grd += String().sprintf(L"\"%s\";", s);
      }
     StringGrid1->Rows[k]->Delimiter = ';';
     StringGrid1->Rows[k]->DelimitedText = s_grd;
     s_grd = "";
     k++;
     if(k > 2) StringGrid1->RowCount++;
   }
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
22.05.2015, 18:01  [ТС]
Спасибо!
0
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
25.05.2015, 09:19  [ТС]
Доброго утра. Не подскажите такой вопрос появился. Есть готовый файл эксель, в нем книга на 13 листов. Мне нужно через OpenDialog считать c листа 4
пятый и седьмой столбец в StringGrid 1 (button1)
и записать их через SaveDialog в лист 8
в первый и одинадцатый столбец (button2) соответственно. Но обязательно через StringGrid.
Я понимаю, что эти действия почти аналогичны выше написанным, но есть проблемы с правильным выбором ячеек, столбцов ..
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33480 / 21578 / 8250
Регистрация: 22.10.2011
Сообщений: 37,041
Записей в блоге: 12
25.05.2015, 09:45
C++
1
sheet = book.OlePropertyGet("WorkSheets", 1);
Единицу замени на номер листа, с которым нужно работать. В чем проблема-то заключается?
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
25.05.2015, 09:56  [ТС]
Спасибо. Хотел попробовать использовать индексы ячеек - может понадобиться менять только одно значение какой-то конкретной ячейки. Сейчас попробую листы менять.
0
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
27.05.2015, 13:03  [ТС]
Доброе утро. Не подскажите, как поставить SaveDialog на сохранение файла из грида в эксель? Желательно с расширением по умолчанию. Гуглю, пробую - не получается чегото..

Добавлено через 2 часа 5 минут
как бы нашел))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (SaveDialog1->Execute())//надо это
    {//..............................всякое мое
           //Открыли Ексель
             Variant app, Rang, vCell, sheet, cell;
             app = CreateOleObject("Excel.Application");
             app.OlePropertySet("Visible",0);
             app.OlePropertySet("SheetsInNewWorkbook", 1);
             app.OlePropertyGet("WorkBooks").OleFunction("Add", 1);
             Variant wbs = app.OlePropertyGet("Workbooks").OlePropertyGet("Item", 1);//надо это
             wbs.OleProcedure("SaveAs", StringToOleStr(SaveDialog1->FileName));//надо это
             sheet = app.OlePropertyGet("WorkSheets", 1);
           //............................всякое мое
             app.OleProcedure("Save");//надо это
             app.OleProcedure("Quit");//надо это
    }
спасибо.

Добавлено через 39 минут
Но почемуто при сохранении пишет
Файл 'RESUME.XLW' уже существует в другом месте. Заменить?
Что это и почему, не подскажете?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33480 / 21578 / 8250
Регистрация: 22.10.2011
Сообщений: 37,041
Записей в блоге: 12
27.05.2015, 14:28
Потому что внимательнее надо быть. Там, откуда ты скопировал этот код, был вызов метода Save для чего? Для wbs, то есть, Workbook. Тогда приведенной ошибки не возникает. А у тебя вызывается Save для Excel.Application, вот и результат...
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
27.05.2015, 15:12  [ТС]
Исправил
C++
1
wbs.OleProcedure("Save");
0
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
01.06.2015, 22:56  [ТС]
Добрый вечер, вопрос такой встал - возможно ли загрузить в документ экселя из грида данные в определенные столбцы определенного листа, не меняя всего остального, что есть в этом документе?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33480 / 21578 / 8250
Регистрация: 22.10.2011
Сообщений: 37,041
Записей в блоге: 12
01.06.2015, 22:58
Можно, в чем проблема? Как получить лист - известно, как обращаться к конкретной ячейке листа - тоже известно, ничего остальное затронуто не будет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.06.2015, 22:58

Плавное изменение цвета объекта от зеленого до красного и обратно
Пишу программу, которая определяет качество связи с сервером, через посылку пакетов ping. На GUI есть индикатор в виде светодиода,...

Конвертировать формат описания цвета Series TChart в вещественный тип и обратно
Нужно сохранять график (координаты) и цвета, указывать тип серии - в файл, я думаю это будет типизированный файл вещественного типа. ...

Сформировать на экране N кругов (красного цвета) и N ромбов (синего цвета)
с клавиатуры набирается число N. Сформировать на экране N кругов (красного цвета) и N ромбов(синего цвета), заполняющих всё окно по...

Изменение цвета названия файла/папки (либо цвета подсветки)
Привет супер уважаемые супер форумчане!) Очень интересно, есть ли какой-то способ изменить цвет названия файла/папки, либо изменить цвет...

Изменение цвета ячейки StringGrid-a
Нужно изменять цвет ячеек во время работы программы, то есть показывать какая часть массива используется Делаю так var red : array...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru