У вас почти есть это в вашем текущем примере. Я почти уверен, что вы можете просто «заменить» «текст абзаца» на «переведенный текст»… например…
paragraph.Range.Text = translated;
Ниже приведен мой тест, в котором код открывает данный файл (source
), сохраняет файл с заданным именем файла пути (dest
), затем перебирает каждый абзац в документе и заменяет текст в абзаце переведенным текстом, затем наконец повторно сохраняет новый документ. Я не публиковал метод «перевода», поскольку вы сказали, что у вас есть специальный переводчик для использования. Очевидно, вы бы изменили этот метод на свой метод.
Кроме того, пара замечаний, как видно из моего кода, я настоятельно рекомендую вам структурировать большинство interop
методов таким образом… используя try/catch/finally
. Это поможет избежать «утечек» ресурсов. Весь код находится в части «попробовать». Часть «поймать» для отображения любых ошибок и важная часть «наконец» для закрытия файла и освобождения ресурсов. Часть «наконец» будет выполняться ВСЕГДА, даже если код выдает исключение.
Кроме того, похоже, что вы можете запускать этот код в BackgroundWorker
, это нормально, однако вам нужно быть осторожным и НЕ использовать пользовательский интерфейс, который находится в другом потоке. Я не пробовал это; однако я предполагаю, что у вас могут возникнуть проблемы, если вы попытаетесь выполнить…
wordApp.Visible = true;
на заднем плане рабочий. Это может сработать, и если сработает, то дерзайте… это просто предупреждение… ваш фоновый рабочий процесс НЕ должен пытаться получить доступ к каким-либо элементам пользовательского интерфейса из вызывающего потока. Я предполагаю, что вы, возможно, уже знаете это.
В любом случае, попробуйте приведенный ниже код, так как он работал в моих тестах.
private void TranslateDoc(string source, string dest) {
Word.Application wordApp = null;
Word.Document myWordDoc = null;
try {
wordApp = new Word.Application();
if (File.Exists(source)) {
//wordApp.Visible = true;
myWordDoc = wordApp.Documents.Open(source);
myWordDoc.SaveAs2(dest);
myWordDoc.Close();
myWordDoc = wordApp.Documents.Open(dest);
Word.Paragraphs paragraphs = myWordDoc.Paragraphs;
string originalText;
string replacementText;
for (int i = 1; i <= paragraphs.Count; i++) {
originalText = paragraphs[i].Range.Text;
if (originalText != "\r") {
replacementText = TranslateText(originalText);
paragraphs[i].Range.Text = replacementText;
}
}
myWordDoc.SaveAs2(dest);
MessageBox.Show("File Created!");
}
else {
MessageBox.Show("Original File not Found!");
}
}
catch (Exception ex) {
MessageBox.Show("Error: " + ex.Message);
}
finally {
if (myWordDoc != null) {
myWordDoc.Close();
Marshal.ReleaseComObject(myWordDoc);
}
if (wordApp != null) {
wordApp.Quit();
Marshal.ReleaseComObject(wordApp);
}
}
}
Использование…
string sourceFileName = @"D:\Test\WordFiles\Translate1.docx";
string destFileName = @"D:\Test\WordFiles\Translate2.docx";
private void button1_Click(object sender, EventArgs e) {
TranslateDoc(sourceFileName, destFileName);
}
person
JohnG
schedule
24.11.2020
DocSentenseTranslate(pText);
и добавьте возвращенную строку в качестве нового абзаца в новый документ. Может потребоваться дополнительный шаг, так как неясно, что возвращается изDocSentenseTranslate(pText);
- person JohnG   schedule 23.11.2020SaveAs
новый документ. - person JohnG   schedule 23.11.2020