C# добавя Quick Table (Building Block) в Word

Създадох бърза таблица като шаблон за таблица в моя шаблон dotx. Бих искал да създам бърза таблица програмно. това възможно ли е?

В момента използвам съществуваща таблица като шаблон и копирам нейните свойства в новата таблица (вижте кода).

object oTemplate = "D:\\Templates\\tables.dotx";
Word._Document doc = word.Documents.Add(oTemplate, ref oMissing, ref oMissing, ref oMissing);

// Copy first table as template
Word.Table tableTemplate = doc.Tables[1];
Word.Range rangeCopy = tableTemplate.Range;
rangeCopy.Copy();


...


// Reuse table template for new tables

object oMissing = Missing.Value;
var newTable = doc.Tables.Add(range, 1, 1, ref oMissing, ref oMissing);
newTable.Range.Paste();

Проблемът е, че фиктивната таблица не се изтрива от поставянето, а се премества надолу.

Решение:

  1. Създайте градивен блок във файла на шаблона (tables.dotx в моя случай)
  2. Заредете градивния блок в C#
  3. Вмъкване в диапазон

var template = (Word.Template)doc.get_AttachedTemplate();

Word.BuildingBlock objBB = template.BuildingBlockEntries.Item("MyCustomBlock");

objBB.Insert(range, true);


person br0ken.pipe    schedule 24.07.2019    source източник
comment
Не съм сигурен какво имате предвид под Quick Table? Бихте ли могли да дадете използваните команди на потребителския интерфейс или екранна снимка или нещо подобно? FWIW Оставам с впечатлението, че това, от което се нуждаете, е Building Block, съхранен в шаблона, който може да бъде вмъкнат при поискване...   -  person Cindy Meister    schedule 24.07.2019
comment
Благодаря за вашия отговор. Бързата таблица е: Вмъкване › Таблица › Падащо меню › Бърза таблица   -  person br0ken.pipe    schedule 24.07.2019


Отговори (1)


„Бързите таблици“ в списъка Insert > Table > Drop Down > Quick Table са градивни елементи. Те могат да бъдат намерени и в Insert > Text > Quick Parts > Building Block Organizer, в галерията с таблици. Това означава, че тези таблици се съхраняват в шаблона за градивни блокове на потребителския профил и трябва да бъдат част от стандартна инсталация.

Основният (VBA) код за вмъкване на вграден (инсталиран като част от Office) градивен блок е:

    Application.Templates( _
    "C:\Users\[user name]\AppData\Roaming\Microsoft\Document Building Blocks\1033\14\Built-In Building Blocks.dotx" _
    ).BuildingBlockEntries("Calendar 2").Insert Where:=Selection.Range, _
    RichText:=True

И за C#

Word.Template objTmpl = wdApp.Templates[@"C:\Users\[user name]\AppData\Roaming\Microsoft\Document Building Blocks\1033\14\Built-In Building Blocks.dotx"];
Word.BuildingBlock objBB = objTmpl.BuildingBlockEntries.Item("Calendar 2");
objBB.Insert(rng, true);

Ако не е сигурно, че този шаблон ще бъде инсталиран или инсталиран към конкретен файлов път, тогава по-сигурният подход би бил таблицата да бъде запазена като градивен блок в шаблона, който се разпространява като част от VSTO решение. Това е просто въпрос на избиране на таблицата и след това използване на Insert > Text > Quick Parts > Save selection to Quick Part Gallery. В диалоговия прозорец не забравяйте да изберете шаблона от списъка Save in, тъй като по подразбиране може да бъде инсталационният шаблон с градивните елементи.

За да вмъкнете градивен блок в шаблона, от който е създаден документ („прикачения шаблон“):

Word.Template objTmpl = (Word.Template)doc.get_AttachedTemplate(); 
person Cindy Meister    schedule 24.07.2019
comment
много благодаря за изчерпателния отговор. мисля, че това върви в правилната посока. градивният елемент се съхранява в моя обикновен шаблон (tables.dotx). ако направя заявка за файла чрез word.templates[.../tables.dotx], получавам съобщение за грешка, че не е в колекцията. същата грешка се появява със стандартния dotx шаблон за изграждащ блок. трябва ли да го добавя по някакъв начин? - person br0ken.pipe; 24.07.2019
comment
Ако не е в колекцията, вероятно не е заредено в паметта. Шаблон ще бъде в колекцията Templates само ако е 1) зареден като добавка или 2) прикачен към отворен документ (и след това само във връзка с този конкретен документ). Без да разбирам повече контекста, ми е трудно да кажа какъв може да е проблемът, освен това... - person Cindy Meister; 24.07.2019
comment
Намерих по-ранно решение от вас, също работещо :) : var template = (Word.Template)doc.get_AttachedTemplate(); Word.BuildingBlock objBB = template.BuildingBlockEntries.Item(MyCustomBlock); objBB.Insert(диапазон, true); - person br0ken.pipe; 24.07.2019