服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C# 使用Word模板导出数据的实现代码

C# 使用Word模板导出数据的实现代码

2022-11-22 12:15沙漠狼 C#

最近接到个需求,使用word模板导出数据,怎么实现这个需求呢,今天小编通过实例代码给大家介绍C# 使用Word模板导出数据的方法,感兴趣的朋友一起看看吧

使用NPOI控件导出数据到Word模板中方式:

效果如下:

Word模板:

C# 使用Word模板导出数据的实现代码

运行结果:

C# 使用Word模板导出数据的实现代码

实现如下:

Student.cs

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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

?
1
2
3
4
5
6
7
8
9
10
using System;
 
namespace ExportWord
{
    public class Course
    {
        public String Name { get; set; }
        public Int32 Score { get; set; }
    }
}

Main.cs

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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()

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/// <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()

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/// <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);
 
            }
        }
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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;
            }
        }

以上就是C# 使用Word模板导出数据的详细内容,更多关于C# 导出数据的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/byron-123/p/12956621.html

延伸 · 阅读

精彩推荐
  • C#VSCode调试C#程序及附缺失.dll文件的解决办法

    VSCode调试C#程序及附缺失.dll文件的解决办法

    这篇文章主要介绍了VSCode调试C#程序及附缺失.dll文件的解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需...

    khq溪风8422022-10-10
  • C#详解C# 网络编程系列:实现类似QQ的即时通信程序

    详解C# 网络编程系列:实现类似QQ的即时通信程序

    本篇主要介绍了c#实现类似QQ的即时通信程序 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。...

    Learning hard3832021-12-16
  • C#C# DataGridView绑定数据源的方法

    C# DataGridView绑定数据源的方法

    这篇文章主要为大家详细介绍了C# DataGridView绑定数据源的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    五维思考6362022-03-01
  • C#C# xmlSerializer简单用法示例

    C# xmlSerializer简单用法示例

    这篇文章主要介绍了C# xmlSerializer简单用法,结合实例形式分析了C#基于xmlSerializer操作xml的读取、输出等相关操作技巧,需要的朋友可以参考下...

    peerlessbloom11522022-01-19
  • C#c# 剔除sql语句'尾巴'的五种方法

    c# 剔除sql语句'尾巴'的五种方法

    这篇文章主要介绍了c# 剔除sql语句'尾巴'的五种方法,,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...

    一线码农10592022-10-17
  • C#C#实现将32位MD5摘要串转换为128位二进制字符串的方法

    C#实现将32位MD5摘要串转换为128位二进制字符串的方法

    这篇文章主要介绍了C#实现将32位MD5摘要串转换为128位二进制字符串的方法,涉及C#字符串遍历、加密与转换相关操作技巧,需要的朋友可以参考下...

    FrankYou6992021-12-30
  • C#C#中的Lazy如何使用详解

    C#中的Lazy如何使用详解

    这篇文章主要给大家介绍了C#中Lazy如何使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    码农读书10832022-10-24
  • C#C# 如何规范的写 DEBUG 输出

    C# 如何规范的写 DEBUG 输出

    本文来告诉大家一个规范,如何去写 DEBUG 的输出。本文给大家介绍的非常详细,需要的朋友参考下吧...

    lindexi11552022-02-17