public class NPOIHelper{/// <summary>/// 输出模板docx文档/// </summary>/// <param name="tempFilePath">模板文件地址</param>/// <param name="outFolder">输出文件夹</param >/// <param name="fileName">文件名</param>public static void CreateWord(string tempFilePath, string outFolder, string fileName, DataDto data){List<DataTable> dt = data.DataTables;using (FileStream stream = File.OpenRead(tempFilePath)){XWPFDocument doc = new XWPFDocument(stream);//遍历段落                  foreach (var para in doc.Paragraphs){ReplaceKey(para, data.ParagraphsModel);} //遍历表格      var tables = doc.Tables;foreach (var table in tables){foreach (var row in table.Rows){foreach (var cell in row.GetTableCells()){foreach (var para in cell.Paragraphs){ReplaceKey(para, data.ParagraphsModel);}}}}// DataView dvResult = dt4.DefaultView;#region 表格int iTable = 0; //第几张表//1.循环Word文档中的表格foreach (XWPFTable table in doc.Tables){if (dt.Count > iTable){//重点新增行CT_Row ctrow = table.GetRow(1).GetCTRow();table.RemoveRow(table.Rows.IndexOf(table.GetRow(1))); //先移除模板行int newRowCnt = dt[iTable].Rows.Count;for (int j = 0; j < newRowCnt; j++){CT_Row targetRow = new CT_Row();//复制cell结构foreach (CT_Tc item in ctrow.Items){CT_Tc addTc = targetRow.AddNewTc();addTc.tcPr = item.tcPr;//cell样式,只包括列宽和cell对齐方式IList<CT_P> list_p = item.GetPList();foreach (var p in list_p){CT_P addP = addTc.AddNewP();addP.pPr = p.pPr;//段落样式IList<CT_R> list_r = p.GetRList();foreach (CT_R r in list_r){CT_R addR = addP.AddNewR();addR.rPr = r.rPr;//run样式 包括字体等List<CT_Text> list_text = r.GetTList();foreach (CT_Text text in list_text){CT_Text addText = addR.AddNewT();addText.space = text.space;addText.Value = text.Value;}}}}//增加数据行XWPFTableRow mrow = new XWPFTableRow(targetRow, table);table.AddRow(mrow);}int iRow = 1;bool flag = true;foreach (XWPFTableRow row in table.Rows){if (flag){flag = false;continue;}//var iRow = table.Rows.IndexOf(row); //表中行的循环索引if (iRow > 0){//3.循环没行中的列foreach (XWPFTableCell cell in row.GetTableCells()){var iCell = row.GetTableCells().IndexOf(cell); //表中列的循环索引//4.进行单元格中内容的获取操作//4.1获取单元格中所有的XWPFParagraph(单元格中每行数据都是一个XWPFParagraph对象)IList<XWPFParagraph> listXWPFParagraph = cell.Paragraphs;//第一个XWPFParagraphXWPFParagraph xwpfPCource = listXWPFParagraph[0];if (xwpfPCource != null){//获取现有的Run集合IList<XWPFRun> listRun = xwpfPCource.Runs;//循环移除while (listRun.Count > 0){xwpfPCource.RemoveRun(0);}//添加获取的数据XWPFRun xwpgRScience = xwpfPCource.CreateRun();xwpgRScience.FontFamily = "宋体";xwpgRScience.SetText(dt[iTable].Rows[iRow - 1][iCell].ToString());xwpgRScience.FontSize = 12;xwpfPCource.AddRun(xwpgRScience);}else{cell.RemoveParagraph(1);}}iRow++;}}}iTable++;}if (!Directory.Exists(outFolder)){Directory.CreateDirectory(outFolder);}var fullPath = Path.Combine(outFolder, fileName);FileStream outFile = new FileStream(fullPath, FileMode.Create);doc.Write(outFile);outFile.Close();#endregion}}/// <summary>/// 遍历替换段落位置字符/// </summary>/// <param name="para">段落参数</param>/// <param name="model">数据</param>private static void ReplaceKey(XWPFParagraph para, object model){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();Type t = model.GetType();PropertyInfo[] pi = t.GetProperties();foreach (PropertyInfo p in pi){//$$与模板中$$对应,也可以改成其它符号,比如{$name},务必做到唯一if (text.Contains("{$" + p.Name + "}")){//<br/>换行if (p.GetValue(model, null).ToString().Contains("<br/>")){string[] strs = Regex.Split(p.GetValue(model, null).ToString(), "<br/>", RegexOptions.IgnoreCase);runs[i].SetText(strs[0], 0);for(int j=1;j<strs.Length-1; j++){run.AddCarriageReturn();runs[i].AppendText(strs[j]);}}else{text = text.Replace("{$" + p.Name + "}", p.GetValue(model, null)?.ToString());runs[i].SetText(text, 0);}}}}}}

参考文章
https://www.cnblogs.com/nora/p/13229176.html
https://www.cnblogs.com/fger/p/11187954.html
https://www.cnblogs.com/masonblog/p/7097483.html
https://www.cnblogs.com/chy386/p/12837773.html

NPOI给word中的表格table动态添加行,并保留表格样式 , 替换文字时文字中包含<br/>换行相关推荐

  1. element 表格table纵横双列表头 斜线样式处理和多级表头循环

    element 表格table纵横双列表头 斜线样式处理和多级表头循环 <!DOCTYPE html> <html> <head><meta charset= ...

  2. JS实现表格Table动态添加删除行

    1.页面内容 <table style="border:1px ; width:100%; height:160px"> <THEAD> <TR> ...

  3. latex如何清除表格table的浮动位置(表格自动上移)

    一开始,我发现我的表格自动上移,如下: \documentclass{article}\begin{document} hello \begin{table}\centering\begin{tabu ...

  4. layui的表格可以动态添加行吗_答疑分享052:插入表格,数据分析更方便

    置顶公众号"Office成长课堂" 和优秀的人一起成长,才能让自己更优秀 职场办公Office问题,答疑分享 案例: 上一期分享了 答疑分享049:简单IF函数做费用预算实际数据分 ...

  5. android中改变label字体颜色,IOS开发-UILabel自定义样式--同一个Label中不同颜色、字体...

    有时会遇到同一个Label需要包含不同颜色.字体的内容的需求,方法如下 NSMutableAttributedString*sizeStr = [[NSMutableAttributedStringa ...

  6. NPOI在Word中的简单用法汇总

    欢迎您成为我的读者,希望这篇文章能给你一些帮助. 前言 今天这篇文章,咱们来看看使用NPOI操作Word都有哪些方法. 软谋的.NET全套架构视频,大多视频包含源码,录制时间(初中级是2019~202 ...

  7. [原创]FineUI秘密花园(二十一) — 表格之动态创建列

    有时我们需要根据数据来动态创建表格列,怎么来做到这一点呢?本章会详细讲解. 动态创建的列 还是通过一个示例来看下如何在FineUI中动态创建表格列,示例的界面截图: 先来看下ASPX的标签定义: 1: ...

  8. Ajax实现在textbox中输入内容,动态从数据库中模糊查询显示到下拉框中

    功能:在textbox中输入内容,动态从数据库模糊查询显示到下拉框中,以供选择 1.建立一aspx页面,html代码 <HTML>     <HEAD>         < ...

  9. HTML:表格table

    表格: table属性:1) border: 设置表格和单元格的边框, 值为整数, 默认02) cellspacing: 设置单元格之间的间距, 默认23) cellpadding: 设置单元格的内边 ...

最新文章

  1. Java 定时任务调度工具 Quartz(Part 2)
  2. c语言程序设计的反思,C语言程序设计教学反思.doc
  3. 获取选中的radio
  4. theme vscode 护眼_VS code 豆沙绿护眼主题
  5. 减法公式运算法则_人教版数学七年级上册1.3.2有理数的减法视频讲解+知识点+同步练习...
  6. 计算机里多媒体的名词解释,多媒体技术中的常见名词解释 众德伟业
  7. 我这么讲线索二叉树,我三岁大的表弟笑了笑
  8. 唯品会在 Flink 容器化与平台化上的建设实践
  9. Zend Guard 7 , Zend Guard Loader处理PHP加密
  10. 视觉错觉模型_极具视觉爆发力的影院设计
  11. 【优化算法】多策略协同多目标萤火虫算法(MOFA_MOCS)【含Matlab源码 1512期】
  12. 【2017-7-17】动软代码生成器 数据库连接 配置失败 解决方法
  13. c语言 验证码怎么写,JS验证码实现代码
  14. 实现了一个跨平台的 YUV 文件图片查看器
  15. win10好用的小软件(小插件)
  16. linux tar文件如何压缩文件,在 Linux 上压缩文件的 5 种方法
  17. 自定义一个Chrome翻译插件
  18. 前后端分离 Spring Boot + Vue 开发网易云、QQ音乐(附源码)!
  19. 磁盘最优存储问题---Python
  20. Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection

热门文章

  1. 大整数乘法(递归+分治法)
  2. 经典Bug永流传---每周一“虫”(十五)
  3. 马赛克还原神器—Depix,真的有那么神吗?
  4. 仿百度搜索显示下拉框(一)
  5. linux u盘新建文件夹加密,linux磁盘的加密保护以及u盘加密的方法
  6. 如何开展企业数据资产评估
  7. 结构体的浅拷贝与深拷贝
  8. ng-Bootstrap之Datepicker使用
  9. 不止中台:全面的架构演进趋势和方法
  10. 网络访问计算机无法访问,工作组计算机无法访问,教您无法访问工作组计算机怎么办...