我工作在C#程序使用的Microsoft Word 14.0对象库创建一个.doc文件,添加段落,并保存它。 有一个小的形式,它描述的动作(见下面的代码)的按钮。 这部分有没有问题。
问题:
目前在创建的Word文件中的文本将是以下几点:
有些文字贝夫= 3.0
我需要完成什么,是创建一个段落,其中有内标字符(段以上字母“EFF”应该为下标):
最后文件将包含线的约100像上面,与被下标不同的字符。
我发现了一种用下标线全段,
paragraph1.Range.Font.Subscript = 1;
但发现没有办法实现它在不同的字符。
我也知道,有标字母和数字在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();
}
创建一个Word文档,并与subscipt /标添加文字和解压的.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;
}
}
}
编辑:
而且这里有一个互操作的解决方案:
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代码做一下它创建。 该代码就会给你什么/如何上需要被调用的互操作性展示的工作。