C#中操作Word(3)—— 利用Range对象读取和设置Word中的文本

        本文主要介绍利用C#读取和写入Word内容的一般方法。

一、创建工程。

1.1 引入控制台Control

        我们创建一个名叫WordTest的Windows窗体应用程序作为本次试验的工程,为了能够显示word中的内容,我们先要在下图所示的Program.cs的main()函数中引入控制台Console来显示读取到内容。



 

Program.cs的代码:

namespace WordTest
{
static class Program
{
[DllImport("kernel32.dll")]
public static extern Boolean AllocConsole();

[DllImport("kernel32.dll")]
public static extern Boolean FreeConsole(); 
/// <summary>
/// 应®|用®?程¨¬序¨°的Ì?主¡Â入¨?口¨²点Ì?。¡ê
/// </summary>
[STAThread]
static void Main()
{
AllocConsole(); 
Console.OutputEncoding = System.Text.Encoding.Default;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
FreeConsole(); 
}
}

}

第11行和第14行分别导入kernel32.dll中的初始化控制台函数AllocConsole()和释放控制台的函数FreeConsole()。
第22行和27行分别初始化和释放控制台。

第23行是设置控制台的输出编码为本地操作系统额默认编码,否则在英文系统中可能输出中文为乱码。


1.2 创建测试按钮

        在窗口上添加一个按钮,并把按钮名称命名为”测试”,创建按钮的点击事件处理函数,我们在这个函数中进行word内容的读取。



        Form1.cs文件中的按钮事件处理函数:
private void button1_Click(object sender, EventArgs e)
{

}

二、创建Word试验文档

        在D盘建立一个Word文档,名称就叫做test.docx,并在文档中输入以下内容:



三、进行word的读写

3.1 创建Application对象

        我们需要在button1_Click()函数中添加一个Application对象,添加方法如下:
Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();

        我们创建的app对象就代表了整个的Word的进程,我们可以利用app对象进行word的进程的开启和关闭。我们可以先查看下目前Word的版本信息,在控制台中打印出来:
private void button1_Click(object sender, EventArgs e)
{
Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
string version = app.Version;
Console.WriteLine(version);
app.Quit();
app = null;
}
第3行创建了一个Application对象。
第4、5行获取app对象的Version属性,然后在控制台中打印。
第6、7行退出该进程。

运行结果如下,成功打印了我电脑上Word的版本号,我装的office是2007版的,版本号为12.0。



3.2 获取文档对象

Document doc = app.Documents.Open("D:\\Test.docx");

        Application的Documents属性是一个存放Document对象容器,利于Documents的Open方法可以打开Word文件。打开后,文件中的所有文档都被存放到Documents中,open函数返回当前的ActiveDucument,也就是鼠标所在的文档对象。

3.3 获取Range对象进行读写

3.3.1 利用Range进行读操作

        可以通过doc对象的Range()方法获取Range对象,如果Range()不传入实参,则表示获取整个Document范围的Range:
    Range range = doc.Range();
        利用Console打印出来就是:
    Console.WriteLine(range.Text.ToString());



        如果range设置一个取值范围,比如只获取前两个字符:
    Range range = doc.Range(0,2);
        利用Console打印出来就是:
    Console.WriteLine(range.Text.ToString());



3.3.2 利用Range进行写操作

        接下来,我们可以直接操作Range对象进行Word文档的写操作,例如我想把目前word中的文字“我是一个测试文档。。”改成“我是一个新的测试文档。。”。实现的思路是获取其实位置为4,结束位置为10的Range对象,然后直接在range对上修改。
range = doc.Range(4, 10);
range.Text = "新的测试文档";
doc.Save();
第一行,获取了一个范围为5~10的Range对象。
第二行,利用Range对象进行写操作
第三行,将doc保存
        最终的效果如下:

整个工程的代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Office.Interop.Word;


namespace WordTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
string version = app.Version;
Console.WriteLine(version);
Document doc = app.Documents.Open("D:\\Test.docx");
doc.ActiveWindow.Visible = true;
Range range = doc.Range();
Console.WriteLine(range.Text.ToString());
range = doc.Range(4, 10);
range.Text = "新?的Ì?测a试º?文?档̦Ì。¡ê。¡ê";
doc.Save();
app.Quit();
app = null;
}
}
}


Github位置:

https://github.com/HymanLiuTS/OfficeTestByC-

克隆本项目:

git clone git@github.com:HymanLiuTS/OfficeTestByC-.git

获取本文源代码:

git checkout L03


  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用C#的OpenXML SDK来读取Word文档指定书签标记的图表。以下是大致的步骤: 1. 导入OpenXML SDK的命名空间。例如:`using DocumentFormat.OpenXml.Packaging;`和`using DocumentFormat.OpenXml.Wordprocessing;`。 2. 打开Word文档,并使用`WordprocessingDocument`类加载文档。例如:`WordprocessingDocument doc = WordprocessingDocument.Open("document.docx", true);`。 3. 获取文档的书签标记。可以使用`BookmarkStart`和`BookmarkEnd`元素来识别书签标记。例如,使用以下代码获取名为“bookmark1”的书签标记: ```csharp BookmarkStart bookmarkStart = doc.MainDocumentPart.Document.Body.Descendants<BookmarkStart>().Where(b => b.Name == "bookmark1").FirstOrDefault(); BookmarkEnd bookmarkEnd = doc.MainDocumentPart.Document.Body.Descendants<BookmarkEnd>().Where(b => b.Id.Value == bookmarkStart.Id.Value).FirstOrDefault(); ``` 4. 使用书签标记的位置信息,获取书签标记所在的段落和图表。例如,使用以下代码获取名为“bookmark1”的书签标记所在的段落和图表: ```csharp Paragraph paragraph = bookmarkStart.Parent as Paragraph; Drawing drawing = paragraph.Elements<Drawing>().FirstOrDefault(); ChartReference chartReference = drawing.Inline.Graphic.GraphicData.Descendants<ChartReference>().FirstOrDefault(); ``` 5. 获取图表数据,并使用相应的库(如OpenXML SDK、Excel Interop或EPPlus)进行分析和处理。例如,使用以下代码获取图表数据: ```csharp ChartPart chartPart = (ChartPart)doc.MainDocumentPart.GetPartById(chartReference.Id); OpenXmlReader reader = OpenXmlReader.Create(chartPart); while (reader.Read()) { if (reader.ElementType == typeof(SeriesText)) { string seriesText = reader.GetText(); // 处理图表数据 } } ``` 请注意,这只是一个简单的示例,实际情况可能需要根据具体的文档和需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值