CSharp读写word文档数据

背景

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

用到的工具

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);
作者:沈先生爱猫咪原文地址:https://www.cnblogs.com/SYF--BLOG/p/17244702.html

%s 个评论

要回复文章请先登录注册