asp.net core 用NPOI放word中写入数据
第一步:引入NPOI程序包
第二步:准备好要插入数据的word模板
第三步:读取数据写入word中,注意对象名和word中的名一致,而且word中的名不能重复,否则写入不上,代码不用考虑word排版样式的问题
1 using Microsoft.AspNetCore.Hosting; 2 using Microsoft.AspNetCore.Mvc; 3 using Microsoft.Extensions.Logging; 4 using NPOI.XWPF.UserModel; 5 using Sswl.Interfaces.IService; 6 using Sswl.Model; 7 using SswlSub.Controllers.Basic; 8 using SswlSub.Extensions; 9 using Swashbuckle.AspNetCore.Annotations; 10 using System; 11 using System.IO; 12 using System.Linq; 13 using System.Reflection; 14 using System.Threading.Tasks; 15 16 namespace SswlSub.Controllers.Business 17 { 18 [SwaggerTag("合同下载")] 19 [ApiExplorerSettings(GroupName = "public")] 20 public class ExportController : BaseController 21 { 22 private readonly TokenManager _tokenManager; 23 private readonly IContractService _contractService; 24 private readonly IWebHostEnvironment _hostEnvironment; 25 private readonly ILogger<ExportController> _logger; 26 private readonly IEnterpriseInfoService _enterpriseInfoService; 27 28 public ExportController(TokenManager tokenManager, IContractService contractService, IWebHostEnvironment hostEnvironment, ILogger<ExportController> logger, IEnterpriseInfoService enterpriseInfoService) 29 { 30 _tokenManager = tokenManager; 31 _contractService = contractService; 32 _hostEnvironment = hostEnvironment; 33 _enterpriseInfoService = enterpriseInfoService; 34 _logger = logger; 35 } 36 37 38 [HttpPost] 39 public async Task<IActionResult> GetWord(int id) 40 { 41 try 42 { 43 //var b = _hostEnvironment.ContentRootPath; 44 //string[] pa = b.Split('\\'); 45 string fileName = "/home/data/app/sswlsub/word/hetong.docx"; 46 //var c = pa[0] + "\\" + pa[1] + "\\" + pa[2] + "\\" + "wwwroot"; 47 //string fileName = Path.Combine(b, "hetong.docx"); 48 XWPFDocument workbook = null; 49 using (FileStream fileStream = new FileStream(fileName, FileMode.Open)) 50 { 51 workbook = new XWPFDocument(fileStream); 52 } 53 if (workbook == null) 54 { 55 _logger.LogInformation("没有读取到文件"); 56 } 57 58 var result = await _contractService.GetDB().Queryable<Contract>().Where(a => a.ContractId == id).FirstAsync(); 59 if (result != null) 60 { 61 var entInfos = Sswl.Configs.MiddlemanConfig.middlemanConfigs.MiddlemanEntInfos; 62 var middlean = entInfos.Where(a => a.EnterpriseId == result.MiddlemanId).FirstOrDefault(); 63 var carrier = await _enterpriseInfoService.GetDB().Queryable<EnterpriseInfo>().Where(a => a.EnterpriseInfoId == result.CarrierId && a.IsDel==false).FirstAsync(); 64 var sum = ""; 65 var money = ""; 66 if (result.TotaTon >= 10000) 67 { 68 sum = (result.TotaTon / 10000).ToString().TrimEnd('0').TrimEnd('.') + "万吨"; 69 } 70 else 71 { 72 sum = (result.TotaTon).ToString().TrimEnd('0').TrimEnd('.') + "吨"; 73 } 74 if (result.Deposit >= 10000) 75 { 76 money = (result.Deposit / 10000).ToString().TrimEnd('0').TrimEnd('.') + "万元"; 77 } 78 else 79 { 80 money = (result.Deposit).ToString().TrimEnd('0').TrimEnd('.') + "元"; 81 } 82 83 84 var word = new 85 { 86 goods = result.ContractName, 87 jiafang = middlean != null ? middlean.EnterpriseName : "", 88 bian = result.ContractNo, 89 yifang = result.CarrierName, 90 qiandingdizhi = result.SignAddress, 91 //qiandingtime = result.SignDate.Value.ToLongDateString().ToString(), 92 //qiandingtime = string.Format("{0:D}", result.SignDate), 93 //qiandingtime = result.SignDate.Value.GetDateTimeFormats('d')[0].ToString(), 94 qiandingtime = result.SignDate.Value.ToString("yyyy年M月d日"), 95 sg = sum + result.GoodsName, 96 kyear = result.BeginDate.Value.Year, 97 kmonth = result.BeginDate.Value.Month, 98 kday = result.BeginDate.Value.Day, 99 eyear = result.EndDate.Value.Year, 100 emonth = result.EndDate.Value.Month, 101 eday = result.EndDate.Value.Day, 102 money = money, 103 shui = result.TaxRate + "%" 104 }; 105 106 107 var wordtable = new 108 { 109 goodsname = result.GoodsName, 110 zhuangaddress = result.LoadingAddressName, 111 xieaddress = result.UnloadingAddressName, 112 maxnumber = result.DayMaxTon.ToString().TrimEnd('0').TrimEnd('.'), 113 yunju = result.Distance.ToString().TrimEnd('0').TrimEnd('.'), 114 danjia = result.FreightPrice.ToString().TrimEnd('0').TrimEnd('.'), 115 shuilv = result.TaxRate + "%", 116 jf = middlean != null ? middlean.EnterpriseName : "", 117 yf = carrier != null ? carrier.EnterpriseName : "", 118 adress = middlean != null ? middlean.RegAddress : "", 119 faren = middlean != null ? middlean.LegalPerson : "", 120 phone = middlean != null ? middlean.RegMobile : "", 121 bank = middlean != null ? middlean.BankName : "", 122 card = middlean != null ? middlean.BankCardNo : "", 123 etax = middlean != null ? middlean.TaxCode : "", 124 dz = carrier != null ? carrier.RegAddress : "", 125 fm = carrier != null ? carrier.LegalPerson : "", 126 dianhao = carrier != null ? carrier.RegMobile : "", 127 kaihuhang = carrier != null ? carrier.BankName : "", 128 zangha = carrier != null ? carrier.BankCardNo : "", 129 shuhp = carrier != null ? carrier.TaxCode : "" 130 }; 131 132 foreach (var para in workbook.Paragraphs) 133 { 134 ReplaceKey(para, word); 135 } 136 //遍历表格 137 var tables = workbook.Tables; 138 foreach (var table in tables) 139 { 140 foreach (var row in table.Rows) 141 { 142 foreach (var cell in row.GetTableCells()) 143 { 144 foreach (var para in cell.Paragraphs) 145 { 146 ReplaceKey(para, wordtable); 147 } 148 } 149 } 150 } 151 152 } 153 MemoryStream ms = new MemoryStream(); 154 workbook.Write(ms); 155 byte[] bytefile = ms.ToArray(); 156 var filename = $"{DateTime.Now:yyyyMMddHHmmssffff}.docx"; 157 return File(bytefile, "application/vnd.openxmlformats-officedocument.wordprocessingml.document", filename); 158 } 159 catch (Exception ex) 160 { 161 _logger.LogError("导出excel失败", ex); 162 return null; 163 } 164 } 165 166 167 private static void ReplaceKey(XWPFParagraph para, object model) 168 { 169 string text = para.ParagraphText; 170 var runs = para.Runs; 171 string styleid = para.Style; 172 for (int i = 0; i < runs.Count; i++) 173 { 174 var run = runs[i]; 175 text = run.ToString(); 176 Type t = model.GetType(); 177 PropertyInfo[] pi = t.GetProperties(); 178 foreach (PropertyInfo p in pi) 179 { 180 //文档中替换${Name} 181 if (text.Contains("" + p.Name + "")) 182 { 183 text = text.Replace("" + p.Name + "", p.GetValue(model, null).ToString()); 184 } 185 } 186 runs[i].SetText(text, 0); 187 } 188 //string text = para.ParagraphText; 189 //Type t = model.GetType(); 190 //PropertyInfo[] pi = t.GetProperties(); 191 //foreach (PropertyInfo p in pi) 192 //{ 193 // 文档中替换${ Name} 194 // if (text.Contains("${" + p.Name + "}$")) 195 // { 196 // text = text.Replace("${" + p.Name + "}$", p.GetValue(model, null).ToString()); 197 // } 198 //} 199 //para.set 200 } 201 } 202 }
WIN-LEC4OGJB34R