Преобразование файла Word в вопросы теста C# - PullRequest
1 голос
/ 28 марта 2020

У меня есть файл Microsoft Word, подобный этому:

C1: 1 + 1 = ? 

    A. 0        B. 1         C. 2        D. 3

(показать метку абзаца)

enter image description here

Я хочу преобразовать до:

Img1

C1: 1 + 1 = ?
A. 0    
B. 1   
C. 2    
D. 3

Я использовал:

string inputFileO = dialog.FileName;

Application wordApp = new Application();
Document wordDoc = wordApp.Documents.Open(inputFileO);
Range rng = wordDoc.Range();

foreach (Range range in wordApp.ActiveDocument.StoryRanges)
{
range.Find.Text = "B.";
range.Find.Replacement.Text = "\rB.";
range.Find.Wrap = WdFindWrap.wdFindContinue;
object replaceAll = WdReplace.wdReplaceAll;
range.Find.Execute(Replace: ref replaceAll);
}

Но не удалось.

enter image description here

Обновление: я обнаружил, что номер абзаца за два раза составляет всего 3.

I Хочу, чтобы номер абзаца во второй раз был 5.

Обновление 2: с этим кодом от Frenchy (большое спасибо)

 public MainWindow()
    {
        InitializeComponent();

        Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();

        Document wordDoc = wordApp.Documents.Open("d:\\+test.docx");

        string TextToReplace = string.Empty;

        //read all text in string
        foreach (Range tmpRange in wordDoc.StoryRanges)
            TextToReplace += tmpRange.Text;

        //replace in string
        var NewText = Regex.Replace(TextToReplace, @"\s*(?<answer>[ABCD]\. [0123])\s*", "${answer}\r", RegexOptions.Multiline);
        NewText = Regex.Replace(NewText, @"\?", "?\r", RegexOptions.Multiline);

        //replace in word and save
        wordDoc.Activate();
        FindAndReplace(wordApp, TextToReplace, NewText);

        wordDoc.Save();
        wordDoc.Close();
    }

    private void FindAndReplace(Microsoft.Office.Interop.Word.Application doc, object findText, object replaceWithText)
    {
        //options
        object matchCase = false;
        object matchWholeWord = true;
        object matchWildCards = false;
        object matchSoundsLike = false;
        object matchAllWordForms = false;
        object forward = true;
        object format = false;
        object matchKashida = false;
        object matchDiacritics = false;
        object matchAlefHamza = false;
        object matchControl = false;
        object read_only = false;
        object visible = true;
        object replace = 2;
        object wrap = 1;
        //execute find and replace
        doc.Selection.Find.Execute(ref findText, ref matchCase, ref matchWholeWord,
            ref matchWildCards, ref matchSoundsLike, ref matchAllWordForms, ref forward, ref wrap, ref format, ref replaceWithText, ref replace,
            ref matchKashida, ref matchDiacritics, ref matchAlefHamza, ref matchControl);
    }
}

я успешно

enter image description here

1 Ответ

0 голосов
/ 28 марта 2020

это код, который я использую для изменения документа Word, я адаптировался к вашей проблеме:

    public MainWindow()
    {
        InitializeComponent();

        Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();

        Document wordDoc = wordApp.Documents.Open("d:\\+test.docx");

        string TextToReplace = string.Empty;

        //read all text in string
        foreach (Range tmpRange in wordDoc.StoryRanges)
            TextToReplace += tmpRange.Text;

        //replace in string
        var NewText = Regex.Replace(TextToReplace, @"\s*(?<answer>[ABCD]\. [0123])\s*", "${answer}\r", RegexOptions.Multiline);
        NewText = Regex.Replace(NewText, @"\?", "?\r", RegexOptions.Multiline);

        //replace in word and save
        wordDoc.Activate();
        FindAndReplace(wordApp, TextToReplace, NewText);

        wordDoc.Save();
        wordDoc.Close();
    }

    private void FindAndReplace(Microsoft.Office.Interop.Word.Application doc, object findText, object replaceWithText)
    {
        //options
        object matchCase = false;
        object matchWholeWord = true;
        object matchWildCards = false;
        object matchSoundsLike = false;
        object matchAllWordForms = false;
        object forward = true;
        object format = false;
        object matchKashida = false;
        object matchDiacritics = false;
        object matchAlefHamza = false;
        object matchControl = false;
        object read_only = false;
        object visible = true;
        object replace = 2;
        object wrap = 1;
        //execute find and replace
        doc.Selection.Find.Execute(ref findText, ref matchCase, ref matchWholeWord,
            ref matchWildCards, ref matchSoundsLike, ref matchAllWordForms, ref forward, ref wrap, ref format, ref replaceWithText, ref replace,
            ref matchKashida, ref matchDiacritics, ref matchAlefHamza, ref matchControl);
    }
}
...