C#使用NPOI对word进行读写

目录
  • 一、简介
    • 操作Word的类库:
  • 二、简单使用
    • 1、XWPFDocument类的实例化
    • 2、设置页面的大小
    • 3、段落处理
    • 4、表格处理
    • 5、页眉页脚处理
  • 三、综合示例
  • 四、参考

一、简介

操作Word的类库:

二、简单使用

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进行读写的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#使用NPOI设置Excel下拉选项

    本文实例为大家分享了C#使用NPOI设置Excel下拉选项的具体代码,供大家参考,具体内容如下 最近在做一个导出模板的功能,需要限制用户的某些单元格输入的内容. 期望达到的效果:单元格中出现下拉选择,或输入错误时提示. 翻阅了许多资料,终于得到了答案. 然后自己整理下边一些方法,记录下来方便以后使用. 第一种 · 直接设置下拉值,不超过255个字符(优点:逻辑简单 :缺点:有字符限制) · 适用于下拉值为固定值,例如:状态.性别等 方法块: public static void SetCellD

  • C#使用NPOI读取excel转为DataSet

    本文实例为大家分享了C#使用NPOI读取excel转为DataSet的具体代码,供大家参考,具体内容如下 NPOI读取excel转为DataSet /// <summary> /// 读取Execl数据到DataTable(DataSet)中 /// </summary> /// <param name="filePath">指定Execl文件路径</param> /// <param name="isFirstLineC

  • C#使用NPOI库读写Excel文件

    本文实例为大家分享了C#使用NPOI库读写Excel文件的具体代码,供大家参考,具体内容如下 第一步添加程引用 : 右键项目工程 — 管理 NuGet程序包 — 搜索 NOPI — 安装 对文件Excel进行操作 读取excel文件 private IWorkbook wk;   private FileStream fs;  private void OpenExcel(string path)         {             StringBuilder sbr = new Str

  • C#用NPOI导出导入Excel帮助类

    本文实例为大家分享了C#用NPOI导出导入Excel帮助类的具体代码,供大家参考,具体内容如下 1.准备工作 在管理NuGet程序包中搜索 NPOI,安装 NPOI 到要项目中. 2.帮助类 /// <summary> /// DataTable写入Excel /// </summary> /// <param name="dt"></param> /// <param name="strExcelFileName&quo

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

    目录 一.概述 1.操作Excel的类库: 2.引用DLL 程序集构成 二.通过NPOI,将Excel文件导到数据表DataTable 四.常见用法: 1.查找 2.插入图片 五.填充Excel模板 六.DataTable导出到Excel文件 1.直接导出到Excel: 2.将DataTable导出到Excel:先导出到MemoryStream 3.应用 1.Web导出 2.Winform导出 一.概述 NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WO

  • C#使用NPOI实现Excel导入导出功能

    本文实例为大家分享了C#使用NPOI实现Excel导入导出的具体代码,供大家参考,具体内容如下 Excel导入 使用OpenFileDiolog控件和button结合,选择文件导入,将路径显示在文本框 设置按钮点击事件,将文件路径赋给textBox.Text private void Department_SUM_Click(object sender, EventArgs e)         {             OpenFileDialog open = new OpenFileDi

  • C#通过NPOI导入导出数据EXCEL

    本文实例为大家分享了C#通过NPOI导入导出数据EXCEL的具体代码,供大家参考,具体内容如下 其实从数据库到服务器导入导出有很多方法,但是比较简单的有NPOI这个方法 准备工作,先增加到相应的lib,同时引用相关的dll 第一从数据库导出数据到Excel里面 首先我设置一个win窗体 第二步写代码 private void button1_Click(object sender, EventArgs e)         {             //查询数据,显示到表格上        

  • C#使用NPOI导出Excel类封装

    ** NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作. NPOI是一个开源的C#读写Excel.WORD等微软OLE2组件文档的项目.** 以下代码主要分3部分:通过实体类的自定义特性导出Excel文件 1.封装类:ExcelHelper2.实体类:StudentModel3.调用:Form1 ExcelHelper  /// <summary> /// Excel操作类 /// </summary&g

  • C#使用NPOI对word进行读写

    目录 一.简介 操作Word的类库: 二.简单使用 1.XWPFDocument类的实例化 2.设置页面的大小 3.段落处理 4.表格处理 5.页眉页脚处理 三.综合示例 四.参考 一.简介 操作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:

  • Python实现Word的读写改操作

    目录 用 docx 模块读取 Word Word 调整样式 Word 写入操作 用 docx 模块读取 Word docx 安装 cmd 中输入pip install python-docx 即可安装 docx 模块 docx 常用函数 创建空白文档 from docx import Document document = Document() document.save("word.docx") # 生成空白 word print(document) 读取文档 from docx i

  • C#将Word转换成PDF方法汇总(基于Office和WPS)

    有时候,我们需要在线上预览word文档,当然我们可以用NPOI抽出Word中的文字和表格,然后显示到网页上面,但是这样会丢失掉Word中原有的格式和图片.一个比较好的办法就是将word转换成pdf,然后让客户预览,下面来看一下基于Office和WPS的两种解决方案. 一.基于Office的解决方案 正如标题所说,基于Office就是要求服务器上面要安装的有Office.我们通过C#代码来调用COM接口,实现将Word转换成PDF.下面来看一下具体实现,首先引用Microsoft.Office.I

  • C#的Excel导入、导出

    本篇主要介绍C#的Excel导入.导出,供大家参考,具体内容如下 一. 介绍 1.1 第三方类库:NPOI 说明:NPOI是POI项目的.NET 版本,可用于Excel.Word的读写操作. 优点:不用装Office环境. 下载地址:http://npoi.codeplex.com/releases 1.2 Excel结构介绍 工作簿(Workbook):每个Excel文件可理解为一个工作簿. 工作表(Sheet):一个工作簿(Workbook)可以包含多个工作表. 行(row):一个工作表(S

  • Python办公自动化解决world文件批量转换

    目录 python-docx 库简介 读取 Word 写入 Word Word 转 pdf 最后的话 只要是简单重复的工作,就想办法用 Python 来帮你解决吧,人生苦短,你需要 Python. Word 是办公软件中使用频率非常高的软件之一了,假如你需要调整 100 个 Word 文档的格式保持统一,或者要把 100 个 Word 全部转换为 pdf,那么你就需要 Python 来帮忙了. python-docx 库简介 python-docx 是一个可以对 Word 进行读写操作的第三方库

  • java Apache poi 对word doc文件进行读写操作

    使用POI读写Word doc文件 Apache poi的hwpf模块是专门用来对word doc文件进行读写操作的.在hwpf里面我们使用HWPFDocument来表示一个word doc文档.在HWPFDocument里面有这么几个概念: Range:它表示一个范围,这个范围可以是整个文档,也可以是里面的某一小节(Section),也可以是某一个段落(Paragraph),还可以是拥有共同属性的一段文本(CharacterRun).   Section:word文档的一个小节,一个word文

  • Python使用python-docx读写word文档

    python-docx库可用于创建和编辑Microsoft Word(.docx)文件. 官方文档:链接地址 备注: doc是微软的专有的文件格式,docx是Microsoft Office2007之后版本使用,其基于Office Open XML标准的压缩文件格式,比 doc文件所占用空间更小.docx格式的文件本质上是一个ZIP文件,所以其实也可以把.docx文件直接改成.zip,解压后,里面的 word/document.xml包含了Word文档的大部分内容,图片文件则保存在word/me

  • 使用Npoi操作excel的解决办法

    Npoi 简介-------------------------------------------------------------------------------- 1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet:行:Row:单元格Cell. 2.Npoi 下载地址:http://npoi.codeplex.com/releases/view/38113 4.忘了告诉大家npoi是做什么的了,npoi 能够读写几乎所有的Office 97

  • .NET读写Excel工具Spire.Xls使用入门教程(1)

    在.NET平台,操作Excel文件是一个非常常用的需求,目前比较常规的方法有以下几种: 1.Office Com组件的方式:这个方式非常累人,微软的东西总是这么的复杂,使用起来可能非常不便,需要安装Excel,对于服务器,有时候还需要为配置IIS权限.折腾人,看到很多人在群里面使用这个东西,出现各种抓狂的错误: 这里特别感谢:PowerShell免费软件 的回复,用用powershell + excel 2007的方式,他很好的解决问题.其实我想说的是,Office既然提供了对com组件的支持,

随机推荐