.NET Core使用NPOI導出復雜Word詳解


前言:

  最近使用NPOI做了個導出Word文檔的功能,關於使用.NET Core 導出Word文檔的方式有很多。最終我為什么選擇了NPOI來實現了這個功能,首先是NPOI是一個開源,免費且容易上手的第三方框架(並且現在已支持.NET Core,GitHub源碼地址:https://github.com/tonyqus/npoi)。因為之前使用NPOI導出Execl比較多,這次第一次使用NPOI 來導出Word文檔還真沒有什么頭緒。首先看了下GItHub中的源碼有一個簡單Word導出的示例,然后在看了網上有很多關於NPOI導出Word文檔的案例,發現一個特點網上的好像都差不多,對於我而言網上的這些案例完全能夠實現我的這個功能,但是感覺看了網上這些案例對NPOI實例化段落,表格和設置相關樣式不太清楚(可能是因為自己笨),並且假如使用網上的方法來實現我的功能的話代碼量會比較大,而且感覺代碼非常的冗余(我是一個追求代碼簡潔的人,怎么能夠容忍這樣的事情發生呢!),因此通過查閱了一些資料和自己的理解,把關於使用NPOI導出Word時所要涉及的一些段落,表格樣式做了相關注釋,和把段落和表格的創建實例,設置文字、字體、對齊方式都封裝了起了(為了少寫代碼),文章末尾會附上一個完整的案例下載地址。

一、首先引入NPOI NuGet:

版本說明:

  NPOI 2.4.1 (注意不同版本可能使用的姿勢有點小差別)

程序包管理器控制台輸入一下命令安裝:

Install-Package NPOI -Version 2.4.1

通過NuGet管理解決方案安裝:

選擇=>工具=>NuGet包管理器=>程序包管理器控制台:

 搜索:NPOI進行安裝:

二、導出的Work文檔內容展示格式如下圖所示:

 

三、NPOI中的XWPFRun文本對象創建和常用屬性簡單概述:

XWPFRun文本對象說明:

  XWPFRun是段落的文本對象,先創建段落對象才能夠在段落對象的基礎上創建文本對象,並設置相關文本樣式。

使用方式,如下所示:

        /// <summary>
        /// 創建word文檔中的段落對象和設置段落文本的基本樣式(字體大小,字體,字體顏色,字體對齊位置)
        /// </summary>
        /// <param name="document">document文檔對象</param>
        /// <param name="fillContent">段落第一個文本對象填充的內容</param>
        /// <param name="isBold">是否加粗</param>
        /// <param name="fontSize">字體大小</param>
        /// <param name="fontFamily">字體</param>
        /// <param name="paragraphAlign">段落排列(左對齊,居中,右對齊)</param>
        /// <param name="isStatement">是否在同一段落創建第二個文本對象(解決同一段落里面需要填充兩個或者多個文本值的情況,多個文本需要自己拓展,現在最多支持兩個)</param>
        /// <param name="secondFillContent">第二次聲明的文本對象填充的內容,樣式與第一次的一致</param>
        /// <param name="fontColor">字體顏色--十六進制</param>
        /// <param name="isItalic">是否設置斜體(字體傾斜)</param>
        /// <returns></returns>
        public XWPFParagraph ParagraphInstanceSetting(XWPFDocument document, string fillContent, bool isBold, int fontSize, string fontFamily, ParagraphAlignment paragraphAlign, bool isStatement = false, string secondFillContent = "", string fontColor = "000000", bool isItalic = false)
        {
            XWPFParagraph paragraph = document.CreateParagraph();//創建段落對象
            paragraph.Alignment = paragraphAlign;//文字顯示位置,段落排列(左對齊,居中,右對齊)


            XWPFRun xwpfRun = paragraph.CreateRun();//創建段落文本對象
            xwpfRun.IsBold = isBold;//文字加粗
            xwpfRun.SetText(fillContent);//填充內容
            xwpfRun.FontSize = fontSize;//設置文字大小
            xwpfRun.IsItalic = isItalic;//是否設置斜體(字體傾斜)
            xwpfRun.SetColor(fontColor);//設置字體顏色--十六進制
            xwpfRun.SetFontFamily(fontFamily, FontCharRange.None); //設置標題樣式如:(微軟雅黑,隸書,楷體)根據自己的需求而定

            if (!isStatement) return paragraph;
            
            XWPFRun secondXwpfRun = paragraph.CreateRun();//創建段落文本對象
            secondXwpfRun.IsBold = isBold;//文字加粗
            secondXwpfRun.SetText(secondFillContent);//填充內容
            secondXwpfRun.FontSize = fontSize;//設置文字大小
            secondXwpfRun.IsItalic = isItalic;//是否設置斜體(字體傾斜)
            secondXwpfRun.SetColor(fontColor);//設置字體顏色--十六進制
            secondXwpfRun.SetFontFamily(fontFamily, FontCharRange.None); //設置標題樣式如:(微軟雅黑,隸書,楷體)根據自己的需求而定
            return paragraph;
        }

XWPFRun文本對象的屬性比較多,以下我簡單介紹下常用的一些屬性:

            XWPFParagraph paragraph = document.CreateParagraph();//創建段落對象
            XWPFRun xwpfRun= paragraph.CreateRun();//創建段落文本對象
            xwpfRun.IsBold = isBold;//文字加粗
            xwpfRun.SetText(fillContent);//填充內容
            xwpfRun.FontSize = fontSize;//設置文字大小
            xwpfRun.SetFontFamily(fontFamily, FontCharRange.None); //設置標題樣式如:(微軟雅黑,隸書,楷體)根據自己的需求而定
            xwpfRun.SetColor("BED4F1");//設置字體顏色--十六進制
            xwpfRun.IsDoubleStrikeThrough=true;//是否顯示雙刪除線
            xwpfRun.IsStrikeThrough = true;//是否顯示單刪除線
            xwpfRun.SetUnderline(UnderlinePatterns.Dash);//設置下划線,枚舉類型
            xwpfRun.SetTextPosition(20);//設置文本位置(設置兩行之間的行間)
            xwpfRun.AddBreak();//設置換行(</br>)
            xwpfRun.AddTab();//添加tab鍵
            xwpfRun.AddCarriageReturn();//添加回車鍵
            xwpfRun.IsImprinted = true;//印跡(懸浮陰影),效果和浮雕類似
            xwpfRun.IsItalic=true;//是否設置斜體(字體傾斜)
            xwpfRun.Subscript = VerticalAlign.SUBSCRIPT;//設置下標,枚舉類型

NPOI中關於XWPFRun屬性的更多使用技巧,請閱讀源碼:

源碼地址:https://github.com/tonyqus/npoi/blob/master/ooxml/XWPF/Usermodel/XWPFRun.cs

顏色的十六進制對照表:

參考地址:https://www.cnblogs.com/cainiao-chuanqi/p/11301471.html

四、NPOI生成Word完整代碼:

NPOI-Export-Word段落,文本,表格,字體等相關樣式統一封裝【NpoiWordParagraphTextStyleHelper.cs】:

/**
* Author:追逐時光
* Description:Npoi之導出Word段落,文本,表格,字體等相關樣式統一封裝
* Description:2020年3月25日
*/

using System;
using NPOI.XWPF.UserModel;
using NPOI.OpenXmlFormats.Wordprocessing;

namespace YY_Utility
{
public class NpoiWordParagraphTextStyleHelper
{
private static NpoiWordParagraphTextStyleHelper _exportHelper;

public static NpoiWordParagraphTextStyleHelper _
{
get => _exportHelper ?? (_exportHelper = new NpoiWordParagraphTextStyleHelper());
set => _exportHelper = value;
}


/// <summary>
/// 創建word文檔中的段落對象和設置段落文本的基本樣式(字體大小,字體,字體顏色,字體對齊位置)
/// </summary>
/// <param name="document">document文檔對象</param>
/// <param name="fillContent">段落第一個文本對象填充的內容</param>
/// <param name="isBold">是否加粗</param>
/// <param name="fontSize">字體大小</param>
/// <param name="fontFamily">字體</param>
/// <param name="paragraphAlign">段落排列(左對齊,居中,右對齊)</param>
/// <param name="isStatement">是否在同一段落創建第二個文本對象(解決同一段落里面需要填充兩個或者多個文本值的情況,多個文本需要自己拓展,現在最多支持兩個)</param>
/// <param name="secondFillContent">第二次聲明的文本對象填充的內容,樣式與第一次的一致</param>
/// <param name="fontColor">字體顏色--十六進制</param>
/// <param name="isItalic">是否設置斜體(字體傾斜)</param>
/// <returns></returns>
public XWPFParagraph ParagraphInstanceSetting(XWPFDocument document, string fillContent, bool isBold, int fontSize, string fontFamily, ParagraphAlignment paragraphAlign, bool isStatement = false, string secondFillContent = "", string fontColor = "000000", bool isItalic = false)
{
XWPFParagraph paragraph = document.CreateParagraph();//創建段落對象
paragraph.Alignment = paragraphAlign;//文字顯示位置,段落排列(左對齊,居中,右對齊)


XWPFRun xwpfRun = paragraph.CreateRun();//創建段落文本對象
xwpfRun.IsBold = isBold;//文字加粗
xwpfRun.SetText(fillContent);//填充內容
xwpfRun.FontSize = fontSize;//設置文字大小
xwpfRun.IsItalic = isItalic;//是否設置斜體(字體傾斜)
xwpfRun.SetColor(fontColor);//設置字體顏色--十六進制
xwpfRun.SetFontFamily(fontFamily, FontCharRange.None); //設置標題樣式如:(微軟雅黑,隸書,楷體)根據自己的需求而定

if (!isStatement) return paragraph;

XWPFRun secondXwpfRun = paragraph.CreateRun();//創建段落文本對象
secondXwpfRun.IsBold = isBold;//文字加粗
secondXwpfRun.SetText(secondFillContent);//填充內容
secondXwpfRun.FontSize = fontSize;//設置文字大小
secondXwpfRun.IsItalic = isItalic;//是否設置斜體(字體傾斜)
secondXwpfRun.SetColor(fontColor);//設置字體顏色--十六進制
secondXwpfRun.SetFontFamily(fontFamily, FontCharRange.None); //設置標題樣式如:(微軟雅黑,隸書,楷體)根據自己的需求而定


return paragraph;
}

/// <summary> 
/// 創建Word文檔中表格段落實例和設置表格段落文本的基本樣式(字體大小,字體,字體顏色,字體對齊位置)
/// </summary> 
/// <param name="document">document文檔對象</param> 
/// <param name="table">表格對象</param> 
/// <param name="fillContent">要填充的文字</param> 
/// <param name="paragraphAlign">段落排列(左對齊,居中,右對齊)</param>
/// <param name="textPosition">設置文本位置(設置兩行之間的行間,從而實現表格文字垂直居中的效果),從而實現table的高度設置效果 </param>
/// <param name="isBold">是否加粗(true加粗,false不加粗)</param>
/// <param name="fontSize">字體大小</param>
/// <param name="fontColor">字體顏色--十六進制</param>
/// <param name="isItalic">是否設置斜體(字體傾斜)</param>
/// <returns></returns> 
public XWPFParagraph SetTableParagraphInstanceSetting(XWPFDocument document, XWPFTable table, string fillContent, ParagraphAlignment paragraphAlign, int textPosition = 24, bool isBold = false, int fontSize = 10, string fontColor = "000000", bool isItalic = false)
{
var para = new CT_P();
//設置單元格文本對齊
para.AddNewPPr().AddNewTextAlignment();

XWPFParagraph paragraph = new XWPFParagraph(para, table.Body);//創建表格中的段落對象
paragraph.Alignment = paragraphAlign;//文字顯示位置,段落排列(左對齊,居中,右對齊)
//paragraph.FontAlignment =Convert.ToInt32(ParagraphAlignment.CENTER);//字體在單元格內顯示位置與 paragraph.Alignment效果相似

XWPFRun xwpfRun = paragraph.CreateRun();//創建段落文本對象
xwpfRun.SetText(fillContent);
xwpfRun.FontSize = fontSize;//字體大小
xwpfRun.SetColor(fontColor);//設置字體顏色--十六進制
xwpfRun.IsItalic = isItalic;//是否設置斜體(字體傾斜)
xwpfRun.IsBold = isBold;//是否加粗
xwpfRun.SetFontFamily("宋體", FontCharRange.None);//設置字體(如:微軟雅黑,華文楷體,宋體)
xwpfRun.SetTextPosition(textPosition);//設置文本位置(設置兩行之間的行間),從而實現table的高度設置效果 
return paragraph;
}
}
}

生成並保存Word:

using Microsoft.AspNetCore.Hosting;
using NPOI.OpenXmlFormats.Wordprocessing;
using NPOI.XWPF.UserModel;
using System;
using System.IO;
using YY_Utility;

namespace Export.Services
{
    public class NpoiWordExportService
    {
        private static IHostingEnvironment _environment;

        public NpoiWordExportService(IHostingEnvironment iEnvironment)
        {
            _environment = iEnvironment;
        }

        #region 生成word

        /// <summary>
        ///  生成word文檔,並保存靜態資源文件夾(wwwroot)下的SaveWordFile文件夾中
        /// </summary>
        /// <param name="savePath">保存路徑</param>
        public bool SaveWordFile(out string savePath)
        {
            savePath = "";
            try
            {
                string currentDate = DateTime.Now.ToString("yyyyMMdd");
                string checkTime = DateTime.Now.ToString("yyyy年MM月dd日");//檢查時間
                //保存文件到靜態資源wwwroot,使用絕對路徑路徑
                var uploadPath = _environment.WebRootPath + "/SaveWordFile/" + currentDate + "/";//>>>相當於HttpContext.Current.Server.MapPath("") 

                string workFileName = checkTime + "追逐時光企業員工培訓考核統計記錄表";
                string fileName = string.Format("{0}.docx", workFileName, System.Text.Encoding.UTF8);

                if (!Directory.Exists(uploadPath))
                {
                    Directory.CreateDirectory(uploadPath);
                }

                //TODO:使用FileStream文件流來寫入數據(傳入參數為:文件所在路徑,對文件的操作方式,對文件內數據的操作)
                //通過使用文件流,創建文件流對象,向文件流中寫入內容,並保存為Word文檔格式
                using (var stream = new FileStream(Path.Combine(uploadPath, fileName), FileMode.Create, FileAccess.Write))
                {
                    //創建document文檔對象對象實例
                    XWPFDocument document = new XWPFDocument();

                    /**
                     *這里我通過設置公共的Word文檔中SetParagraph(段落)實例創建和段落樣式格式設置,大大減少了代碼的冗余,
                     * 避免每使用一個段落而去創建一次段落實例和設置段落的基本樣式
                     *(如下,ParagraphInstanceSetting為段落實例創建和樣式設置,后面索引表示為當前是第幾行段落,索引從0開始)
                     */
                    //文本標題
                    document.SetParagraph(NpoiWordParagraphTextStyleHelper._.ParagraphInstanceSetting(document, workFileName, true, 19, "宋體", ParagraphAlignment.CENTER), 0);

                    //TODO:這里一行需要顯示兩個文本
                    document.SetParagraph(NpoiWordParagraphTextStyleHelper._.ParagraphInstanceSetting(document, $"編號:20190927101120445887", false, 14, "宋體", ParagraphAlignment.LEFT, true, $"       檢查時間:{checkTime}"), 1);


                    document.SetParagraph(NpoiWordParagraphTextStyleHelper._.ParagraphInstanceSetting(document, "登記機關:企業員工監督檢查機構", false, 14, "宋體", ParagraphAlignment.LEFT), 2);


                    #region 文檔第一個表格對象實例
                    //創建文檔中的表格對象實例
                    XWPFTable firstXwpfTable = document.CreateTable(4, 4);//顯示的行列數rows:3行,cols:4列
                    firstXwpfTable.Width = 5200;//總寬度
                    firstXwpfTable.SetColumnWidth(0, 1300); /* 設置列寬 */
                    firstXwpfTable.SetColumnWidth(1, 1100); /* 設置列寬 */
                    firstXwpfTable.SetColumnWidth(2, 1400); /* 設置列寬 */
                    firstXwpfTable.SetColumnWidth(3, 1400); /* 設置列寬 */

                    //Table 表格第一行展示...后面的都是一樣,只改變GetRow中的行數
                    firstXwpfTable.GetRow(0).GetCell(0).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "企業名稱", ParagraphAlignment.CENTER, 24, true));
                    firstXwpfTable.GetRow(0).GetCell(1).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "追逐時光", ParagraphAlignment.CENTER, 24, false));
                    firstXwpfTable.GetRow(0).GetCell(2).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "企業地址", ParagraphAlignment.CENTER, 24, true));
                    firstXwpfTable.GetRow(0).GetCell(3).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "湖南省-長沙市-岳麓區", ParagraphAlignment.CENTER, 24, false));

                    //Table 表格第二行
                    firstXwpfTable.GetRow(1).GetCell(0).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "聯系人", ParagraphAlignment.CENTER, 24, true));
                    firstXwpfTable.GetRow(1).GetCell(1).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "小明同學", ParagraphAlignment.CENTER, 24, false));
                    firstXwpfTable.GetRow(1).GetCell(2).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "聯系方式", ParagraphAlignment.CENTER, 24, true));
                    firstXwpfTable.GetRow(1).GetCell(3).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "151****0456", ParagraphAlignment.CENTER, 24, false));


                    //Table 表格第三行
                    firstXwpfTable.GetRow(2).GetCell(0).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "企業許可證號", ParagraphAlignment.CENTER, 24, true));
                    firstXwpfTable.GetRow(2).GetCell(1).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "XXXXX-66666666", ParagraphAlignment.CENTER, 24, false));
                    firstXwpfTable.GetRow(2).GetCell(2).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "檢查次數", ParagraphAlignment.CENTER, 24, true));
                    firstXwpfTable.GetRow(2).GetCell(3).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, $"本年度檢查8次", ParagraphAlignment.CENTER, 24, false));


                    firstXwpfTable.GetRow(3).MergeCells(0, 3);//合並3列
                    firstXwpfTable.GetRow(3).GetCell(0).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "", ParagraphAlignment.LEFT, 10, false));

                    #endregion

                    var checkPeopleNum = 0;//檢查人數
                    var totalScore = 0;//總得分

                    #region 文檔第二個表格對象實例(遍歷表格項)
                    //創建文檔中的表格對象實例
                    XWPFTable secoedXwpfTable = document.CreateTable(5, 4);//顯示的行列數rows:8行,cols:4列
                    secoedXwpfTable.Width = 5200;//總寬度
                    secoedXwpfTable.SetColumnWidth(0, 1300); /* 設置列寬 */
                    secoedXwpfTable.SetColumnWidth(1, 1100); /* 設置列寬 */
                    secoedXwpfTable.SetColumnWidth(2, 1400); /* 設置列寬 */
                    secoedXwpfTable.SetColumnWidth(3, 1400); /* 設置列寬 */

                    //遍歷表格標題
                    secoedXwpfTable.GetRow(0).GetCell(0).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "員工姓名", ParagraphAlignment.CENTER, 24, true));
                    secoedXwpfTable.GetRow(0).GetCell(1).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "性別", ParagraphAlignment.CENTER, 24, true));
                    secoedXwpfTable.GetRow(0).GetCell(2).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "年齡", ParagraphAlignment.CENTER, 24, true));
                    secoedXwpfTable.GetRow(0).GetCell(3).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "綜合評分", ParagraphAlignment.CENTER, 24, true));

                    //遍歷四條數據
                    for (var i = 1; i < 5; i++)
                    {
                        secoedXwpfTable.GetRow(i).GetCell(0).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "小明" + i + "", ParagraphAlignment.CENTER, 24, false));
                        secoedXwpfTable.GetRow(i).GetCell(1).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "", ParagraphAlignment.CENTER, 24, false));
                        secoedXwpfTable.GetRow(i).GetCell(2).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, 20 + i + "", ParagraphAlignment.CENTER, 24, false));
                        secoedXwpfTable.GetRow(i).GetCell(3).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, 90 + i + "", ParagraphAlignment.CENTER, 24, false));

                        checkPeopleNum++;
                        totalScore += 90 + i;
                    }

                    #endregion

                    #region 文檔第三個表格對象實例
                    //創建文檔中的表格對象實例
                    XWPFTable thirdXwpfTable = document.CreateTable(5, 4);//顯示的行列數rows:5行,cols:4列
                    thirdXwpfTable.Width = 5200;//總寬度
                    thirdXwpfTable.SetColumnWidth(0, 1300); /* 設置列寬 */
                    thirdXwpfTable.SetColumnWidth(1, 1100); /* 設置列寬 */
                    thirdXwpfTable.SetColumnWidth(2, 1400); /* 設置列寬 */
                    thirdXwpfTable.SetColumnWidth(3, 1400); /* 設置列寬 */
                    //Table 表格第一行,后面的合並3列(注意關於表格中行合並問題,先合並,后填充內容)
                    thirdXwpfTable.GetRow(0).MergeCells(0, 3);//從第一列起,合並3列
                    thirdXwpfTable.GetRow(0).GetCell(0).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, thirdXwpfTable, "                                                                                         " + "檢查內容: " +
                        $"於{checkTime}下午檢查了追逐時光企業員工培訓考核並對員工的相關信息進行了相關統計,統計結果如下:                                                                                                                                                                                                                " +
                        "-------------------------------------------------------------------------------------" +
                        $"共對該企業({checkPeopleNum})人進行了培訓考核,培訓考核總得分為({totalScore})分。 " + "", ParagraphAlignment.LEFT, 30, false));


                    //Table 表格第二行
                    thirdXwpfTable.GetRow(1).GetCell(0).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, thirdXwpfTable, "檢查結果: ", ParagraphAlignment.CENTER, 24, true));
                    thirdXwpfTable.GetRow(1).MergeCells(1, 3);//從第二列起,合並三列
                    thirdXwpfTable.GetRow(1).GetCell(1).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, thirdXwpfTable, "該企業非常優秀,堅持每天學習打卡,具有蓬勃向上的活力。", ParagraphAlignment.LEFT, 24, false));

                    //Table 表格第三行
                    thirdXwpfTable.GetRow(2).GetCell(0).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, thirdXwpfTable, "處理結果: ", ParagraphAlignment.CENTER, 24, true));
                    thirdXwpfTable.GetRow(2).MergeCells(1, 3);
                    thirdXwpfTable.GetRow(2).GetCell(1).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, thirdXwpfTable, "通過檢查,評分為優秀!", ParagraphAlignment.LEFT, 24, false));

                    //Table 表格第四行,后面的合並3列(注意關於表格中行合並問題,先合並,后填充內容),額外說明
                    thirdXwpfTable.GetRow(3).MergeCells(0, 3);//合並3列
                    thirdXwpfTable.GetRow(3).GetCell(0).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, thirdXwpfTable, "備注說明: 記住,堅持就是勝利,永遠保持一種求知,好問的心理!", ParagraphAlignment.LEFT, 24, false));

                    //Table 表格第五行
                    thirdXwpfTable.GetRow(4).MergeCells(0, 1);
                    thirdXwpfTable.GetRow(4).GetCell(0).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, thirdXwpfTable, "                                                                                                                                                                                                 檢查人員簽名:              年 月 日", ParagraphAlignment.LEFT, 30, false));
                    thirdXwpfTable.GetRow(4).MergeCells(1, 2);

                    thirdXwpfTable.GetRow(4).GetCell(1).SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, thirdXwpfTable, "                                                                                                                                                                                                 企業法人簽名:              年 月 日", ParagraphAlignment.LEFT, 30, false));


                    #endregion

                    //向文檔流中寫入內容,生成word
                    document.Write(stream);

                    savePath = "/SaveWordFile/" + currentDate + "/" + fileName;

                    return true;
                }
            }
            catch (Exception ex)
            {
                //ignore
                savePath = ex.Message;
                return false;
            }
        }
        #endregion
    }
}

總結:

  寫到最后我只想說我太難了,為了實現我想要的這個樣式,通過不斷的查閱資料,理解NPOI中的段落,文本,字體等基本屬性。最終在我生成第28個Word時,總算是達到了我要的效果。這里我將自己在網上查閱的一些資料和自己在實踐中的收獲、心得分享給大家,希望能夠幫到大家,別忘了給我star喲。

相關實例鏈接地址:

GitHub完整實例地址:

https://github.com/YSGStudyHards/NPOI-ExportWordAndExcel-ImportExcelData

.NET Core使用NPOI導出復雜,美觀的Excel詳解:

https://www.cnblogs.com/Can-daydayup/p/12501400.html

.NET Core使用NPOI導出復雜Word詳解:

https://www.cnblogs.com/Can-daydayup/p/11588531.html

.NET Core使用NPOI將Excel中的數據批量導入到MySQL:

https://www.cnblogs.com/Can-daydayup/p/12593165.html

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM