zoukankan      html  css  js  c++  java
  • 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:UsershutaoPictures2019-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 + @"	emplate.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;
                }
            }
  • 相关阅读:
    车厢重组
    军事机密
    士兵站队
    归并排序
    输油管道
    冒泡排序
    快排
    烦人的幻灯片(确实烦人啊)
    奖金(类拓扑排序)
    能量项链
  • 原文地址:https://www.cnblogs.com/byron-123/p/12956621.html
Copyright © 2011-2022 走看看