CSharp读写world文档数据
背景
在工作中需要对比数据,然后输出一份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文档数据的更多相关文章
- C#操作Xml:通过XmlDocument读写Xml文档
什么是Xml? Xml是扩展标记语言的简写,是一种开发的文本格式.关于它的更多情况可以通过w3组织了解http://www.w3.org/TR/1998/REC-xml-19980210.如果你不知道 ...
- 资源下载南方cass视频教程,包括文档,数据,很全的
废话就不多说了,开始... 北方cass视频教程,包括文档,数据,很全的 视频下载地址:http://www.400gb.com/file/23459263 GIS网盘进入下载:http://laoh ...
- elasticsearch查询篇索引映射文档数据准备
elasticsearch查询篇索引映射文档数据准备 我们后面要讲elasticsearch查询,先来准备下索引,映射以及文档: 我们先用Head插件建立索引film,然后建立映射 POST http ...
- dom4j读写XML文档
dom4j 最常用最简单的用法(转) 要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在 http://www.dom4j.org/目前最新dom4j包下载地址:http:/ ...
- python+selenium自动化软件测试(第12章):Python读写XML文档
XML 即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进 行定义的源语言.xml 有如下特征: 首先,它是有标签对组成:<aa></aa> ...
- Docx组件读写Word文档介绍
Docx介绍 官方原文:DocX is a .NET library that allows developers to manipulate Word 2007/2010/2013 files, i ...
- 通过XmlDocument读写Xml文档参考地址
/// <summary> /// 获取一个报表的参数 http://blog.csdn.net/hdhai9451/article/details/12170069 /// </s ...
- [转载]java读写word文档,完美解决方案
做项目的过程中,经常需要把数据里里的数据读出来,经过加工,以word格式输出. 在网上找了很多解决方案都不太理想,偶尔发现了PageOffice,一个国产的Office插件,开发调用非常简单!比网上介 ...
- Xml文档数据提取到Excel表中
近期,财务一位同事,吐槽:<某XX开票软件>导出数据文档只有Xml格式,竟然没有Excel文档,工作起来非常不方便,希望我想想办法.上图: 需求分析:Xml数据----> 提取到Da ...
- [原创]java读写word文档,完美解决方案
做项目的过程中,经常需要把数据里里的数据读出来,经过加工,以word格式输出. 在网上找了很多解决方案都不太理想,偶尔发现了PageOffice,一个国产的Office插件,开发调用非常简单!比网上介 ...
随机推荐
- http和https有什么区别?网站有没有必要启用https
最近在浏览文章的时候发现,很多站长都在纠结网站到底要不要做https的问题.作为个人站长,也一直关注着这块.最近查阅了很多资料,对https也有了更进一步的认识,这里对https的有关问题做了一个总结 ...
- 基础vue的一些知识补充
一.:disabled 该属性能接受布尔值,可以用于元素的使用.当值为true时,该元素将无法被使用,如button的disabled属性被设置为true后,将无法被点击,input的disabled ...
- vue中关于get传参数为数组的解决方法
按理来说,get请求方式是没有数组的,get请求方式带参数都是字符串,需要和后端协商是用某个标识符分割开,例如"|" ",". 当然如果需要数组的话,也能解 ...
- puts()与scanf(“%s”)
使用gets()即使字符串中含有空格,依然可以接收,而scanf()不会. Example: /* 输入一个字符串到字符数组s1中,将s1中的字符串复制到字符数组s2中并输出s2中的字符串. 不用st ...
- C语言中的循环
1我觉得循环就是程序一直重复的执行一些语句,直到当符合条件时停止.循环总体分为while循环,do while循环和for循环. 2while循环和do while循环的区别:while是先判定是否符 ...
- EF调用sql语句
1.连接数据库 2.在Dal进行调用sql语句 public List<UserInfo> PageShow(out int totalcount,out int totalpage, s ...
- 为什么reids是单线程
我们首先要明白,reids很快,官方表示,因为reids是基于内存的操作,cpu不是reids的瓶颈,redis的瓶颈有可能是机器内存的大小或者网络带宽,既然单线程容易控制,而且cpu不会成为瓶颈,所 ...
- mysql可参考的查询
获取批量修改列为大写SQL脚本 1 SELECT 2 concat( 'alter table ', TABLE_NAME, ' change column ', COLUMN_NAME, ' ', ...
- NOIP2013普及组
T1]记数问题 试计算在区间1 到n 的所有整数中,数字x(0 ≤ x ≤ 9)共出现了多少次?例如,在1到11 中,即在1.2.3.4.5.6.7.8.9.10.11中,数字1 出现了4 次. 其实 ...
- C++语法难点
virtual 实现类的多态性:基类定义虚函数,子类可以重写该函数:如果使用了virtual关键字,程序将根据引用或指针指向的 对象类型 来选择方法,否则使用引用类型或指针类型来选择方法 实现虚继承, ...