背景

在工作中需要对比数据,然后输出一份world文档的对比报告。这需要用C#来读写world文件。

用到的工具

NPOI

NPOI 地址:NPOI

NPOI版本:2.6.0

个人项目的运行时版本:.NET Core 3.1

解决思路:

既然是要输出一份报告,那么报告的格式是固定的,只需要将报告需要改变的内容进行特殊标记,然后用具体的值替换掉即可

报告部分内容如下:

计算成功successCount,成功率successRate%

这里的successCount 和 successRate 就是要改变的值

接下来的代码如下

  1. public class BuildReport
  2. {
  3. private string savePath;
  4. public BuildReport()
  5. {
  6. if (!Directory.Exists("Report"))
  7. {
  8. Directory.CreateDirectory("Report");
  9. }
  10. savePath = Path.Combine(Directory.GetCurrentDirectory(), "Report");
  11. }
  12. public bool Build(string templatePath, Dictionary<string, string> replaceContent)
  13. {
  14. string buildedPath = $"{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}.docx";
  15. string filePath = Path.Combine(savePath, buildedPath);
  16. if (replaceContent.Keys.Count == 0)
  17. {
  18. return false;
  19. }
  20. if (string.IsNullOrEmpty(templatePath) || string.IsNullOrEmpty(filePath))
  21. {
  22. return false;
  23. }
  24. try
  25. {
  26. //读取Word文件,并在此基础上操作
  27. FileStream template = new FileStream(templatePath, FileMode.Open);
  28. //根据提供的文件,创建一个Word文档对象
  29. XWPFDocument doc = new XWPFDocument(template);
  30. //获取Word文档的所有段落对象
  31. IList<XWPFParagraph> paragraphs = doc.Paragraphs;
  32. //处理替换
  33. HandleContent(replaceContent, paragraphs);
  34. IList<XWPFTable> tables = doc.Tables;
  35. int i = 1;
  36. int rowCurrent = 1;
  37. //获取world文档中的表格
  38. foreach (var item in tables)
  39. {
  40. //表格行
  41. // Console.WriteLine($"**********************第{i}个表************************");
  42. List<XWPFTableRow> rows = item.Rows;
  43. foreach (var row in rows)
  44. {
  45. // Console.WriteLine($"---------------第{rowCurrent}行--------------");
  46. List<XWPFTableCell> xWPFTableCells = row.GetTableCells();//表格单元格
  47. foreach (var cell in xWPFTableCells)
  48. {
  49. //单元格
  50. IList<XWPFParagraph> paragraphs1 = cell.Paragraphs;//单元格中的段落
  51. HandleContent(replaceContent, paragraphs1);
  52. }
  53. rowCurrent++;
  54. }
  55. ++i;
  56. }
  57. var newFile = File.Create(filePath);
  58. doc.Write(newFile);
  59. newFile.Close();
  60. template.Close();
  61. doc.Close();
  62. }
  63. catch (Exception ex)
  64. {
  65. throw;
  66. }
  67. return false;
  68. }
  69. /// <summary>
  70. /// 处理要替换的值
  71. /// </summary>
  72. /// <param name="replaceContent">要替换的占位符及其值</param>
  73. /// <param name="paragraphs">文档段落</param>
  74. private void HandleContent(Dictionary<string, string> replaceContent, IList<XWPFParagraph> paragraphs)
  75. {
  76. foreach (var item in paragraphs)
  77. {
  78. foreach (var key in replaceContent.Keys)
  79. {
  80. if (!item.ParagraphText.Contains(key))
  81. {
  82. continue;
  83. }
  84. item.ReplaceText(key, replaceContent[key]);
  85. }
  86. }
  87. }
  88. }

程序调用如下

  1. Dictionary<string, string> dic = new Dictionary<string, string>();
  2. dic.Add("successRate", "100");
  3. dic.Add("successCount", "10000");
  4. BuildReport build = new BuildReport();
  5. build.Build("template.docx", dic);

CSharp读写world文档数据的更多相关文章

  1. C#操作Xml:通过XmlDocument读写Xml文档

    什么是Xml? Xml是扩展标记语言的简写,是一种开发的文本格式.关于它的更多情况可以通过w3组织了解http://www.w3.org/TR/1998/REC-xml-19980210.如果你不知道 ...

  2. 资源下载南方cass视频教程,包括文档,数据,很全的

    废话就不多说了,开始... 北方cass视频教程,包括文档,数据,很全的 视频下载地址:http://www.400gb.com/file/23459263 GIS网盘进入下载:http://laoh ...

  3. elasticsearch查询篇索引映射文档数据准备

    elasticsearch查询篇索引映射文档数据准备 我们后面要讲elasticsearch查询,先来准备下索引,映射以及文档: 我们先用Head插件建立索引film,然后建立映射 POST http ...

  4. dom4j读写XML文档

    dom4j 最常用最简单的用法(转) 要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在 http://www.dom4j.org/目前最新dom4j包下载地址:http:/ ...

  5. python+selenium自动化软件测试(第12章):Python读写XML文档

    XML 即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进 行定义的源语言.xml 有如下特征: 首先,它是有标签对组成:<aa></aa> ...

  6. Docx组件读写Word文档介绍

    Docx介绍 官方原文:DocX is a .NET library that allows developers to manipulate Word 2007/2010/2013 files, i ...

  7. 通过XmlDocument读写Xml文档参考地址

    /// <summary> /// 获取一个报表的参数 http://blog.csdn.net/hdhai9451/article/details/12170069 /// </s ...

  8. [转载]java读写word文档,完美解决方案

    做项目的过程中,经常需要把数据里里的数据读出来,经过加工,以word格式输出. 在网上找了很多解决方案都不太理想,偶尔发现了PageOffice,一个国产的Office插件,开发调用非常简单!比网上介 ...

  9. Xml文档数据提取到Excel表中

    近期,财务一位同事,吐槽:<某XX开票软件>导出数据文档只有Xml格式,竟然没有Excel文档,工作起来非常不方便,希望我想想办法.上图: 需求分析:Xml数据----> 提取到Da ...

  10. [原创]java读写word文档,完美解决方案

    做项目的过程中,经常需要把数据里里的数据读出来,经过加工,以word格式输出. 在网上找了很多解决方案都不太理想,偶尔发现了PageOffice,一个国产的Office插件,开发调用非常简单!比网上介 ...

随机推荐

  1. Object.assign合并多个对象

    语法: Object.assign(target, ...sources) target, 目标对象 sources, 源对象 assign函数用来合并多个对象. 该方法会修改第一个对象,函数在最后r ...

  2. MAMP redis.conf 位置 , nginx.conf位置

    /Applications/MAMP PRO.app/Contents/Resources/redis.conf /Applications/MAMP/conf/nginx/nginx.conf /A ...

  3. API 细节及二级联动

    图片上传   T是占位符    where是条件,T是泛型,class是类,类是引用类型,就是给T设置了一个约束 一个表一个dal文件(在工作的时候就是这样)      [RoutePrefix(&q ...

  4. mysql设置表名不区分大小写

    1.root登录,修改/etc/my.cnf2.在mysqld下加入:lower_case_table_names=13.重新数据库

  5. c语言实现单链表的倒叙

    bool upsidedown_list(LinkList L) { Lnode *head, *tmp, *oldhead; head = L; tmp = L->next; oldhead ...

  6. javaScript的介绍

    JavaScript Java Script的概述: 1组成 三部分组成 ecmaScript 基础语法(es5) dom document object 莫得了 文档对象模型 (操作html文档内容 ...

  7. 【编程】Python3 正则表达式使用笔记

    前言 Python 从1.5版本开始使用re模块来处理正则表达式.我们可以使用"re模块"或"re.compile方法"来创建正则表达式对象(re.RegexO ...

  8. MYSQL面试题大汇总

    1.数据库的三大范式是什么 1)列不可再分 2)行可以唯一区分 3)表的非主属性不可以依赖与其他表的非主属性,外键约束 2.数据库中的事务 1)什么是事务:多条sql语句,要么都成功,要么都失败 2) ...

  9. Java (新)将Excel数据读取到ListMap

    Java (新)将Excel数据读取到ListMap Maven依赖: pom.xml <!-- excel --> <dependency> <groupId>o ...

  10. Qt滚动条样式

    Qt手动设置滚动条的qss样式 QScrollBar:vertical { width: 14px; margin: 16px 0 16px 0; background: #eaeaea; } QSc ...