|
背景
在工作中需要对比数据,然后输出一份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/archive/2023/03/22/17244702.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
|