Вопрос по c#, automation, ms-word, paragraph, subscript – Как добавить подстрочные символы в абзацы с помощью Word Automation?
Я работаю над программой на C #, которая использует библиотеку объектов Microsoft Word 14.0 для создания файла .doc, добавления к нему абзацев и сохранения. Существует небольшая форма с кнопкой, которая выполняет описанные действия (см. Код ниже). Эта часть не имеет проблем.
Проблема:
Текущий текст в созданном файле слов будет следующим:
Некоторый текст beff = 3.0
Что мне нужно сделать, это создать абзац, который имеет нижние символы внутри. (В абзаце над буквами "эфф» должен быть подписан):
Окончательный документ будет содержать около 100 строк, как указано выше, с различными символами, которые подписаны.
Я нашел способ подписать весь абзац строкой,
paragraph1.Range.Font.Subscript = 1;
но не нашел способа реализовать его на отдельных символах.
Я также знаю, что в Unicode есть буквы и цифры, которые я мог бы использовать, но, к сожалению, Unicode не имеет полного алфавита в формате индекса, так что это тоже не вариант.
Вопрос: Есть ли способ для меня достичь цели и вставить что-то вроде «эфф « в нижнем индексе внутри абзаца во вновь созданном документе 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();
}
добавьте текст с помощью subscipt / superscript и разархивируйте файл .docx, чтобы изучить его ».С содержанием XML вы заметите, что текст, содержащий нижний индекс / верхний индекс, помещается в отдельныйбежать элемент.
Одним из способов достижения этого является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;
}
}
}
РЕДАКТИРОВАТЬ:
И здесь'Решение Interop:
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");