C# 使用Word模板导出数据
使用NPOI控件导出数据到Word模板中方式:
效果如下:
Word模板:
运行结果:
实现如下:
Student.cs
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ExportWord { public class Student { public String Photo { get; set; } public FileStream PhotoData { get; set; } public String Name { get; set; } public List<Course> Data { get; set; } } }
Course.cs
using System; namespace ExportWord { public class Course { public String Name { get; set; } public Int32 Score { get; set; } } }
Main.cs
Export()
public FileStream Export() { Student stu = new ExportWord.Student(); stu.Name = "AAAAA"; stu.Photo = @"C:\Users\hutao\Pictures\2019-12-16_153943.png"; stu.PhotoData = new FileStream(stu.Photo, FileMode.Open, FileAccess.Read); stu.Data = new List<Course>(); stu.Data.Add(new ExportWord.Course() { Name = "BBBB", Score = 89 }); stu.Data.Add(new ExportWord.Course() { Name = "CCCC", Score = 90 }); stu.Data.Add(new ExportWord.Course() { Name = "DDDD", Score = 100 }); stu.Data.Add(new ExportWord.Course() { Name = "EEEE", Score = 101 }); stu.Data.Add(new ExportWord.Course() { Name = "FFFF", Score = 102 }); stu.Data.Add(new ExportWord.Course() { Name = "GGGG", Score = 103 }); string path = Application.StartupPath; string filepath = (path + @"\template.docx"); using (FileStream stream = File.OpenRead(filepath)) { XWPFDocument doc = new XWPFDocument(stream); //遍历段落 foreach (var para in doc.Paragraphs) { ReplaceKey(para, stu); } //遍历表格 var tables = doc.Tables; foreach (var table in tables) { ReplaceTableKey(table, stu.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, stu); } } } } FileStream out1 = new FileStream(path + @"\123.docx", FileMode.Create); doc.Write(out1); out1.Close(); return out1; } }
ReplaceKey()
/// <summary> /// 替换Key /// </summary> /// <param name="para"></param> /// <param name="model"></param> private static void ReplaceKey(XWPFParagraph para, object model) { string text = para.ParagraphText; 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) { if (p.PropertyType.Name == "FileStream") { if (text.Contains("$" + p.Name + "$")) { runs[i].SetText("", 0); runs[i].AddPicture((FileStream)p.GetValue(model, null), (int)PictureType.JPEG, "image1", 1000000, 1000000); } } else { //$$与模板中$$对应,也可以改成其它符号,比如{$name},务必做到唯一 if (text.Contains("$" + p.Name + "$")) { text = text.Replace("$" + p.Name + "$", p.GetValue(model, null).ToString()); runs[i].SetText(text, 0); } } } } }
ReplaceTableKey()
/// <summary> /// 替换表格Key /// </summary> /// <param name="para"></param> /// <param name="model"></param> private static void ReplaceTableKey(XWPFTable table, IList list, String field) { List<XWPFParagraph> paras = new List<XWPFParagraph>(); // 获取最后一行数据,最后一行设置值 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++) { dynamic 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); } }
protected void btn_Click(object sender, EventArgs e) { using (FileStream fs = Export()) { string path = Application.StartupPath; //将byte数组写入文件中 DownloadFile(fs); } } /// <summary> /// 下载文件 /// </summary> /// <param name="URL">下载文件地址</param> /// <param name="Filename">下载后另存为(全路径)</param> private bool DownloadFile(FileStream fs) { try { byte[] by = new byte[fs.Length]; fs.Write(by, 0, by.Length); fs.Close(); return true; } catch (System.Exception e) { return false; } }