C# 使用Word模板導(dǎo)出數(shù)據(jù)的實現(xiàn)代碼
使用NPOI控件導(dǎo)出數(shù)據(jù)到Word模板中方式:
效果如下:
Word模板:

運行結(jié)果:

實現(xiàn)如下:
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
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
{
//$$與模板中$$對應(yīng),也可以改成其它符號,比如{$name},務(wù)必做到唯一
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>();
// 獲取最后一行數(shù)據(jù),最后一行設(shè)置值
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數(shù)組寫入文件中
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;
}
}
以上就是C# 使用Word模板導(dǎo)出數(shù)據(jù)的詳細(xì)內(nèi)容,更多關(guān)于C# 導(dǎo)出數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
總結(jié)C#刪除字符串?dāng)?shù)組中空字符串的幾種方法
C#中要如何才能刪除一個字符串?dāng)?shù)組中的空字符串呢?下面的文章會介紹多種方式來實現(xiàn)清除數(shù)組中的空字符串,以及在.net中將字符串?dāng)?shù)組中字符串為空的元素去除。2016-08-08
WinForm中comboBox控件數(shù)據(jù)綁定實現(xiàn)方法
這篇文章主要介紹了WinForm中comboBox控件數(shù)據(jù)綁定實現(xiàn)方法,結(jié)合實例形式分析了WinForm實現(xiàn)comboBox控件數(shù)據(jù)綁定的常用方法與相關(guān)操作技巧,需要的朋友可以參考下2017-05-05
C# TcpClient網(wǎng)絡(luò)編程傳輸文件的示例
這篇文章主要介紹了C# TcpClient網(wǎng)絡(luò)編程傳輸文件的示例,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-04-04
淺析C#數(shù)據(jù)類型轉(zhuǎn)換的幾種形式
本篇文章是對C#中數(shù)據(jù)類型轉(zhuǎn)換的幾種形式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07
C#操作DataTable方法實現(xiàn)過濾、取前N條數(shù)據(jù)及獲取指定列數(shù)據(jù)列表的方法
這篇文章主要介紹了C#操作DataTable方法實現(xiàn)過濾、取前N條數(shù)據(jù)及獲取指定列數(shù)據(jù)列表的方法,實例分析了C#操作DataTable的各種常用技巧,非常具有實用價值,需要的朋友可以參考下2015-04-04

