iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >C#如何使用NPOI对word进行读写
  • 111
分享到

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

2023-07-02 06:07:58 111人浏览 八月长安
摘要

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

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

    一、简介

    操作Word的类库:

    • NPOI: V2.5.1 

    • DocX(属于Xceed Words for .net的免费版本)

    • 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 srcpr = new CT_SectPr();//设置A4纸纵向,如果要横向,两个值调换即可srcpr.pgSz.w = (ulong)11906;srcpr.pgSz.h = (ulong)16838;XWPFDocument doc = new XWPFDocument();doc.Document.body.sectPr = 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进行读写

    关于“C#如何使用NPOI对word进行读写”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C#如何使用NPOI对word进行读写”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

    --结束END--

    本文标题: C#如何使用NPOI对word进行读写

    本文链接: https://www.lsjlt.com/news/340021.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

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

    下载Word文档
    猜你喜欢
    • C#如何使用NPOI对word进行读写
      这篇文章主要介绍了C#如何使用NPOI对word进行读写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#如何使用NPOI对word进行读写文章都会有所收获,下面我们一起来看看吧。一、简介操作Word的类库:N...
      99+
      2023-07-02
    • C#使用NPOI对word进行读写
      目录一、简介操作Word的类库:二、简单使用1、XWPFDocument类的实例化2、设置页面的大小3、段落处理4、表格处理5、页眉页脚处理三、综合示例四、参考一、简介 操作Word...
      99+
      2024-04-02
    • C#使用NPOI库读写Excel文件
      本文实例为大家分享了C#使用NPOI库读写Excel文件的具体代码,供大家参考,具体内容如下 第一步添加程引用: 右键项目工程 — 管理 NuGet程序包 —...
      99+
      2024-04-02
    • C#如何使用NPOI对Excel数据进行导入导出
      本篇内容介绍了“C#如何使用NPOI对Excel数据进行导入导出”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、概述NPOI 是 POI ...
      99+
      2023-07-02
    • c语言如何对文件进行读写
      非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
      99+
      2024-05-22
    • C#使用NPOI对Excel数据进行导入导出
      目录一、概述1、操作Excel的类库:2、引用DLL程序集构成二、通过NPOI,将Excel文件导到数据表DataTable四、常见用法:1、查找2、插入图片五、填充Excel模板六...
      99+
      2024-04-02
    • 如何使用mybatis的typeHandler对clob进行流读写
      这篇文章主要介绍“如何使用mybatis的typeHandler对clob进行流读写”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用mybatis的typeHandler对clob进行流读写”...
      99+
      2023-06-26
    • C++ qt如何使用jsoncpp json进行读写操作
      这篇文章将为大家详细讲解有关C++ qt如何使用jsoncpp json进行读写操作,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。JsonCpp的使用项目需要c++下使用...
      99+
      2023-06-21
    • C#中怎么使用NPOI库读写Excel文件
      今天小编给大家分享一下C#中怎么使用NPOI库读写Excel文件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。第一步添加程引...
      99+
      2023-06-29
    • Linux下如何使用Octave对文件进行读写操作
      小编给大家分享一下Linux下如何使用Octave对文件进行读写操作,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Octave 是一个 Linux 上类似于 Ma...
      99+
      2023-06-27
    • c语言怎么对文件进行读写
      C语言提供了一组文件操作函数,用于打开、读、写和关闭文件。下面是一个简单的示例,演示了如何对文件进行读写。1. 打开文件:```c#...
      99+
      2023-09-27
      c语言
    • linux中如何使用Octave对音频文件进行读写操作
      这篇文章主要介绍了linux中如何使用Octave对音频文件进行读写操作,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Octave 是一个 Linux 上类似于 Matlab...
      99+
      2023-06-16
    • C#中怎么利用MemoryStream类对内存进行读写
      C#中怎么利用MemoryStream类对内存进行读写,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。读写内存-MemoryStream类MemoryStream类用于向内存...
      99+
      2023-06-17
    • 使用mybatis的typeHandler对clob进行流读写方式
      目录typeHandler对clob进行流读写第一步:编写typehandler文件第二步:在mybatis的配置文件中添加<typeHandlers>节点第三步myba...
      99+
      2024-04-02
    • 如何对C++链表进行解读分析
      如何对C++链表进行解读分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C++语言是学习数据结构的很好的学习工具,能够全面的理解了C++中C++链表的作用和用途,那么对于理解...
      99+
      2023-06-17
    • 怎么用Python对Word文件内容进行读取
      今天小编给大家分享一下怎么用Python对Word文件内容进行读取的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。利用 pyt...
      99+
      2023-06-30
    • 怎么利用纯C语言对EXCEL进行读写操作
      本文小编为大家详细介绍“怎么利用纯C语言对EXCEL进行读写操作”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么利用纯C语言对EXCEL进行读写操作”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、写操作单纯...
      99+
      2023-07-02
    • C#中怎么对ini文件进行读写操作
      本篇文章为大家展示了C#中怎么对ini文件进行读写操作,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C#读写ini文件其实并不是普通的文本文件.它有自己的结构.由若干段落(SECTION)组成,在每...
      99+
      2023-06-18
    • 使用R语言怎么对二进制文件进行读写
      这篇文章将为大家详细讲解有关使用R语言怎么对二进制文件进行读写,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。二进制文件是一个文件,其中包含仅以位和字节形式存储的信息(0和1),它们是不可读的...
      99+
      2023-06-08
    • C#中如何使用文件IO和流操作进行数据读写
      C#中如何使用文件IO和流操作进行数据读写,需要具体代码示例在C#编程中,文件IO和流操作是常用的技术,用于读取和写入文件的数据。无论是处理文本文件、二进制文件,还是读取网络流数据,我们都可以通过文件IO和流操作来实现。文件IO和流操作提供...
      99+
      2023-10-22
      C#文件IO操作 C#流操作 数据读写技术
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作