我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C#使用NPOI对word进行读写

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C#使用NPOI对word进行读写

一、简介

操作Word的类库:

  • NPOI: V2.5.1 快速生成 https://github.com/tonyqus/npoi
  • DocX(属于Xceed Words for .NET的免费版本): V1.6.0 https://github.com/xceedsoftware/DocX
  • Aspose.Words: 收费
  • Spire.Doc: 收费

二、简单使用

1、XWPFDocument类的实例化

该类的实例对应一个word文档 

XWPFDocument MyDoc = new XWPFDocument();

2、设置页面的大小

如果不进行页面大小的设置,默认是纵向的A4大小。横向的A4的页面大小 ,如果要纵向,宽高两个值调换即可。

T_SectPr m_SectPr = new CT_SectPr();       //实例一个尺寸类的实例
m_SectPr.pgSz.w = 16838;        //设置宽度(这里是一个ulong类型)
m_SectPr.pgSz.h = 11906;        //设置高度(这里是一个ulong类型)
MyDoc.Document.body.sectPr = m_SectPr;          //设置页面的尺寸

这里的单位比较特殊,用的是缇(Twip)这是一种和屏幕无关的长度单位,目的是为了让应用程序元素输出到不同设备时都能保持一致的计算方式。

换算关系:

  • 1英寸=1440缇
  • 1厘米=567缇
  • 1磅=20缇
  • 1像素=15缇

常用页面尺寸:(单位Twip)

  • A4(纵向):W=11906 H=16838
  • A4(纵向):W=16838 H=11906
  • A5 : W=8390 H=11906
  • A6 : W=5953 H=8390

示例:控制word页内边距

//创建document对象
var doc = new XWPFDocument();
doc.Document.body.sectPr = new CT_SectPr();
CT_SectPr m_SectPr = doc.Document.body.sectPr;
m_SectPr.pgSz.h = (ulong)16838;
m_SectPr.pgSz.w = (ulong)11906;
//页面边距
m_SectPr.pgMar.left = (ulong)800;//左边距
m_SectPr.pgMar.right = (ulong)800;//右边距
m_SectPr.pgMar.top = "850";//上边距
m_SectPr.pgMar.bottom = "850";//下边距

3、段落处理

创建段落

段落为XWPFParagraph类型的实例,段落由XWPFDocument实例的使用CreateParagraph()方法生成。

XWPFParagraph MyParagraph = MyDoc.CreateParagraph();

该段落类有很多属性,用于设置与段落相关的内容。主要有以下几个方面

  • BorderXXXXX属性:该值用于设置边界的样式。该属性用于获取或设置一个Borders枚举类型的值,
  • FillBackgroundColor属性:背景填充的颜色。该属性获取或设置一个string类型的变量。该变量的含义是某个颜色的RGB值(在NPOI里所有的颜色都是以这种形式表示的)。例如设置为黑色则对应的代码如下:
    MyParagraph.FillBackgroundColor = "#000000";
  • Alignment属性:段落的对齐方式。该属性获取或设置一个ParagraphAlignment的枚举值。
  • VerticalAlignment属性:文本垂直方向的对齐方式。该属性获取或设置一个TextAlignment 的枚举值。
  • IndentationFirstLine属性:用于设置段落的首行缩进。该属性获取或设置一个int型变量。 
    这个int值并不是缩进的字数,这里可以用一个函数计算缩进的距离。
//段落缩进   返回值为对应的缩进距离
//(fontname:文字类型名称   fontsize:文字大小    fontcount:缩进数目 fontstyle:文字类型(斜体、粗体...))
int Indentation(String fontname, int fontsize, int fontnum, FontStyle fontstyle)
{
    Graphics gp = this.CreateGraphics();
    gp.PageUnit = GraphicsUnit.Point;
    SizeF size = gp.MeasureString("字", new Font(fontname, fontsize * 0.75F, fontstyle));
    return (int)size.Width * fontnum * 10;
}

示例:创建段落

var paragraph = doc.CreateParagraph();
paragraph.Alignment = ParagraphAlignment.CENTER; //字体居中
var run = paragraph.CreateRun();
run.IsBold = true;
run.SetText(contend);
run.FontSize = 28;
run.SetFontFamily("黑体", FontCharRange.None); //设置黑体
//控制段落与其他元素的上下距离
paragraph.SpacingBeforeLines = 20;//上方距离
paragraph.SpacingAfterLines = 20;//下方距离

换页(本页未满直接写下一页)

paragraph = doc.CreateParagraph();
paragraph.CreateRun().AddBreak(BreakType.PAGE);

文本处理

  • doc.Paragraphs 获取到文档里的所有的段落对象;
  • para.ParagraphText 获取段落的文本数据;
  • para.ReplaceText(要被替换的文本,替换文本) 替换段落的文本(模板能实现的关键)

4、表格处理

doc.Tables 获取文档里的所有的表格对象;//doc.Tables获取的只是Word中最外层的表格,不包含嵌套内层的。 
cell.Tables;//获取嵌套单元格可使用 
row.Rows //获取表格所有行; 
row.GetTableICells() ;//获取表格行的所有单元格; 
获取到单元格之后就可以获取单元格里的文本段落(Paragraphs)并且进行文本替换

创建表格

var table = doc.CreateTable(行数, 列数);
table.Width = 5000;

控制表格中列宽(这里需要注意,只设置一行的列宽一旦插入文字就会使设置的列宽失效,所以要把每一个单元格都要设置上)

for (int r = 0; r < 8; r++)
{
      SetCellWith(table.GetRow(r).GetCell(0), "600");
      SetCellWith(table.GetRow(r).GetCell(1), "1500");
      SetCellWith(table.GetRow(r).GetCell(2), "1500");
      SetCellWith(table.GetRow(r).GetCell(3), "600");
 }

设置表格中单元格竖直居中

var rowcell = table.GetRow(r).GetCell(c);
rowcell.SetVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);

设置单元格内容

//table中的文字格式设置
var para = new CT_P();
var pCell = new XWPFParagraph(para, table.Body);
pCell.Alignment = paragraphAlignment; //字体居中
pCell.VerticalAlignment = TextAlignment.CENTER; //字体居中

var r1c1 = pCell.CreateRun();
r1c1.SetText(setText);
r1c1.FontSize = 11;
r1c1.SetFontFamily("宋体", FontCharRange.None); //设置雅黑字体
pCell.SpacingAfterLines = 40;
pCell.SpacingBeforeLines = 40;
//放入单元格
table.GetRow(4).GetCell(1).SetParagraph(pCell);

表格中换行

var run= paragraph.CreateRun();
run.SetText(contends[i]);
run.FontSize = 11;
run.SetFontFamily("宋体", FontCharRange.None); 
run.AddBreak(BreakType.TEXTWRAPPING);//换行

合并单元格

table.GetRow(rowIndex).MergeCells(fromCol, toCol);//合并列

水平合并行单元格

CT_Tc cttcofRowThird = cell.GetCTTc();
CT_TcPr ctProfRowThird = cttcofRowThird.AddNewTcPr();
ctProfRowThird.gridSpan = new CT_DecimalNumber();
ctProfRowThird.gridSpan.val = num.ToString();//合并num列

合并行、垂直合并列单元格

public void MYMergeRows(XWPFTable table, int fromRow, int toRow, int colIndex)
{
    for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++)
    {
        XWPFTableCell rowcell = table.GetRow(rowIndex).GetCell(colIndex);
        rowcell.SetVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
        CT_Tc cttc = rowcell.GetCTTc();
        CT_TcPr ctTcPr = cttc.tcPr;
        if (ctTcPr == null)
        {
            ctTcPr = cttc.AddNewTcPr();
        }

        if (rowIndex == fromRow)
        {
            // The first merged cell is set with RESTART merge value
            ctTcPr.AddNewVMerge().val = ST_Merge.restart;
        }
        else
        {
            // Cells which join (merge) the first one, are set with CONTINUE
            ctTcPr.AddNewVMerge().val = ST_Merge.@continue;//继续合并行
        }
        ctTcPr.AddNewVAlign().val = ST_VerticalJc.center;//垂直
    }
}

5、页眉页脚处理

XWPFDocument doc = new XWPFDocument();
doc.Document.body.sectPr = new CT_SectPr();
CT_SectPr m_SectPr = doc.Document.body.sectPr;

//创建页眉
CT_Hdr m_Hdr = new CT_Hdr();
CT_P m_P = m_Hdr.AddNewP();
m_P.AddNewR().AddNewT().Value = "页眉内容值";
m_P.AddNewPPr().AddNewJc().val = ST_Jc.center;// 页眉居中
                                                //创建页眉关系(headern.xml)
XWPFRelation Hrelation = XWPFRelation.HEADER;
XWPFHeader m_h = (XWPFHeader)doc.CreateRelationship(Hrelation, XWPFFactory.GetInstance(), doc.HeaderList.Count + 1);
doc.CreateFootnotes();

//设置页眉
m_h.SetHeaderFooter(m_Hdr);
CT_HdrFtrRef m_HdrFtr = m_SectPr.AddNewHeaderReference();
m_h.GetRelationById(m_HdrFtr.id);

//创建页脚
CT_Ftr m_ftr = new CT_Ftr();
CT_P m_fP = m_ftr.AddNewP();
m_fP.AddNewR().AddNewT().Value = "页脚内容值";
m_fP.AddNewPPr().AddNewJc().val = ST_Jc.center;// 页眉居中
                                                //创建页脚关系(footern.xml)
XWPFRelation Frelation = XWPFRelation.FOOTER;
XWPFFooter m_f = (XWPFFooter)doc.CreateRelationship(Frelation, XWPFFactory.GetInstance(), doc.FooterList.Count + 1);

//设置页脚
m_f.SetHeaderFooter(m_ftr);
m_HdrFtr = m_SectPr.AddNewFooterReference();
m_HdrFtr.type = ST_HdrFtr.@default;
m_f.GetRelationById(m_HdrFtr.id);

三、综合示例

CT_SectPr class="lazy" data-srcpr = new CT_SectPr();
//设置A4纸纵向,如果要横向,两个值调换即可
class="lazy" data-srcpr.pgSz.w = (ulong)11906;
class="lazy" data-srcpr.pgSz.h = (ulong)16838;

XWPFDocument doc = new XWPFDocument();
doc.Document.body.sectPr = class="lazy" data-srcpr;
//输出标题
XWPFParagraph ptitle = doc.CreateParagraph();
ptitle.Alignment = ParagraphAlignment.CENTER;
XWPFRun titlerun = ptitle.CreateRun(); //向该段落中添加文字
titlerun.SetText("标题");
titlerun.IsBold = true;
titlerun.FontFamily = "华文行楷";
titlerun.FontSize = 30;
titlerun.SetColor("blue");

//输出一个段落
XWPFParagraph p2 = doc.CreateParagraph();
p2.Alignment = ParagraphAlignment.CENTER;
p2.IndentationFirstLine = (int)100; //首行缩进
XWPFRun r2 = p2.CreateRun();
r2.SetText(string.Format("生成时间:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm")));
r2.FontSize = 15;
titlerun.FontFamily = "宋体";

StringBuilder sb = new StringBuilder();
using (FileStream stream = File.OpenRead("simple.docx"))
{
    XWPFDocument docx = new XWPFDocument(stream);

    //页眉
    foreach (XWPFHeader xwpfHeader in docx.HeaderList)
    {
        sb.AppendLine(string.Format("{0}", new string[] { xwpfHeader.Text }));
    }

    //页脚

    foreach (XWPFFooter xwpfFooter in docx.FooterList)
    {
        sb.AppendLine(string.Format("{0}", new string[] { xwpfFooter.Text }));
    }

    //读取段落
    foreach (var para in docx.Paragraphs)
    {
        string text = para.ParagraphText; //获得文本
        var runs = para.Runs;
        // string styleid = para.Style;
        for (int i = 0; i < runs.Count; i++)
        {
            var run = runs[i];
            text = run.ToString(); //获得run的文本
            sb.Append(text + ",");
        }
    }
    //读取表格
    foreach (XWPFTable table in docx.Tables)
    {
        //循环表格行
        foreach (XWPFTableRow row in table.Rows)
        {
            foreach (XWPFTableCell cell in row.GetTableCells())
            {
                sb.Append(cell.GetText());
            }
        }
    }

    //读取图片
    foreach (XWPFPictureData pictureData in docx.AllPictures)
    {
        string picExtName = pictureData.SuggestFileExtension();
        string picFileName = pictureData.FileName;
        byte[] picFileContent = pictureData.Data;

        string picTempName = string.Format(Guid.NewGuid().ToString() + "_" + picFileName + "." + picExtName);

        using (FileStream fs = new FileStream(picTempName, FileMode.Create, FileAccess.Write))
        {
            fs.Write(picFileContent, 0, picFileContent.Length);
            fs.Close();
        }

        sb.AppendLine(picTempName);
    }

    Console.WriteLine(sb.ToString());
}

FileStream out1 = new FileStream("simple.docx", FileMode.Create);
doc.Write(out1);
out1.Close();

四、参考

Word与Excel字号对照表

到此这篇关于C#使用NPOI对word进行读写的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C#使用NPOI对word进行读写

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C#如何使用NPOI对word进行读写

这篇文章主要介绍了C#如何使用NPOI对word进行读写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#如何使用NPOI对word进行读写文章都会有所收获,下面我们一起来看看吧。一、简介操作Word的类库:N
2023-07-02

C#中怎么使用NPOI库读写Excel文件

今天小编给大家分享一下C#中怎么使用NPOI库读写Excel文件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。第一步添加程引
2023-06-29

C#如何使用NPOI对Excel数据进行导入导出

本篇内容介绍了“C#如何使用NPOI对Excel数据进行导入导出”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、概述NPOI 是 POI
2023-07-02

使用Python对Excel进行读写操作

学习Python的过程中,我们会遇到Excel的读写问题。这时,我们可以使用xlwt模块将数据写入Excel表格中,使用xlrd模块从Excel中读取数据。下面我们介绍如何实现使用Python对Excel进行读写操作。 Python版:3.
2022-06-04

c语言怎么对文件进行读写

C语言提供了一组文件操作函数,用于打开、读、写和关闭文件。下面是一个简单的示例,演示了如何对文件进行读写。1. 打开文件:```c#include int main() {FILE *file; // 文件指针char filename[]
2023-09-27

c语言如何对文件进行读写

c 语言提供 fopen()、fclose()、fread() 和 fwrite() 函数进行文件读写。文件操作包括:1. 使用 fopen() 打开文件;2. 使用 fread() 从文件读取数据或使用 fwrite() 将数据写入文件;
c语言如何对文件进行读写
2024-05-22

C#中怎么利用MemoryStream类对内存进行读写

C#中怎么利用MemoryStream类对内存进行读写,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。读写内存-MemoryStream类MemoryStream类用于向内存
2023-06-17

如何使用mybatis的typeHandler对clob进行流读写

这篇文章主要介绍“如何使用mybatis的typeHandler对clob进行流读写”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用mybatis的typeHandler对clob进行流读写”
2023-06-26

怎么用Python对Word文件内容进行读取

今天小编给大家分享一下怎么用Python对Word文件内容进行读取的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。利用 pyt
2023-06-30

怎么利用纯C语言对EXCEL进行读写操作

本文小编为大家详细介绍“怎么利用纯C语言对EXCEL进行读写操作”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么利用纯C语言对EXCEL进行读写操作”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、写操作第一
2023-07-02

C++ qt如何使用jsoncpp json进行读写操作

这篇文章将为大家详细讲解有关C++ qt如何使用jsoncpp json进行读写操作,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。JsonCpp的使用项目需要c++下使用json,我选择了J
2023-06-21

C#中怎么对ini文件进行读写操作

本篇文章为大家展示了C#中怎么对ini文件进行读写操作,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C#读写ini文件其实并不是普通的文本文件.它有自己的结构.由若干段落(SECTION)组成,在每
2023-06-18

使用R语言怎么对二进制文件进行读写

这篇文章将为大家详细讲解有关使用R语言怎么对二进制文件进行读写,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。二进制文件是一个文件,其中包含仅以位和字节形式存储的信息(0和1),它们是不可读的
2023-06-08

使用R语言怎么对CSV文件进行读写

这期内容当中小编将会给大家带来有关使用R语言怎么对CSV文件进行读写,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在R中,我们可以从存储在R环境外部的文件读取数据,还可以将数据写入由操作系统存储和访问的文
2023-06-08

Linux下如何使用Octave对文件进行读写操作

小编给大家分享一下Linux下如何使用Octave对文件进行读写操作,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Octave 是一个 Linux 上类似于 Ma
2023-06-27

聊聊如何利用纯C语言对EXCEL进行读写操作

如何利用纯C语言对EXCEL进行读写操作?下面本篇文章给大家介绍一下通过纯C语言进行EXCEL读写操作的方法,希望对大家有所帮助!在之前需要使用C语言读取Excel文件内容的功能,查阅了很多资料,大部分是通过ODBC或者过OLE/COM对Excel表格的读取操作,这变要求在工程中添加类,如CApplicaton及其头文件等,这包括Excel接口、导入类、头文件等。操作十分复杂,当然我也对这种方法进行
2022-07-07

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录