Как добавить подстрочные символы в абзацы с помощью Word Automation?
Я работаю над программой на C#, которая использует библиотеку объектов Microsoft Word 14.0 для создания .doc-файл, добавьте в него абзацы и сохраните его. Существует небольшая форма с кнопкой, которая выполняет описанные действия (см. код ниже). Эта часть не имеет никаких проблем.
Задача:
Текущий текст в созданном файле word будет следующим:
Некоторый текст beff = 3.0
То, что мне нужно сделать, - это создать абзац, внутри которого есть символы подстрочного индекса.(в пункте выше буквы " eff " должны быть подписаны):

Окончательный документ будет содержать около 100 строк, как и выше, с различными символами, которые подписаны.
Я нашел способ подписывать весь абзац строкой,
paragraph1.Range.Font.Subscript = 1;
Но не нашел способа реализовать его на отдельных символах.
Я также знаю, что в Unicode есть подстрочные буквы и цифры, которые я мог бы использовать, но, к сожалению, Unicode не имеет полного алфавита в подстрочном индексе формат, так что это тоже не вариант.
Вопрос:
Есть ли способ для меня достичь цели и вставить что-то вроде "eff" в подстрочный индекс внутри абзаца в недавно созданном документе Word?
Пример кода:
private void btnReport_Click(object sender, EventArgs e)
{
Word._Application oWord;
Word._Document oDoc;
oWord = new Word.Application();
oDoc = oWord.Documents.Add();
var paragraph1 = oDoc.Content.Paragraphs.Add();
paragraph1.Range.Text = "Some text beff = 3.0";
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Filter = "Word document|*.doc";
saveFileDialog1.Title = "Save the Word Document";
if (DialogResult.OK == saveFileDialog1.ShowDialog())
{
string docName = saveFileDialog1.FileName;
if (docName.Length > 0)
{
object oDocName = (object)docName;
oDoc.SaveAs(ref oDocName);
}
}
oWord.Quit();
}
3 ответов:
Создайте документ Word и добавьте текст с подстрочным / надстрочным индексом и распакуйте его .docx чтобы изучить его содержимое XML, вы заметите, что текст, содержащий индекс / Надстрочный индекс, помещен в отдельный элементrun .
Один из способов добиться этого- OpenXML SDK .После загрузки и установки SDK вы можете использовать следующий код:using System; using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; namespace OpenXML { class Program { static void Main(string[] args) { using (var doc = WordprocessingDocument.Create("C:\\Subscript.docx", WordprocessingDocumentType.Document)) { MainDocumentPart mainPart = doc.AddMainDocumentPart(); mainPart.Document = new Document(); Body body = mainPart.Document.AppendChild(new Body()); Paragraph p = body.AppendChild(new Paragraph()); p.AppendChild(AddRun(false, "Some text b ")); p.AppendChild(AddRun(true, "eff")); p.AppendChild(AddRun(false, "= 3.0")); } Console.WriteLine("Done..."); Console.ReadLine(); } public static Run AddRun(bool isSubscript, string text) { Run run = new Run(); if (isSubscript) { var props = new RunProperties(); var fontSize = new FontSizeComplexScript() { Val = "20" }; var vAlignment = new VerticalTextAlignment() { Val = VerticalPositionValues.Subscript }; props.Append(fontSize); props.Append(vAlignment); run.Append(props); } run.Append(new Text(text)); return run; } } }Редактировать:
И вот решение взаимодействия:
using WordNS = Microsoft.Office.Interop.Word; WordNS.Document doc = _application.ActiveDocument; WordNS.Paragraph p = doc.Paragraphs.Add(); p.Range.Text = "Some text beff = 3.0"; int start = p.Range.Text.IndexOf("eff"); int end = p.Range.Text.IndexOf("="); WordNS.Range range = doc.Range(start, end); range.Select(); WordNS.Selection currentSelection = _application.Selection; currentSelection.Font.Subscript = 1; doc.SaveAs2("C:\\SubscriptInterop.docx");
Вы можете поиграть с начальной и конечной точками диапазона, чтобы выполнить эту работу, и даже найти смещение.
Range range = paragraph1.Range; range.Text = "Some text beff = 3.0"; if (range.Text.Contains("eff =")) { range.Start = range.Start + range.Text.IndexOf("eff ="); range.End = range.Start + 3; range.Font.Subscript = 1; }Надеюсь, это поможет.
В Word создайте макрос Word, который имитирует нужный вам процесс. Когда закончите, посмотрите на код VBA, который он создает. Этот код даст вам то, что/как на работе взаимодействий, которые должны быть вызваны.
Comments