测量小百科 | 使用NPOI操作Word
来源: | 作者:JYTEK | 发布时间: 2022-08-10 | 1053 次浏览 | 分享到:

全文字数1614 | 阅读需要4分钟


关键词:NPOI、Word、开源、NuGet


导读

上期小百科介绍了如何使用NPOI操作Excel,除此之外,我们工作中也经常会使用到Word,本期小百科来介绍如何在C#编程时使用NPOI创建及读写Word文件。

关于NPOI的优点及其安装在上期小百科中已经介绍过,本期不再赘述,可参考:测量小百科 | 使用NPOI操作Excel


NPOI创建Word

在进行创建Word之前,我们要了解NPOI中关于Word的结构。

正文段落:一个文档包含多个段落Paragraph,一个段落包含多个Run,Run是文档的最小单元,代表具有相同属性的一段文本,可以包含多个图片。

正文表格:一个文档包含多个表格Table,一个表格包含多行TableRow,一行包含多列(单元格TableCell)。每个单元格的内容相当于一个完整的文档,只是没有页眉和页脚,里面可以有表格。

图 1  NPOI创建Word的基本结构


创建Word分为4步:

  1. 创建Word新实例

  2. 创建段落及其文本,写入文字

  3. 创建表格、行、单元格,写入数据

  4. 保存Word文件


首先在代码顶端添加using:

using NPOI.XWPF.UserModel;

using System.IO;


基本操作代码如下所示:

//创建word文档

XWPFDocument doc = new XWPFDocument();

//创建一个段落作为标题

XWPFParagraph ptitle = doc.CreateParagraph();

ptitle.Alignment = ParagraphAlignment.CENTER;//设置对齐方式为居中

//在该段落中创建一段文本

XWPFRun titlerun = ptitle.CreateRun();

titlerun.SetText("测试数据");//配置文字内容

titlerun.IsBold = true;//设置文字样式

titlerun.FontSize = 28;

 

//创建一个段落作为正文

XWPFParagraph paragraph = doc.CreateParagraph();

//在段落中创建文本

XWPFRun r1 = paragraph.CreateRun();

r1.SetText(string.Format("实验时间:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm")));

//换行,再写入一行文字

XWPFRun r2 = paragraph.CreateRun();

r2.AddCarriageReturn();

r2.SetText("实验温度:26℃");

 

//创建一个11行2列的表格

XWPFTable table = doc.CreateTable(11, 2);

table.GetRow(0).GetCell(0).SetText("原始数据");

table.GetRow(0).GetCell(1).SetText("调制数据");

//创建待写入表格的模拟数据

double[] rawData = new double[10] { -1,-0.95,-0.8,-0.6,-0.3,0,0.5,1,2,5};

double[] data = new double[10];

for (int i = 0; i < 10; i++)

{

       data[i] = rawData[i] * 2;

}

//根据单元格索引在表格中写入数据

for (int i = 0; i < 10; i++)

{         

        table.GetRow(i+1).GetCell(0).SetText(rawData[i].ToString());

        table.GetRow(i + 1).GetCell(1).SetText(data[i].ToString());

}

//创建流文件

FileStream fs = new FileStream

    (@"C:UsersjytekDesktopNOPINPOI Word.docx", FileMode.Create);

//写入文件

doc.Write(fs);


运行程序后,在对应的保存路径中得到docx文档。

图 2  创建的docx文档


结果如下:

图 3  创建的Word文档内容


NPOI读写Word

读取已存在的Word的数据

对已存在的Word进行读取只需2步:

  1. 根据要读取的Word路径创建Word新实例

  2. 根据要读取的文字的位置读取数据


具体代码如下:

//创建流文件

FileStream fs = new FileStream(@"C:UsersjytekDesktopNOPINPOI Word.docx", FileMode.Open);

//创建Word实例

XWPFDocument doc = new XWPFDocument(fs);

//获取Word中的第一个Table

XWPFTable table = doc.Tables[0];

//读取Table中第2行第1列的数据

string readValue = table.GetRow(1).GetCell(0).GetText();

Console.WriteLine(readValue);


Console.ReadKey();


运行程序,读取到对应的数据。


图 4  运行读取Word数据程序界面


对已存在的Word写入数据

对已存在的Word写入数据需要4步:

  1. 根据要读取的Word路径创建Word新实例

  2. 创建要写入的数据的run或单元格

  3. 在run或单元格中写入数据

  4. 保存Word文件


具体代码如下:

//创建流文件

FileStream fs = new FileStream

       (@"C:Usersyjt10DesktopNOPINPOI Word.docx", FileMode.OpenOrCreate, FileAccess.ReadWrite);

//创建Word实例

XWPFDocument doc = new XWPFDocument(fs);

//在第二个段落中创建新的run并写入文字

doc.Paragraphs[1].CreateRun().AddCarriageReturn();

doc.Paragraphs[1].CreateRun().SetText("实验人:JYTEK");

//在Table中增加一行并对其单元格赋值

doc.Tables[0].CreateRow();

doc.Tables[0].GetRow(12).GetCell(0).SetText("10");

doc.Tables[0].GetRow(12).GetCell(1).SetText("20");

      

//写入文件,这里要重新创建流文件

fs = new FileStream

       (@"C:UsersjytekDesktopNOPINPOI Word.docx", FileMode.OpenOrCreate, FileAccess.ReadWrite);

doc.Write(fs);


打开Word文件,即可看到新写入的数据。

图 5  写入数据后的Word