Задание рамки у ячейки таблицы через OlePropertyGet в C++ Builder

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
AleksP
Сообщения: 46
Зарегистрирован: 01 мар 2008, 22:33

Таблица в Word задается через OLE при помощи следующего кода:

{
Variant Word, Document, Table, Cell;
int RowCount, ColCount;

Word = CreateOleObject("Word.Application.8");
Word.OlePropertySet("Visible", true);
Word.OlePropertyGet("Documents").OleProcedure("Add");
Document = Word.OlePropertyGet("Documents").OleFunction("Item", 1);
Table = Document.OlePropertyGet("Tables").OleFunction("Add", Document.OleFunction("Range", 0, 0), 5, 5);
RowCount = Table.OlePropertyGet("Rows").OlePropertyGet("Count");
ColCount = Table.OlePropertyGet("Columns").OlePropertyGet("Count");
for (int i=1; i <=RowCount; i++)
for(int j=1; j <=ColCount; j++) {
Cell = Table.OleFunction("Cell", i, j);
Cell.OlePropertyGet("Range").OleProcedure("InsertAfter", WideString(IntToStr(i)) + WideString("-") + WideString(IntToStr(j)));
}
Document.OleProcedure("SaveAs", ChangeFileExt(Application->ExeName, ".doc"));
Word.OleProcedure("Quit");
}

Как сделать так, чтобы ячейки таблицы создавались с рамкой?
AleksP
Сообщения: 46
Зарегистрирован: 01 мар 2008, 22:33

А как модифицировать данный код, чтобы в некоторых строках таблицы было разное число столбцов(ячеек)?
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Тема перемещена из раздела "C и C++" с сохранением ссылки.

Господа VBA-шники помогите, плиз, человеку. Вопрос ведь, по сути, не по С++, а по COM-cким интерфейсам MS Office, а они не зависят от среды, из которой используются.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Код после макрорекордера выделяющий толстой рамкой выбранную ячейку

Код: Выделить всё

With Selection.Cells
        With .Borders(wdBorderLeft)
            .LineStyle = wdLineStyleThinThickSmallGap
            .LineWidth = wdLineWidth300pt
            .Color = wdColorAutomatic
        End With
        With .Borders(wdBorderRight)
            .LineStyle = wdLineStyleThinThickSmallGap
            .LineWidth = wdLineWidth300pt
            .Color = wdColorAutomatic
        End With
        With .Borders(wdBorderTop)
            .LineStyle = wdLineStyleThinThickSmallGap
            .LineWidth = wdLineWidth300pt
            .Color = wdColorAutomatic
        End With
        With .Borders(wdBorderBottom)
            .LineStyle = wdLineStyleThinThickSmallGap
            .LineWidth = wdLineWidth300pt
            .Color = wdColorAutomatic
        End With
        .Borders(wdBorderDiagonalDown).LineStyle = wdLineStyleNone
        .Borders(wdBorderDiagonalUp).LineStyle = wdLineStyleNone
        .Borders.Shadow = False
    End With
    With Options
        .DefaultBorderLineStyle = wdLineStyleThinThickSmallGap
        .DefaultBorderLineWidth = wdLineWidth300pt
        .DefaultBorderColor = wdColorAutomatic
    End With
Если надо что бы выделены были все ячейки возможно проще будет воспользоваться стилем
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Для объединения ячеек выбираете их а затем

Код: Выделить всё

Selection.Cells.Merge
AleksP
Сообщения: 46
Зарегистрирован: 01 мар 2008, 22:33

Еще несколько вопросов:
1) Как присвоить свойство шрифта Bold каждой ячейке в строке? Сейчас делаю так:
for (int j = 1; j <= ColCount; j++)
{
Cell = Table.OleFunction("Cell", i, j);
Cell.OlePropertyGet("Range").OlePropertyGet("Font").OlePropertySet("Bold", "1");
}
2) Как сделать горизонтальное и вертикальное выравнивание по центру в каждой ячейке строки?
3) Как установить заданный цвет ячеек в строке?
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

AleksP, на все ваши вопросы есть универсальный ответ: "смотри код макрорекордера...."
Но тем не менее :

Код: Выделить всё

With ActiveDocument.Tables(k).Rows(i)    'к-я таблица строка i.
      .Cells.VerticalAlignment = wdCellAlignVerticalCenter  'вертикальное выравнивание по центру
      With .Cells.Shading
            .Texture = wdTextureNone   'необязательно
            .ForegroundPatternColor = wdColorAutomatic   'необязательно
            .BackgroundPatternColor = wdColorBlue  'фоновый цвет ячеек синий
       End With
       .Select  'выбираем строку   
       With Selection
           .ParagraphFormat.Alignment = wdAlignParagraphCenter  'горизонтальное выравнивание по центру
           .Font.Bold = True   'включаем Bold для выделения
       End with
End With
Значения констант легко посмотреть в окне Immediate VBE или в Object Brouser для Word
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

AleksP похоже не понял о чём идёт речь. Объясняю на пальцах. В Excel нужно нажать кнопочку, которая запускает запись макроса, затем выполнить необходимые действия вручную (например выделить диапазон ячеек и нажать Ctrl+B), затем остановить запись макроса и внимательно прочесть код на VBA, который сгенерировал макрорекордер. Проблемы с понимаем этого кода, как я вижу, ты уже поборол. Так что на этом всё.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить