翼度科技»论坛 编程开发 .net 查看内容

CSharp读写word文档数据

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
背景

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

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);
复制代码
来源:https://www.cnblogs.com/SYF--BLOG/archive/2023/03/22/17244702.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具