Найти текст в текстовом документе и заменить его таблицей - PullRequest
2 голосов
/ 04 ноября 2010

Я пытаюсь найти в текстовом документе какой-то определенный текст, а затем заменить его на пользовательскую таблицу.Кажется, у меня почти все работает, но кажется, что я добавляю таблицу в середине предыдущего слова, а не туда, где он нашел текст.

Это моя функция

public void AddTableAtCursor(string tabledata,
                             string find,
                             Boolean flh = true,
                             string name = "Table")
{
    object replaceAll = Word.WdReplace.wdReplaceAll;

    Word.Range srng = Application.ActiveDocument.Content;
    srng.WholeStory();

    srng.Find.ClearFormatting();
    srng.Find.Text = find;

    srng.Find.Replacement.ClearFormatting();
    srng.Find.Replacement.Text = "";

    int FirstChr = srng.Text.IndexOf(find);

    if (FirstChr != -1)
    {
        Word.Range ts = 
            Application.ActiveDocument.Range(FirstChr, FirstChr);

        this.Application.Selection.TypeParagraph();

        srng.Find.Execute(
            ref missing, ref missing, ref missing, ref missing,
            ref missing, ref missing, ref missing, ref missing,
            ref missing, ref missing, ref replaceAll, ref missing,
            ref missing, ref missing, ref missing);

        string[] rows = tabledata.Split('|');
        string[] c = rows[0].Split('^');
        rows[0] = null;

        object styleName = "Light List - Accent 1";
        Word.Table tbl = null;

        Word.Range currentSelection = srng;

        int hclen = c.Length;
        if (TomData.IndPrices != "on") { hclen = hclen - 2; }

        tbl = Application.ActiveDocument.Content.Tables.Add(
            ts, rows.Length + 1, hclen);
        tbl.set_Style(ref styleName);
        tbl.PreferredWidth = 90;
        tbl.PreferredWidthType =
            Word.WdPreferredWidthType.wdPreferredWidthPercent;

        // First Row, Put the name into the first cell

        for (int i = 1; i <= hclen; i++)
        {
            if (i == 1)
            {
                tbl.Cell(1, i).Range.InsertBefore(name);
            }
            else
            {
                tbl.Cell(1, i).Range.InsertBefore("");
            }
        }

        // 2nd row, put the headers in
        for (int i = 1; i <= hclen; i++)
        {
            int t = i - 1;
            tbl.Cell(2, i).Range.InsertBefore(c[t]);
        }

        int tblrow = 3;

        // after that just put the data
        for (int rc = 0; rc < rows.Length; rc++)
        {
            if (rows[rc] != null)
            {
                string[] coldata = rows[rc].Split('^');
                int tblcol = 1;
                int clen = coldata.Length;
                if (TomData.IndPrices != "on") { clen = clen - 2; }
                for (int nc = 0; nc < clen; nc++)
                {
                    tbl.Cell(tblrow, tblcol).Range.InsertBefore(
                        coldata[nc]);
                    tblcol++;
                }
                tblrow++;
            }
        }
    }
}

делаешь неправильно?

1 Ответ

5 голосов
/ 05 ноября 2010

У вас здесь много проблем, поэтому я бы рекомендовал работать по 1 шагу за раз.

1) вам нужно НАЙТИ текст, который вы заменяете. Поскольку вы заменяете его таблицей, вы действительно не можете использовать опцию REPLACEALL объекта find, поэтому избавьтесь от всего этого. Получите диапазон CONTENT документа в переменную Range, оттуда НАЙДИТЕ, а затем выполните поиск. Диапазон, из которого вы получили FIND, будет сброшен, чтобы указывать на конкретный найденный текст (если есть), а затем вы можете управлять этим диапазоном.

Например

Set myRange = ActiveDocument.Content
myRange.Find.Execute FindText:="blue", Forward:=True
If myRange.Find.Found = True Then myRange.Bold = True

2) Далее вы путаете смещения внутри строки со смещениями в документе, как в этом коде

    int FirstChr = srng.Text.IndexOf(find);

    if (FirstChr != -1)
    {
        Word.Range ts = Application.ActiveDocument.Range(FirstChr,FirstChr);

Это будет иногда, но очень редко, работать. Это зависит от множества вещей в Word. Лучше найти то, что вам нужно, с помощью поиска, а затем манипулировать текстом только с диапазонами.

Здесь действительно хорошая статья о НАЙТИ и ЗАМЕНИТЬ в слове.

http://msdn.microsoft.com/en-us/library/aa211953%28office.11%29.aspx

Я бы написал процедуру, чтобы НАЙТИ и ВЫБЕРИТЕ текст, который вы ищете первым. Убедитесь, что это работает во всех случаях, ТО, используя диапазон найденного текста, работайте с его заменой таблицей. как только вы нашли текст, вы после

...