using IRaCIS.Core.Application.Helper; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using NPOI.OpenXmlFormats.Wordprocessing; using NPOI.XWPF.UserModel; using System.Collections; using System.Reflection; namespace IRaCIS.Core.Application.Service; public static class NpoiWordHelper { public static async Task TemplateExportWordAsync(string code, object data, IRepository? _commonDocumentRepository, IWebHostEnvironment _hostEnvironment) { //var (physicalPath, fileNmae) = await FileStoreHelper.GetCommonDocPhysicalFilePathAsync(_hostEnvironment, _commonDocumentRepository, code); var physicalPath = code; using (FileStream stream = File.OpenRead(physicalPath)) { XWPFDocument doc = new XWPFDocument(stream); //遍历段落 foreach (var para in doc.Paragraphs) { ReplaceKey(para, data); } //遍历表格 var tables = doc.Tables; foreach (var table in tables) { //ReplaceTableKey(table, data, "Data"); } foreach (var table in tables) { foreach (var row in table.Rows) { foreach (var cell in row.GetTableCells()) { foreach (var para in cell.Paragraphs) { ReplaceKey(para, data); } } } } FileStream out1 = new FileStream("table.docx", FileMode.Create); doc.Write(out1); out1.Close(); return new FileStreamResult(stream, "application/msword") { FileDownloadName = $"replaced_{DateTime.Now.ToString("yyyyMMddHHmmss")}.docx" }; } } private static void ReplaceKey(XWPFParagraph para, object model) { string text = para.ParagraphText; Type t = model.GetType(); PropertyInfo[] pi = t.GetProperties(); foreach (PropertyInfo p in pi) { //$$与模板中$$对应,也可以改成其它符号,比如{$name},务必做到唯一 if (text.Contains("$" + p.Name + "$")) { text = text.Replace("$" + p.Name + "$", p.GetValue(model)?.ToString()); } } //var runs = para.Runs; //string styleid = para.Style; //for (int i = 0; i < runs.Count; i++) //{ // var run = runs[i]; // text = run.ToString(); // Type t = model.GetType(); // PropertyInfo[] pi = t.GetProperties(); // foreach (PropertyInfo p in pi) // { // //$$与模板中$$对应,也可以改成其它符号,比如{$name},务必做到唯一 // if (text.Contains("$" + p.Name + "$")) // { // text = text.Replace("$" + p.Name + "$", p.GetValue(model)?.ToString()); // } // } // runs[i].SetText(text, 0); //} } /// /// 替换表格Key /// /// /// /// private static void ReplaceTableKey(XWPFTable table, IList list, String field) { List paras = new List(); // 获取最后一行数据,最后一行设置值 Int32 iLastRowIndex = 0; for (int iIndex = 0; iIndex < table.Rows.Count; iIndex++) { if (iIndex == table.Rows.Count - 1) { iLastRowIndex = iIndex; foreach (var cell in table.Rows[iIndex].GetTableCells()) { foreach (var para in cell.Paragraphs) { paras.Add(para); } } } } // 删除最后一行 table.RemoveRow(iLastRowIndex); for (int iIndex = 0; iIndex < list.Count; iIndex++) { object data = list[iIndex]; Type t = data.GetType(); PropertyInfo[] pi = t.GetProperties(); // 表增加行 XWPFTableRow m_row = table.CreateRow(); CT_Row m_NewRow = new CT_Row(); String text = String.Empty; Int32 jIndex = 0; paras.ForEach(para => { text = para.ParagraphText; foreach (PropertyInfo p in pi) { if (text.Contains("$" + field + "." + p.Name + "$")) { m_row.GetCell(jIndex).SetText(p.GetValue(data, null).ToString()); } } jIndex++; }); m_row = new XWPFTableRow(m_NewRow, table); table.AddRow(m_row); } } }