背景

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

用到的工具

NPOI

NPOI 地址:NPOI

NPOI版本:2.6.0

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

解决思路:

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

报告部分内容如下:

计算成功successCount,成功率successRate%

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

接下来的代码如下

    public class BuildReport
{
private string savePath;
public BuildReport()
{
if (!Directory.Exists("Report"))
{
Directory.CreateDirectory("Report");
}
savePath = Path.Combine(Directory.GetCurrentDirectory(), "Report"); } public bool Build(string templatePath, Dictionary<string, string> replaceContent)
{ string buildedPath = $"{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}.docx";
string filePath = Path.Combine(savePath, buildedPath);
if (replaceContent.Keys.Count == 0)
{
return false;
}
if (string.IsNullOrEmpty(templatePath) || string.IsNullOrEmpty(filePath))
{
return false;
}
try
{ //读取Word文件,并在此基础上操作
FileStream template = new FileStream(templatePath, FileMode.Open);
//根据提供的文件,创建一个Word文档对象
XWPFDocument doc = new XWPFDocument(template);
//获取Word文档的所有段落对象
IList<XWPFParagraph> paragraphs = doc.Paragraphs;
//处理替换
HandleContent(replaceContent, paragraphs);
IList<XWPFTable> tables = doc.Tables;
int i = 1;
int rowCurrent = 1; //获取world文档中的表格
foreach (var item in tables)
{
//表格行
// Console.WriteLine($"**********************第{i}个表************************");
List<XWPFTableRow> rows = item.Rows;
foreach (var row in rows)
{
// Console.WriteLine($"---------------第{rowCurrent}行--------------");
List<XWPFTableCell> xWPFTableCells = row.GetTableCells();//表格单元格
foreach (var cell in xWPFTableCells)
{
//单元格
IList<XWPFParagraph> paragraphs1 = cell.Paragraphs;//单元格中的段落
HandleContent(replaceContent, paragraphs1);
}
rowCurrent++;
}
++i;
}
var newFile = File.Create(filePath);
doc.Write(newFile);
newFile.Close();
template.Close();
doc.Close();
}
catch (Exception ex)
{
throw;
}
return false;
} /// <summary>
/// 处理要替换的值
/// </summary>
/// <param name="replaceContent">要替换的占位符及其值</param>
/// <param name="paragraphs">文档段落</param>
private void HandleContent(Dictionary<string, string> replaceContent, IList<XWPFParagraph> paragraphs)
{
foreach (var item in paragraphs)
{
foreach (var key in replaceContent.Keys)
{
if (!item.ParagraphText.Contains(key))
{
continue;
}
item.ReplaceText(key, replaceContent[key]);
}
}
}
}

程序调用如下

            Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("successRate", "100");
dic.Add("successCount", "10000");
BuildReport build = new BuildReport();
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. java 项目中Error linstenerStart 报错解决方法

    项目中经常会遇到如下报错: 严重:Error linstenerStart 这种报错,我们看不出来到底是出现了什么问题.下面我们就一步一步来解决: (1)首先进入项目的classes目录下: (2)进 ...

  2. python -m pip install --upgrade pip 解决升级不成功问题

    使用pip 提示更新: You are using pip version 18.1, however version 20.0.2 is available. You should consider ...

  3. Linux定时运行Python代码

    背景 之前定时运行py文件都是jenkins设置定时任务运行,今天想linux有没有定时运行的东西,百度一下找到了,链接:http://blog.csdn.net/netdxy/article/det ...

  4. SourceMap解析

    前端发展至今已不再是刀耕火种的年代了,出现了typescript.babel.uglify.js等功能强大的工具.我们手动撰写的代码一般具有可读性,并且可以享受高级语法.类型检查带来的便利,但经过工具 ...

  5. window.location.href 下载文件页面出现跳转 (重定向失效的问题)

    页面出现跳转的话,要去检查请求的接口是不是出现了问题. 解决方法:URL前面加 "/" ${process.env.VUE_APP_BASE_API}   /   ${url}

  6. 将Vue项目部署到Nginx中,出现的400,405,200响应空等问题处理

    最近用Vue3写了个项目,然后对接后台接口. 在本地vue配置文件中,配置了反向代理.成功请求了后端接口. 自测没有问题. 打包vue,发布到nginx中.运行nginx,成功显示了页面. 当点击页面 ...

  7. 关于JUnit

    目录 一.单元测试 二.在LAB中的常用方法 一.单元测试 什么是单元测试呢?单元测试就是针对最小的功能单元编写测试代码.Java程序最小的功能单元是方法,因此,对Java程序进行单元测试就是针对单个 ...

  8. linux 离线安装jdk

    系统版本:centos7.8 | jdk版本:1.8 jdk版本:jdk-8u5-linux-x64.rpm 点击下载 提取码: ud1r 检查系统是否已经有JDK,输入如下命令查看是否系统中是否已安 ...

  9. ASP.NET Core 读取配置文件信息

    一:读取配置文件 先来看一下appsettings.json文件的内容,如下图: { "ConnectionStrings": { "ServerConnection&q ...

  10. 多级路由,重定向之后,刷新页面报错问题:报错Unexpected token '<'

    使用脚手架:vue-cli3.0vue版本:vue3.0vue-router版本:vue-router4.0 配置多级路由,首次访问,到重定向页面没有问题,然后在当前页面刷新控制台报错:Unexpec ...