1. 程式人生 > WINDOWS開發 >C#使用NPOI對Word文件進行匯出操作的dll最新版2.5.1

C#使用NPOI對Word文件進行匯出操作的dll最新版2.5.1

Npoi匯出非模板

最近使用NPOI做了個匯出Word文件的功能,因為之前都是匯出Excel很方便(不用模板),所以匯出Word也選用了Npoi(也沒有用模板,??),開始之前沒有查閱資料,非模板簡直費勁的狠,有的方法查閱資料搜尋出來的都不沾邊,後來通過查閱資料與自己研究,終於把需求實現了,話不多說上程式碼,希望以後能夠幫助到有需要的人

一、首先引入NPOI NuGet:

版本說明

    NPOI 2.5.1 

       本次用到了最新版本的Npoi跟以前舊版本對比 有的方法沒有找到

      通過Nuget搜尋Npoi下載安裝就好

  

二、建立頁首頁尾(顯示第幾頁共幾頁):

使用方式,如下所示:

如果我們沒有特殊要求使用 只顯示頁首頁尾

   CT_Ftr m_ftr = new CT_Ftr(); 
       m_ftr.AddNewP().AddNewR().AddNewT().Value = "我是頁尾";
            XWPFRelation Frelation = XWPFRelation.FOOTER;
            XWPFFooter m_f = (XWPFFooter)document.CreateRelationship(Frelation,XWPFFactory.GetInstance(),document.FooterList.Count + 1
); //設定頁尾 m_f.SetHeaderFooter(m_ftr); m_f.SetXWPFDocument(document); CT_HdrFtrRef m_HdrFtr1 = m_SectPr.AddNewFooterReference(); m_HdrFtr1.type = [email protected]; m_HdrFtr1.id = m_f.GetPackageRelationship().Id;

這裡我需要顯示第幾頁共幾頁 還會顯示頁尾有背景色 頁首有字型顏色等,如下:

  /// <summary>
        /// 建立頁首
        /// </summary>
        /// <param name="document"></param>
        /// <param name="m_SectPr"></param>
        /// <param name="jo"></param>
        public static void CreateHeader(XWPFDocument document,CT_SectPr m_SectPr,QuotationExportEntity.QuotationDetailInfoRequest Entity)
        {

            int FontSize = 17;
            //建立頁首
            CT_Hdr m_Hdr = new CT_Hdr();
            m_Hdr.Items = new System.Collections.ArrayList();//新增多個頭資訊
            CT_SdtBlock m_Sdt = new CT_SdtBlock();
            CT_SdtContentBlock m_SdtContent = m_Sdt.AddNewSdtContent();
            CT_P m_SdtContentP = m_SdtContent.AddNewP();
            CT_PPr m_SdtContentPpPr = m_SdtContentP.AddNewPPr();
            m_SdtContentPpPr.AddNewJc().val = ST_Jc.left;
            m_SdtContentP.Items = new System.Collections.ArrayList();
            CT_R m_SdtR = m_SdtContentP.AddNewR();
            CT_RPr m_ctrpr = m_SdtR.AddNewRPr();
            CT_Fonts rfonts = m_ctrpr.AddNewRFonts(); //新增新的字型
            CT_Color rColor = m_ctrpr.AddNewColor(); //改變頁字型顏色
            rColor.val = "red";
            rfonts.ascii = "新微軟雅黑";
            rfonts.eastAsia = "新微軟雅黑";
            m_ctrpr.AddNewSz().val = (ulong)FontSize;

            m_SdtR.AddNewT().Value = "聯想報價單  ";
            m_SdtR = m_SdtContentP.AddNewR();
            m_ctrpr = m_SdtR.AddNewRPr();
            m_ctrpr.AddNewSz().val = (ulong)FontSize;
            m_SdtR.AddNewT().Value = "" + Entity.quotationNumber.ToString() + "-買方名稱:" + Entity.customerName + "                                ";
            m_SdtR = m_SdtContentP.AddNewR();
            m_ctrpr = m_SdtR.AddNewRPr();
            rColor = m_ctrpr.AddNewColor();
            rColor.val = "red";
            if (!string.IsNullOrEmpty(Entity.lenovoLinkName) && string.IsNullOrEmpty(Entity.customerPhone))
            {
                m_ctrpr.AddNewSz().val = (ulong)FontSize;
                m_SdtR.AddNewT().Value = "        客戶經理:";
                m_SdtR = m_SdtContentP.AddNewR();
                m_ctrpr = m_SdtR.AddNewRPr();
                m_ctrpr.AddNewSz().val = (ulong)FontSize;
                m_SdtR.AddNewT().Value = "" + Entity.lenovoLinkName + "" + Entity.customerPhone + "";
            }
            m_Hdr.Items.Add(m_Sdt);
            XWPFRelation Hrelation = XWPFRelation.HEADER;
            XWPFHeader m_h = (XWPFHeader)document.CreateRelationship(Hrelation,XWPFFactory.GetInstance());
            //設定頁首
            m_h.SetHeaderFooter(m_Hdr);
            CT_HdrFtrRef m_HdrFtr2 = m_SectPr.AddNewHeaderReference();
            m_HdrFtr2.type = [email protected];
            m_HdrFtr2.id = m_h.GetPackageRelationship().Id;

        }
        /// <summary>
        /// 建立頁尾
        /// </summary>
        /// <param name="document"></param>
        /// <param name="m_SectPr"></param>
        /// <param name="jo"></param>
        public static void CreateFooter(XWPFDocument document,QuotationExportEntity.QuotationDetailInfoRequest Entity)
        {
            int FontSize = 17;
            CT_Ftr m_ftr = new CT_Ftr();
            m_ftr.Items = new System.Collections.ArrayList();
            CT_SdtBlock m_Sdt = new CT_SdtBlock();
            CT_SdtPr m_SdtPr = m_Sdt.AddNewSdtPr();
            CT_SdtDocPart m_SdtDocPartObj = m_SdtPr.AddNewDocPartObj();
            m_SdtDocPartObj.AddNewDocPartGallery().val = "Page Numbers (Bottom of Page)";
            m_SdtDocPartObj.docPartUnique = new CT_OnOff();
            m_Sdt.AddNewSdtEndPr();
            CT_SdtContentBlock m_SdtContent = m_Sdt.AddNewSdtContent();
            CT_P m_SdtContentP = m_SdtContent.AddNewP();
            CT_PPr m_SdtContentPpPr = m_SdtContentP.AddNewPPr();
            m_SdtContentPpPr.AddNewJc().val = ST_Jc.left;
            m_SdtContentP.Items = new System.Collections.ArrayList();
            CT_SimpleField m_fldSimple = new CT_SimpleField();
            CT_R m_SdtR = m_SdtContentP.AddNewR();
            CT_RPr m_ctrpr = m_SdtR.AddNewRPr();
            CT_Fonts rfonts = m_ctrpr.AddNewRFonts(); //新增新的字型
            CT_Color rColor = m_ctrpr.AddNewColor(); //改變頁字型顏色
            CT_OnOff bBold = m_ctrpr.AddNewB();  //字型加粗
            CT_OnOff bcsCold = m_ctrpr.AddNewBCs();
            rColor.val = "white";
            rfonts.ascii = "新微軟雅黑";
            rfonts.eastAsia = "新微軟雅黑";
            m_ctrpr.AddNewSz().val = (ulong)FontSize;
            m_ctrpr.AddNewSzCs().val = (ulong)FontSize;
            m_SdtR.AddNewRPr().AddNewLang().val = "zh-CN"; //代表的是語言文化程式碼和國家地區
            CT_Highlight rHighlight = new CT_Highlight();
            rHighlight.val = ST_HighlightColor.black;
            m_ctrpr.highlight = rHighlight;
            bBold.val = true;
            bcsCold.val = true;
            m_SdtR.AddNewT().Value = " 聯想商用PC ";
            m_ftr.Items.Add(m_Sdt);

            m_SdtR = m_SdtContentP.AddNewR();
            m_ctrpr = m_SdtR.AddNewRPr();
            rfonts = m_ctrpr.AddNewRFonts();
            rfonts.ascii = "新微軟雅黑";
            rfonts.eastAsia = "新微軟雅黑";
            m_ctrpr.AddNewSz().val = (ulong)FontSize;
            m_ctrpr.AddNewSzCs().val = (ulong)FontSize;
            m_SdtR.AddNewRPr().AddNewLang().val = "zh-CN"; //代表的是語言文化程式碼和國家地區
            m_SdtR.AddNewT().Value = " ";

            m_SdtR = m_SdtContentP.AddNewR();
            m_ctrpr = m_SdtR.AddNewRPr();
            rfonts = m_ctrpr.AddNewRFonts();
            rfonts.ascii = "新微軟雅黑";
            rfonts.eastAsia = "新微軟雅黑";
            m_ctrpr.AddNewSz().val = (ulong)FontSize;
            m_ctrpr.AddNewSzCs().val = (ulong)FontSize;
            m_SdtR.AddNewRPr().AddNewLang().val = "zh-CN"; //代表的是語言文化程式碼和國家地區
            rHighlight = new CT_Highlight();
            rHighlight.val = ST_HighlightColor.red;
            m_ctrpr.highlight = rHighlight;
            bBold = m_ctrpr.AddNewB();  //字型加粗
            bcsCold = m_ctrpr.AddNewBCs();
            bBold.val = true;
            bcsCold.val = true;
            rColor = m_ctrpr.AddNewColor();
            rColor.val = "white";
            m_SdtR.AddNewT().Value = " 專業,只為更好 ";

            m_SdtR = m_SdtContentP.AddNewR();
            m_ctrpr = m_SdtR.AddNewRPr();
            rfonts = m_ctrpr.AddNewRFonts();
            rfonts.ascii = "新微軟雅黑";
            rfonts.eastAsia = "新微軟雅黑";
            m_ctrpr.AddNewSz().val = (ulong)FontSize;
            m_ctrpr.AddNewSzCs().val = (ulong)FontSize;
            m_SdtR.AddNewRPr().AddNewLang().val = "zh-CN"; //代表的是語言文化程式碼和國家地區
            m_SdtR.AddNewT().Value = "";
            m_fldSimple.instr = " PAGE  \\* Arabic  \\* MERGEFORMAT ";
            m_SdtContentP.Items.Add(m_fldSimple);

            m_SdtR = m_SdtContentP.AddNewR();
            m_ctrpr = m_SdtR.AddNewRPr();
            rfonts = m_ctrpr.AddNewRFonts();
            rfonts.ascii = "新微軟雅黑";
            rfonts.eastAsia = "新微軟雅黑";
            m_ctrpr.AddNewSz().val = (ulong)FontSize;
            m_ctrpr.AddNewSzCs().val = (ulong)FontSize;
            m_ctrpr.AddNewLang().val = "zh-CN";
            m_SdtR.AddNewT().Value = "頁共";///
            m_fldSimple = new CT_SimpleField();
            m_fldSimple.instr = "NUMPAGES\\*Arabic\\*MERGEFORMAT";
            m_SdtContentP.Items.Add(m_fldSimple);

            m_SdtR = m_SdtContentP.AddNewR();
            m_ctrpr = m_SdtR.AddNewRPr();
            rfonts = m_ctrpr.AddNewRFonts();
            rfonts.ascii = "新微軟雅黑";
            rfonts.eastAsia = "新微軟雅黑";
            m_ctrpr.AddNewSz().val = (ulong)FontSize;
            m_ctrpr.AddNewSzCs().val = (ulong)FontSize;
            m_ctrpr.AddNewLang().val = "zh-CN";
            m_SdtR.AddNewT().Value = "";

            //建立頁尾關係
            //m_ftr.AddNewP().AddNewR().AddNewT().Value = "我是頁尾";
            XWPFRelation Frelation = XWPFRelation.FOOTER;
            XWPFFooter m_f = (XWPFFooter)document.CreateRelationship(Frelation,document.FooterList.Count + 1);
            //設定頁尾
            m_f.SetHeaderFooter(m_ftr);
            m_f.SetXWPFDocument(document);
            CT_HdrFtrRef m_HdrFtr1 = m_SectPr.AddNewFooterReference();
            m_HdrFtr1.type = [email protected];
            m_HdrFtr1.id = m_f.GetPackageRelationship().Id;
        }

三、建立段落 文字 表格 插入圖片 垂直合併單元格:

合併單元格查閱資料很多都是邊建立表格邊合併,這裡是建立完表格在合併

/// <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>
        /// <returns></returns>
        private static XWPFParagraph ParagraphInstanceSetting(XWPFDocument document,string fillContent,bool isBold,int fontSize,string fontFamily,string rgbStr,UnderlinePatterns value,ParagraphAlignment paragraphAlign,ParagraphAlignment secondParagraphAlign,int secondFontSize = 0,bool isStatement = false,string secondFillContent = "")
        {
            XWPFParagraph paragraph = document.CreateParagraph();//建立段落物件
            paragraph.Alignment = paragraphAlign;//文字顯示位置,段落排列(左對齊,居中,右對齊)

            XWPFRun xwpfRun = paragraph.CreateRun();//建立段落文字物件

            xwpfRun.IsBold = isBold;//文字加粗
            xwpfRun.SetText(fillContent);//填充內容
            xwpfRun.FontSize = fontSize;//設定文字大小
            xwpfRun.SetFontFamily(fontFamily,FontCharRange.None); //設定標題樣式如:(微軟雅黑,隸書,楷體)根據自己的需求而定
            xwpfRun.SetColor(rgbStr);//設定字型顏色--十六進位制
            xwpfRun.SetUnderline(value);//設定下劃線,列舉型別
            xwpfRun.AddTab();
            //第二個文字的樣式
            if (isStatement)
            {
                XWPFRun secondxwpfRun = paragraph.CreateRun();//建立段落文字物件
                secondxwpfRun.IsBold = isBold;//文字加粗
                secondxwpfRun.SetText(secondFillContent);//填充內容
                secondxwpfRun.FontSize = secondFontSize;//設定文字大小
                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 static XWPFParagraph SetTableParagraphInstanceSetting(XWPFDocument document,XWPFTable table,int textPosition = 24,bool isBold = false,int fontSize = 10,string fontColor = "000000",bool isItalic = false,UnderlinePatterns value = UnderlinePatterns.None,string secondFillContent = "")
        {
            var para = new CT_P();

            //設定單元格文字對齊
            para.AddNewPPr().AddNewTextAlignment();
            XWPFParagraph paragraph = new XWPFParagraph(para,table.Body);//建立表格中的段落物件
            paragraph.Alignment = paragraphAlign;

            XWPFRun xwpfRun = paragraph.CreateRun();//
            xwpfRun.SetText(fillContent);
            xwpfRun.FontSize = fontSize;//字型大小
            xwpfRun.SetColor(fontColor);//設定字型顏色--十六進位制
            xwpfRun.IsItalic = isItalic;//是否設定斜體(字型傾斜)
            xwpfRun.IsBold = isBold;//是否加粗
            xwpfRun.SetFontFamily("宋體",FontCharRange.None);//設定字型(如:微軟雅黑,華文楷體,宋體)
            xwpfRun.TextPosition = textPosition;//設定文字位置(設定兩行之間的行間),從而實現table的高度設定效果 
            xwpfRun.SetUnderline(value);//設定下劃線,列舉型別


            //第二個文字的樣式
            if (isStatement)
            {
                XWPFRun secondxwpfRun = paragraph.CreateRun();//建立段落文字物件
                secondxwpfRun.SetText(secondFillContent);
                secondxwpfRun.FontSize = secondFontSize;//字型大小
                secondxwpfRun.SetColor(fontColor);//設定字型顏色--十六進位制
                secondxwpfRun.IsItalic = isItalic;//是否設定斜體(字型傾斜)
                secondxwpfRun.IsBold = isBold;//是否加粗
                secondxwpfRun.SetFontFamily("宋體",宋體)
                secondxwpfRun.TextPosition = textPosition;//設定文字位置(設定兩行之間的行間),從而實現table的高度設定效果 
                secondxwpfRun.SetUnderline(value);//設定下劃線,列舉型別
            }
            return paragraph;
        }

        /// <summary>
        /// Table中插入圖片
        /// </summary>
        /// <param name="document">document文件物件</param> 
        /// <param name="table">表格物件</param> 
        /// <param name="path">路徑</param> 
        private static XWPFParagraph SetWritePicture(XWPFDocument document,string path,NPOI.XWPF.UserModel.PictureType type,int widthEmus,int heightEmus)
        {
            var para = new CT_P();
            XWPFParagraph xwpfPicture = new XWPFParagraph(para,table.Body);//建立表格中的段落物件
            xwpfPicture.Alignment = paragraphAlign;
            XWPFRun runPicture = xwpfPicture.CreateRun();

            using (FileStream picData = new FileStream(path,FileMode.Open,FileAccess.Read))
            {
                runPicture.AddPicture(picData,(int)type,"11.png",widthEmus,heightEmus);
            }
            //為了解決Npoi版本Bug
            CT_Inline inline = runPicture.GetCTR().GetDrawingList()[0].inline[0];
            inline.docPr.id = 1;
            return xwpfPicture;
        }
        /// <summary>
        /// 垂直合併單元格(先建立表格後合併)
        /// </summary>
        /// <param name="table"></param>
        /// <param name="fromCol"></param>
        /// <param name="toCol"></param>
        /// <param name="fromRow"></param>
        /// <param name="toRow"></param>
        /// <returns></returns>
        public static void MYMergeCells(XWPFTable table,int fromCol,int toCol,int fromRow,int toRow)
        {
            for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++)
            {
                if (fromCol < toCol)
                {
                    table.GetRow(rowIndex).MergeCells(fromCol,toCol);
                }
                XWPFTableCell rowcell = table.GetRow(rowIndex).GetCell(fromCol);
                CT_Tc cttc = rowcell.GetCTTc();
                if (cttc.tcPr == null)
                {
                    cttc.AddNewTcPr();
                }
                if (rowIndex == fromRow)
                {
                    // The first merged cell is set with RESTART merge value  
                    rowcell.GetCTTc().tcPr.AddNewVMerge().val = ST_Merge.restart;
                }
                else
                {
                    // Cells which join (merge) the first one,are set with CONTINUE  
                    rowcell.GetCTTc().tcPr.AddNewVMerge().val = [email protected];
                }
            }
        }
/// <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>
        /// <returns></returns>
        private static XWPFParagraph ParagraphInstanceSetting(XWPFDocument document,are set with CONTINUE  
                    rowcell.GetCTTc().tcPr.AddNewVMerge().val = [email protected];
                }
            }
        }

四、 生成Word,RowIndex(根據資料判斷達到XX行或它的倍數就直接換頁)

       int TableIndex = 0;
            int DocIndex = 0;
            int RowIndex = 5;
            //通過使用檔案流,建立檔案流物件,向檔案流中寫入內容,並儲存為Word文件格式
            using (var stream = new FileStream(Path.Combine(uploadPath,fileName),FileMode.Create,FileAccess.Write))
            {
                //建立document文件物件物件例項
                XWPFDocument document = new XWPFDocument();
                document.Document.body.sectPr = new CT_SectPr();
                CT_SectPr m_SectPr = document.Document.body.sectPr;
                m_SectPr.pgSz.h = (ulong)16838;
                m_SectPr.pgSz.w = (ulong)11906;
                m_SectPr.pgMar.left = (ulong)1000;//左邊距
                m_SectPr.pgMar.right = (ulong)1000;//右邊距
                m_SectPr.pgMar.top ="20";
                m_SectPr.pgMar.bottom = "20";
                //建立頁尾   帶頁碼(第幾頁 共幾頁)
                CreateFooter(document,m_SectPr,Entity);
                //建立頁首
                CreateHeader(document,Entity);
                ////文字標題
                document.SetParagraph(ParagraphInstanceSetting(document,"",true,15,"微軟雅黑","",UnderlinePatterns.None,ParagraphAlignment.CENTER,ParagraphAlignment.RIGHT),DocIndex++);
                document.SetParagraph(ParagraphInstanceSetting(document,"",false,14,ParagraphAlignment.RIGHT,10,""),DocIndex++);
                #region  Table0
                XWPFTable zeroXwpfTable = document.CreateTable(2,3);//顯示的行列數rows:3行,cols:4列
                CT_Tbl zeroTable = document.Document.body.GetTblArray()[TableIndex++];
                zeroTable.AddNewTblPr().jc = new CT_Jc();
                zeroTable.AddNewTblPr().jc.val = ST_Jc.center;//表在頁面水平居中
                zeroTable.AddNewTblPr().AddNewTblW().w = "9000";//表寬度
                zeroTable.AddNewTblPr().AddNewTblW().type = ST_TblWidth.dxa;
                CT_TcPr zeroPr = zeroXwpfTable.GetRow(0).GetCell(0).GetCTTc().AddNewTcPr();

                zeroPr.tcW = new CT_TblWidth();
                zeroPr.tcW.w = "3500";//單元格寬
                zeroPr.tcW.type = ST_TblWidth.dxa;
                zeroPr = zeroXwpfTable.GetRow(0).GetCell(1).GetCTTc().AddNewTcPr();
                zeroPr.tcW = new CT_TblWidth();
                zeroPr.tcW.w = "1000";//單元格寬
                zeroPr.tcW.type = ST_TblWidth.dxa;
                zeroPr = zeroXwpfTable.GetRow(0).GetCell(2).GetCTTc().AddNewTcPr();
                zeroPr.tcW = new CT_TblWidth();
                zeroPr.tcW.w = "4000";//單元格寬
                zeroPr.tcW.type = ST_TblWidth.dxa;

                zeroXwpfTable.SetBottomBorder(XWPFBorderType.NONE,1,0,null);
                zeroXwpfTable.SetLeftBorder(XWPFBorderType.NONE,null);
                zeroXwpfTable.SetTopBorder(XWPFBorderType.NONE,null);
                zeroXwpfTable.SetRightBorder(XWPFBorderType.NONE,null);
                zeroXwpfTable.SetInsideHBorder(XWPFBorderType.NONE,null);
                zeroXwpfTable.SetInsideVBorder(XWPFBorderType.NONE,null);
                MYMergeCells(zeroXwpfTable,2,2,1);
                zeroXwpfTable.GetRow(0).GetCell(0).SetVerticalAlignment(XWPFVertAlign.CENTER);
                zeroXwpfTable.GetRow(1).GetCell(0).SetVerticalAlignment(XWPFVertAlign.CENTER);
                zeroXwpfTable.GetRow(1).GetCell(2).SetVerticalAlignment(XWPFVertAlign.CENTER);
                zeroXwpfTable.GetRow(0).GetCell(0).SetColor("#E12826");
                zeroXwpfTable.GetRow(1).GetCell(0).SetColor("#E12826");

                zeroXwpfTable.GetRow(0).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document,zeroXwpfTable," 報價單編號",ParagraphAlignment.LEFT,8,"white",7,true,Entity.quotationNumber.ToString()));
                zeroXwpfTable.GetRow(0).GetCell(2).SetParagraph(SetWritePicture(document,"F:\\2.PNG".ToString(),NPOI.XWPF.UserModel.PictureType.PNG,130 * 9525,37 * 9525));
                zeroXwpfTable.GetRow(1).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document," 客戶名稱 ",Entity.customerName.ToString()));
                #endregion
                document.SetParagraph(ParagraphInstanceSetting(document,DocIndex++);
                if (Entity.quoteExport == 1)
                {
                    #region  Table1
                    XWPFTable firstXwpfTable = document.CreateTable(4,2);
                    CT_Tbl firstTable = document.Document.body.GetTblArray()[TableIndex++];
                    firstTable.AddNewTblPr().jc = new CT_Jc();
                    firstTable.AddNewTblPr().jc.val = ST_Jc.center;//表在頁面水平居中
                    firstTable.AddNewTblPr().AddNewTblW().w = "9000";//表寬度
                    firstTable.AddNewTblPr().AddNewTblW().type = ST_TblWidth.dxa;
                    CT_TcPr firstPr = firstXwpfTable.GetRow(0).GetCell(0).GetCTTc().AddNewTcPr();
                    firstPr.tcW = new CT_TblWidth();
                    firstPr.tcW.w = "5000";//單元格寬
                    firstPr.tcW.type = ST_TblWidth.dxa;
                    firstPr = firstXwpfTable.GetRow(0).GetCell(1).GetCTTc().AddNewTcPr();
                    firstPr.tcW = new CT_TblWidth();
                    firstPr.tcW.w = "3000";//單元格寬
                    firstPr.tcW.type = ST_TblWidth.dxa;
                    firstXwpfTable.SetBottomBorder(XWPFBorderType.NONE,null);
                    firstXwpfTable.SetLeftBorder(XWPFBorderType.NONE,null);
                    firstXwpfTable.SetTopBorder(XWPFBorderType.NONE,null);
                    firstXwpfTable.SetRightBorder(XWPFBorderType.NONE,null);
                    firstXwpfTable.SetInsideHBorder(XWPFBorderType.NONE,null);
                    firstXwpfTable.SetInsideVBorder(XWPFBorderType.NONE,null);
                    firstXwpfTable.GetRow(0).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document,firstXwpfTable,"報價單生成日期","#ff0000"));
                    firstXwpfTable.GetRow(0).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document,"付款方式","#ff0000"));
                    firstXwpfTable.GetRow(1).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document,Entity.createTime.ToString(),40,10));
                    firstXwpfTable.GetRow(1).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document,Entity.payTypeName.ToString(),10));
                    firstXwpfTable.GetRow(2).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document,"報價單有效期至","#ff0000"));
                    firstXwpfTable.GetRow(2).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document,"預計供貨週期","#ff0000"));
                    firstXwpfTable.GetRow(3).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document,10));
                    firstXwpfTable.GetRow(3).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document,Entity.supplyTime.ToString(),10));
                    document.SetParagraph(ParagraphInstanceSetting(document,"                                                                                                                    ","#ff0000",UnderlinePatterns.Single,DocIndex++);
                    document.SetParagraph(ParagraphInstanceSetting(document," ",DocIndex++);
                    #endregion
                    RowIndex += 6;
                }
                if (Entity.customerExport == 1)
                {
                    #region Table2
                    XWPFTable SecondXwpfTable = document.CreateTable(4,2);
                    CT_Tbl secondTable = document.Document.body.GetTblArray()[TableIndex++];
                    secondTable.AddNewTblPr().jc = new CT_Jc();
                    secondTable.AddNewTblPr().jc.val = ST_Jc.center;//表在頁面水平居中
                    secondTable.AddNewTblPr().AddNewTblW().w = "9000";//表寬度
                    secondTable.AddNewTblPr().AddNewTblW().type = ST_TblWidth.dxa;
                    CT_TcPr secondPr = SecondXwpfTable.GetRow(0).GetCell(0).GetCTTc().AddNewTcPr();
                    secondPr.tcW = new CT_TblWidth();
                    secondPr.tcW.w = "6000";//單元格寬
                    secondPr.tcW.type = ST_TblWidth.dxa;
                    secondPr = SecondXwpfTable.GetRow(0).GetCell(1).GetCTTc().AddNewTcPr();
                    secondPr.tcW = new CT_TblWidth();
                    secondPr.tcW.w = "3000";//單元格寬
                    secondPr.tcW.type = ST_TblWidth.dxa;
                    SecondXwpfTable.SetBottomBorder(XWPFBorderType.NONE,null);
                    SecondXwpfTable.SetLeftBorder(XWPFBorderType.NONE,null);
                    SecondXwpfTable.SetTopBorder(XWPFBorderType.NONE,null);
                    SecondXwpfTable.SetRightBorder(XWPFBorderType.NONE,null);
                    SecondXwpfTable.SetInsideHBorder(XWPFBorderType.NONE,null);
                    SecondXwpfTable.SetInsideVBorder(XWPFBorderType.NONE,null);

                    SecondXwpfTable.GetRow(0).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document,SecondXwpfTable,"收貨地址",20,9,"#ff0000"));
                    SecondXwpfTable.GetRow(1).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document,"客戶名稱:" + Entity.customerName.ToString() + "",30,""));
                    SecondXwpfTable.GetRow(2).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document,"專案地址:" + Entity.boName.ToString() + "",""));
                    SecondXwpfTable.GetRow(2).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document,"聯絡人:" + Entity.customerLinkName.ToString() + "",""));
                    SecondXwpfTable.GetRow(3).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document,"地    址:" + Entity.customerAddress.ToString() + "",""));
                    SecondXwpfTable.GetRow(3).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document,"電話:" + Entity.customerPhone.ToString() + "",DocIndex++);
                    RowIndex += 6;
                    #endregion
                }
                if (Entity.lenovoExport == 1)
                {
                    #region Table3

                    XWPFTable ThreeXwpfTable = document.CreateTable(2,3);
                    CT_Tbl threeTable = document.Document.body.GetTblArray()[TableIndex++];
                    threeTable.AddNewTblPr().jc = new CT_Jc();
                    threeTable.AddNewTblPr().jc.val = ST_Jc.center;//表在頁面水平居中
                    threeTable.AddNewTblPr().AddNewTblW().w = "9000";//表寬度
                    threeTable.AddNewTblPr().AddNewTblW().type = ST_TblWidth.dxa;
                    CT_TcPr threePr = ThreeXwpfTable.GetRow(0).GetCell(0).GetCTTc().AddNewTcPr();
                    threePr.tcW = new CT_TblWidth();
                    threePr.tcW.w = "3000";//單元格寬
                    threePr.tcW.type = ST_TblWidth.dxa;
                    threePr = ThreeXwpfTable.GetRow(0).GetCell(1).GetCTTc().AddNewTcPr();
                    threePr.tcW = new CT_TblWidth();
                    threePr.tcW.w = "3000";//單元格寬
                    threePr.tcW.type = ST_TblWidth.dxa;
                    threePr = ThreeXwpfTable.GetRow(0).GetCell(2).GetCTTc().AddNewTcPr();
                    threePr.tcW = new CT_TblWidth();
                    threePr.tcW.w = "3000";//單元格寬
                    threePr.tcW.type = ST_TblWidth.dxa;
                    ThreeXwpfTable.SetBottomBorder(XWPFBorderType.NONE,null);
                    ThreeXwpfTable.SetLeftBorder(XWPFBorderType.NONE,null);
                    ThreeXwpfTable.SetTopBorder(XWPFBorderType.NONE,null);
                    ThreeXwpfTable.SetRightBorder(XWPFBorderType.NONE,null);
                    ThreeXwpfTable.SetInsideHBorder(XWPFBorderType.NONE,null);
                    ThreeXwpfTable.SetInsideVBorder(XWPFBorderType.NONE,null);
                    ThreeXwpfTable.GetRow(0).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document,ThreeXwpfTable,"客戶經理","#ff0000"));
                    ThreeXwpfTable.GetRow(0).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document,"聯絡電話","#ff0000"));
                    ThreeXwpfTable.GetRow(0).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document,"客戶經理郵箱","#ff0000"));
                    ThreeXwpfTable.GetRow(1).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document,Entity.lenovoLinkName.ToString(),""));
                    ThreeXwpfTable.GetRow(1).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document,Entity.lenovoPhone.ToString(),""));
                    ThreeXwpfTable.GetRow(1).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document,Entity.lenovoEmail.ToString(),""));
                    document.SetParagraph(ParagraphInstanceSetting(document,DocIndex++);

                    RowIndex += 3;
                    #endregion
                }
                if (Entity.invoiceExport == 1)
                {
                    #region Table

                    XWPFTable Table = document.CreateTable(2,3);
                    CT_Tbl CtTable = document.Document.body.GetTblArray()[TableIndex++];
                    CtTable.AddNewTblPr().jc = new CT_Jc();
                    CtTable.AddNewTblPr().jc.val = ST_Jc.center;//表在頁面水平居中
                    CtTable.AddNewTblPr().AddNewTblW().w = "9000";//表寬度
                    CtTable.AddNewTblPr().AddNewTblW().type = ST_TblWidth.dxa;
                    CT_TcPr CtPr = Table.GetRow(0).GetCell(0).GetCTTc().AddNewTcPr();
                    CtPr.tcW = new CT_TblWidth();
                    CtPr.tcW.w = "3000";//單元格寬
                    CtPr.tcW.type = ST_TblWidth.dxa;
                    CtPr = Table.GetRow(0).GetCell(1).GetCTTc().AddNewTcPr();
                    CtPr.tcW = new CT_TblWidth();
                    CtPr.tcW.w = "3000";//單元格寬
                    CtPr.tcW.type = ST_TblWidth.dxa;
                    CtPr = Table.GetRow(0).GetCell(2).GetCTTc().AddNewTcPr();
                    CtPr.tcW = new CT_TblWidth();
                    CtPr.tcW.w = "3000";//單元格寬
                    CtPr.tcW.type = ST_TblWidth.dxa;
                    Table.SetBottomBorder(XWPFBorderType.NONE,null);
                    Table.SetLeftBorder(XWPFBorderType.NONE,null);
                    Table.SetTopBorder(XWPFBorderType.NONE,null);
                    Table.SetRightBorder(XWPFBorderType.NONE,null);
                    Table.SetInsideHBorder(XWPFBorderType.NONE,null);
                    Table.SetInsideVBorder(XWPFBorderType.NONE,null);
                    Table.GetRow(0).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document,Table,"發票形式","#ff0000"));
                    Table.GetRow(0).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document,"發票收取方式","#ff0000"));
                    Table.GetRow(1).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document,Entity.InvoiceType.ToString(),""));
                    Table.GetRow(1).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document,Entity.InvoiceReceiveTypeName.ToString(),DocIndex++);
                    RowIndex += 3;
                    #endregion
                }
                #region Table4 價格彙總
                document.SetParagraph(ParagraphInstanceSetting(document,"|價格彙總",DocIndex++);
                XWPFTable FourXwpfTable = document.CreateTable(product.Count + 2,5);
                CT_Tbl FourTable = document.Document.body.GetTblArray()[TableIndex++];
                FourTable.AddNewTblPr().jc = new CT_Jc();
                FourTable.AddNewTblPr().jc.val = ST_Jc.center;//表在頁面水平居中
                FourTable.AddNewTblPr().AddNewTblW().w = "9000";//表寬度
                FourTable.AddNewTblPr().AddNewTblW().type = ST_TblWidth.dxa;
                CT_TcPr fourPr = FourXwpfTable.GetRow(0).GetCell(2).GetCTTc().AddNewTcPr();
                fourPr.tcW = new CT_TblWidth();
                fourPr.tcW.w = "1000";//單元格寬
                fourPr.tcW.type = ST_TblWidth.dxa;
                fourPr = FourXwpfTable.GetRow(0).GetCell(3).GetCTTc().AddNewTcPr();
                fourPr.tcW = new CT_TblWidth();
                fourPr.tcW.w = "1000";//單元格寬
                fourPr.tcW.type = ST_TblWidth.dxa;
                fourPr = FourXwpfTable.GetRow(0).GetCell(4).GetCTTc().AddNewTcPr();
                fourPr.tcW = new CT_TblWidth();
                fourPr.tcW.w = "1000";//單元格寬
                fourPr.tcW.type = ST_TblWidth.dxa;
                #region  設定樣式
                FourXwpfTable.SetBottomBorder(XWPFBorderType.NONE,13,"pink");
                FourXwpfTable.SetLeftBorder(XWPFBorderType.SINGLE,"pink");
                FourXwpfTable.SetTopBorder(XWPFBorderType.SINGLE,"pink");
                FourXwpfTable.SetRightBorder(XWPFBorderType.SINGLE,"pink");
                FourXwpfTable.SetInsideHBorder(XWPFBorderType.SINGLE,"pink");
                FourXwpfTable.SetInsideVBorder(XWPFBorderType.SINGLE,"pink");
                FourXwpfTable.GetRow(0).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document,FourXwpfTable,"產品名稱",""));
                FourXwpfTable.GetRow(0).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document,"配置",""));
                FourXwpfTable.GetRow(0).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document,"數量",""));
                FourXwpfTable.GetRow(0).GetCell(3).SetParagraph(SetTableParagraphInstanceSetting(document,"單價(含稅)",""));
                FourXwpfTable.GetRow(0).GetCell(4).SetParagraph(SetTableParagraphInstanceSetting(document,"金額(含稅)",""));
                RowIndex += 3;
                #endregion
                int Num = 0;
                int TotalPrice = 0;
                int RowNum = 0;
                for (int i = 0; i < product.Count(); i++)
                {
                    Num += product[i].quantity;
                    TotalPrice += product[i].quantity * product[i].productPrice;
                    FourXwpfTable.GetRow(i + 1).GetCell(4).SetColor("#EEEEEE");

                    for (int w = 18; w <= product[i].productName.ToString().Length; w++)
                    {
                        if (w % 18 == 0)
                        {
                            product[i].productName= product[i].productName.ToString().Insert(w," ");
                        }
                    }
                    for (int t = 18; t <= product[i].majorParts.ToString().Length; t++)
                    {
                        if (t % 18 == 0)
                        {
                            product[i].majorParts = product[i].majorParts.ToString().Insert(t," ");
                        }
                    }
                    if (product[i].productName.ToString().Length >= product[i].majorParts.ToString().Length)
                    {
                        RowIndex += Convert.ToInt32(product[i].productName.ToString().Length / 18) + ((product[i].productName.ToString().Length % 18) > 0 ? 1 : 0);
                        RowNum = Convert.ToInt32(product[i].productName.ToString().Length / 18) + ((product[i].productName.ToString().Length % 18) > 0 ? 1 : 0);
                    }
                    else
                    {
                        RowIndex += Convert.ToInt32(product[i].majorParts.ToString().Length / 18) + ((product[i].productName.ToString().Length % 18) > 0 ? 1 : 0);
                        RowNum = Convert.ToInt32(product[i].majorParts.ToString().Length / 18) + ((product[i].productName.ToString().Length % 18) > 0 ? 1 : 0);
                    }
                    if (RowIndex > 40 && RowIndex <= 45)
                    {
                        RowIndex = 0;
                        document.SetParagraph(BreakPage(document),DocIndex++);
                    }
                    else if (RowIndex > 45)
                    {
                        RowIndex = RowIndex - RowNum;
                        document.SetParagraph(BreakPage(document),DocIndex++);
                        RowIndex = 0;
                        RowIndex += RowNum;
                    }
                    FourXwpfTable.GetRow(i + 1).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document,product[i].productName.ToString(),-10,""));
                    FourXwpfTable.GetRow(i + 1).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document,product[i].majorParts.ToString(),""));
                    FourXwpfTable.GetRow(i + 1).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document,product[i].quantity.ToString(),""));
                    FourXwpfTable.GetRow(i + 1).GetCell(3).SetParagraph(SetTableParagraphInstanceSetting(document,product[i].productPrice.ToString(),""));
                    FourXwpfTable.GetRow(i + 1).GetCell(4).SetParagraph(SetTableParagraphInstanceSetting(document,"¥" + product[i].productTotalPrice.ToString(),""));
                }
                FourXwpfTable.GetRow(product.Count() + 1).GetCell(0).SetBorderRight(XWPFBorderType.NONE,1,null);
                FourXwpfTable.GetRow(product.Count() + 1).GetCell(1).SetBorderRight(XWPFBorderType.NONE,null);
                FourXwpfTable.GetRow(product.Count() + 1).GetCell(2).SetBorderRight(XWPFBorderType.NONE,null);
                FourXwpfTable.GetRow(product.Count() + 1).GetCell(3).SetBorderRight(XWPFBorderType.NONE,null);
                FourXwpfTable.GetRow(product.Count() + 1).GetCell(4).SetBorderRight(XWPFBorderType.NONE,null);
                FourXwpfTable.GetRow(product.Count() + 1).GetCell(0).SetBorderLeft(XWPFBorderType.NONE,null);
                FourXwpfTable.GetRow(product.Count() + 1).GetCell(1).SetBorderLeft(XWPFBorderType.NONE,null);
                FourXwpfTable.GetRow(product.Count() + 1).GetCell(2).SetBorderLeft(XWPFBorderType.NONE,null);
                FourXwpfTable.GetRow(product.Count() + 1).GetCell(3).SetBorderLeft(XWPFBorderType.NONE,null);
                FourXwpfTable.GetRow(product.Count() + 1).GetCell(4).SetBorderLeft(XWPFBorderType.SINGLE,13,"pink");
                FourXwpfTable.GetRow(product.Count() + 1).GetCell(4).SetBorderRight(XWPFBorderType.SINGLE,"pink");
                FourXwpfTable.GetRow(product.Count() + 1).GetCell(4).SetBorderBottom(XWPFBorderType.SINGLE,"pink");
                FourXwpfTable.GetRow(product.Count() + 1).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document,""));
                FourXwpfTable.GetRow(product.Count() + 1).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document,""));
                FourXwpfTable.GetRow(product.Count() + 1).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document,""));
                FourXwpfTable.GetRow(product.Count() + 1).GetCell(3).SetParagraph(SetTableParagraphInstanceSetting(document,"總計(含稅)",""));
                FourXwpfTable.GetRow(product.Count() + 1).GetCell(4).SetParagraph(SetTableParagraphInstanceSetting(document,"¥" + TotalPrice.ToString(),""));
                FourXwpfTable.GetRow(product.Count() + 1).GetCell(4).SetColor("#EEEEEE");
                FourXwpfTable.GetRow(product.Count()).GetCell(0).SetBorderBottom(XWPFBorderType.SINGLE,"pink");
                FourXwpfTable.GetRow(product.Count()).GetCell(1).SetBorderBottom(XWPFBorderType.SINGLE,"pink");
                FourXwpfTable.GetRow(product.Count()).GetCell(2).SetBorderBottom(XWPFBorderType.SINGLE,"pink");
                FourXwpfTable.GetRow(product.Count()).GetCell(3).SetBorderBottom(XWPFBorderType.SINGLE,"pink");
                FourXwpfTable.GetRow(product.Count()).GetCell(4).SetBorderBottom(XWPFBorderType.SINGLE,"pink");

                document.SetParagraph(ParagraphInstanceSetting(document,DocIndex++);

                #endregion
                #region Table5  溫馨提示
                document.SetParagraph(ParagraphInstanceSetting(document,"|溫馨提示",DocIndex++);
                XWPFTable FiveXwpfTable = document.CreateTable(3,1);
                CT_Tbl fiveTable = document.Document.body.GetTblArray()[TableIndex++];
                fiveTable.AddNewTblPr().jc = new CT_Jc();
                fiveTable.AddNewTblPr().jc.val = ST_Jc.center;//表在頁面水平居中
                fiveTable.AddNewTblPr().AddNewTblW().w = "9000";//表寬度
                fiveTable.AddNewTblPr().AddNewTblW().type = ST_TblWidth.dxa;
                CT_TcPr fivePr = FiveXwpfTable.GetRow(0).GetCell(0).GetCTTc().AddNewTcPr();
                fivePr.tcW = new CT_TblWidth();
                fivePr.tcW.w = "9000";//單元格寬
                fivePr.tcW.type = ST_TblWidth.dxa;
                FiveXwpfTable.SetBottomBorder(XWPFBorderType.SINGLE,"pink");
                FiveXwpfTable.SetLeftBorder(XWPFBorderType.SINGLE,"pink");
                FiveXwpfTable.SetTopBorder(XWPFBorderType.SINGLE,"pink");
                FiveXwpfTable.SetRightBorder(XWPFBorderType.SINGLE,"pink");
                FiveXwpfTable.SetInsideHBorder(XWPFBorderType.SINGLE,"pink");
                FiveXwpfTable.SetInsideVBorder(XWPFBorderType.SINGLE,"pink");
                FiveXwpfTable.GetRow(1).GetCell(0).SetBorderTop(XWPFBorderType.NONE,null);
                FiveXwpfTable.GetRow(2).GetCell(0).SetBorderTop(XWPFBorderType.NONE,null);
                FiveXwpfTable.GetRow(1).GetCell(0).SetBorderBottom(XWPFBorderType.NONE,null);
                FiveXwpfTable.GetRow(0).GetCell(0).SetBorderBottom(XWPFBorderType.NONE,null);
                FiveXwpfTable.GetRow(0).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document,FiveXwpfTable,""));
                FiveXwpfTable.GetRow(1).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document,""));
                FiveXwpfTable.GetRow(2).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document,""));

                document.SetParagraph(BreakPage(document),DocIndex++);
                #endregion
                #region  Table6
                document.SetParagraph(ParagraphInstanceSetting(document,"|報價單描述",DocIndex++);

                for (int k = 0; k < Entity.projects.Count(); k++)
                {
                    for (int i = 0; i < Entity.projects[k].products.Count(); i++)
                    {
                        if (Entity.projects[k].products[i].parts.Count() == 0)
                        {
                            continue;
                        }
                        XWPFTable SixXwpfTable = document.CreateTable(Entity.projects[k].products[i].parts.Count() + 3,5);//顯示的行列數rows:3行,cols:4列
                        CT_Tbl sixTable = document.Document.body.GetTblArray()[TableIndex++];
                        sixTable.AddNewTblPr().jc = new CT_Jc();
                        sixTable.AddNewTblPr().jc.val = ST_Jc.center;//表在頁面水平居中
                        sixTable.AddNewTblPr().AddNewTblW().w = "9000";//表寬度
                        sixTable.AddNewTblPr().AddNewTblW().type = ST_TblWidth.dxa;
                        CT_TcPr sixPr = SixXwpfTable.GetRow(0).GetCell(0).GetCTTc().AddNewTcPr();
                        sixPr.tcW = new CT_TblWidth();
                        sixPr.tcW.w = "3000";//單元格寬
                        sixPr.tcW.type = ST_TblWidth.dxa;
                        sixPr = SixXwpfTable.GetRow(0).GetCell(1).GetCTTc().AddNewTcPr();
                        sixPr.tcW = new CT_TblWidth();
                        sixPr.tcW.w = "2000";//單元格寬
                        sixPr.tcW.type = ST_TblWidth.dxa;
                        sixPr = SixXwpfTable.GetRow(0).GetCell(2).GetCTTc().AddNewTcPr();
                        sixPr.tcW = new CT_TblWidth();
                        sixPr.tcW.w = "1500";//單元格寬
                        sixPr.tcW.type = ST_TblWidth.dxa;
                        sixPr = SixXwpfTable.GetRow(0).GetCell(3).GetCTTc().AddNewTcPr();
                        sixPr.tcW = new CT_TblWidth();
                        sixPr.tcW.w = "1500";//單元格寬
                        sixPr.tcW.type = ST_TblWidth.dxa;
                        sixPr = SixXwpfTable.GetRow(0).GetCell(4).GetCTTc().AddNewTcPr();
                        sixPr.tcW = new CT_TblWidth();
                        sixPr.tcW.w = "1000";//單元格寬
                        sixPr.tcW.type = ST_TblWidth.dxa;
                        SixXwpfTable.SetBottomBorder(XWPFBorderType.NONE,null);
                        SixXwpfTable.SetLeftBorder(XWPFBorderType.NONE,null);
                        SixXwpfTable.SetTopBorder(XWPFBorderType.NONE,null);
                        SixXwpfTable.SetRightBorder(XWPFBorderType.NONE,null);
                        SixXwpfTable.SetInsideHBorder(XWPFBorderType.NONE,null);
                        SixXwpfTable.SetInsideVBorder(XWPFBorderType.NONE,null);
                        MYMergeCells(SixXwpfTable,0,Entity.projects[k].products[i].parts.Count() + 2);
                        MYMergeCells(SixXwpfTable,1);

                        //if (fileJArray.fsp.bomPic.Where(p => p.bomCode == Entity.projects[k].products[i].bomCode).Count() > 0)
                        //{
                        //    SixXwpfTable.GetRow(0).GetCell(0).SetParagraph(SetWritePicture(document,SixXwpfTable,fileJArray.fsp.bomPic.Where(p => p.bomCode == Entity.projects[k].products[i].bomCode).FirstOrDefault().bomPic,NPOI.XWPF.UserModel.PictureType.JPEG,170 * 9525,170 * 9525));
                        //}
                        //else
                        //{
                        SixXwpfTable.GetRow(0).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document,"#ff0000"));
                        //}
                        SixXwpfTable.GetRow(0).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document,""));
                        SixXwpfTable.GetRow(0).GetCell(3).SetParagraph(SetTableParagraphInstanceSetting(document,"單價",""));
                        SixXwpfTable.GetRow(0).GetCell(4).SetParagraph(SetTableParagraphInstanceSetting(document,"金額",""));
                        SixXwpfTable.GetRow(0).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document,Entity.projects[k].products[i].productName.ToString(),"#ff0000"));
                        SixXwpfTable.GetRow(1).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document,Entity.projects[k].products[i].quantity.ToString(),""));
                        SixXwpfTable.GetRow(1).GetCell(3).SetParagraph(SetTableParagraphInstanceSetting(document,Entity.projects[k].products[i].productPrice.ToString(),""));
                        SixXwpfTable.GetRow(1).GetCell(4).SetParagraph(SetTableParagraphInstanceSetting(document,Entity.projects[k].products[i].productTotalPrice.ToString(),""));
                        // SixXwpfTable.GetRow(1).GetCell(1).AddParagraph().CreateRun();

                        SixXwpfTable.GetRow(2).MergeCells(1,2);
                        SixXwpfTable.GetRow(2).MergeCells(2,3);
                        SixXwpfTable.GetRow(2).GetCell(1).SetColor("#EEEEEE");
                        SixXwpfTable.GetRow(2).GetCell(2).SetColor("#EEEEEE");
                        SixXwpfTable.GetRow(2).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document,"標籤",""));
                        SixXwpfTable.GetRow(2).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document,"描述",""));

                        for (int s = 0; s < Entity.projects[k].products[i].parts.Count(); s++)
                        {
                            SixXwpfTable.GetRow(3 + s).MergeCells(1,2);
                            SixXwpfTable.GetRow(3 + s).MergeCells(2,3);
                            SixXwpfTable.GetRow(3 + s).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document,Entity.projects[k].products[i].parts[s].r3Name.ToString(),""));
                            SixXwpfTable.GetRow(3 + s).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document,Entity.projects[k].products[i].parts[s].r3VName.ToString(),""));
                        }
                        document.SetParagraph(ParagraphInstanceSetting(document,DocIndex++);
                        document.SetParagraph(ParagraphInstanceSetting(document,DocIndex++);
                    }
                }
                #endregion
                //#region 廣告位
                //document.SetParagraph(ParagraphInstanceSetting(document," ",false,14,"微軟雅黑","",10,""),DocIndex++);
                //document.SetParagraph(ParagraphInstanceSetting(document,"|增值服務 ",true,15,"#ff0000",DocIndex++);
                //XWPFTable ImageXwpfTable = document.CreateTable(1,1);
                //CT_Tbl ImageTable = document.Document.body.GetTblArray()[TableIndex++];
                //ImageTable.AddNewTblPr().jc = new CT_Jc();
                //ImageTable.AddNewTblPr().jc.val = ST_Jc.center;//表在頁面水平居中
                //ImageTable.AddNewTblPr().AddNewTblW().w = "9000";//表寬度
                //ImageTable.AddNewTblPr().AddNewTblW().type = ST_TblWidth.dxa;
                //CT_TcPr ImagePr = ImageXwpfTable.GetRow(0).GetCell(0).GetCTTc().AddNewTcPr();
                //ImagePr.tcW = new CT_TblWidth();
                //ImagePr.tcW.w = "9000";//單元格寬
                //ImagePr.tcW.type = ST_TblWidth.dxa;
                //ImageXwpfTable.SetBottomBorder(XWPFBorderType.NONE,13,"pink");
                //ImageXwpfTable.SetLeftBorder(XWPFBorderType.NONE,"pink");
                //ImageXwpfTable.SetTopBorder(XWPFBorderType.NONE,"pink");
                //ImageXwpfTable.SetRightBorder(XWPFBorderType.NONE,"pink");
                //ImageXwpfTable.SetInsideHBorder(XWPFBorderType.NONE,1,"pink");
                //ImageXwpfTable.SetInsideVBorder(XWPFBorderType.NONE,"pink");
                //ImageXwpfTable.GetRow(0).GetCell(0).SetParagraph(SetWritePicture(document,ImageXwpfTable,fileJArray.fsp.adImage.Count() > 0 ? fileJArray.fsp.adImage : "",600 * 9525,1000 * 9525));
                #endregion
                document.Write(stream);
                filePath = Path.Combine(uploadPath,fileName);
            }

總結:

   經歷了小一週的摸索,為了實現想要的樣子,通過不斷查閱與自己的理解終於達到了想要的效果,感謝那些寫資料的人讓我少走一些彎路,在這裡記錄下自己的一些收穫,心得分享給大家,希望會幫助到大家

RowIndex