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 = ST_HdrFtr.@default; 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 = ST_HdrFtr.@default; 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, CT_SectPr m_SectPr, 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, 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 = ST_HdrFtr.@default; 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, string fillContent, ParagraphAlignment paragraphAlign, int textPosition = 24, bool isBold = false, int fontSize = 10, string fontColor = "000000", bool isItalic = false, UnderlinePatterns value = UnderlinePatterns.None, int secondFontSize = 0, bool isStatement = false, 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("宋體", FontCharRange.None);//設置字體(如:微軟雅黑,華文楷體,宋體) 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, XWPFTable table, string path, ParagraphAlignment paragraphAlign, 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 = ST_Merge.@continue; } } }
/// <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, string fillContent, ParagraphAlignment paragraphAlign, int textPosition = 24, bool isBold = false, int fontSize = 10, string fontColor = "000000", bool isItalic = false, UnderlinePatterns value = UnderlinePatterns.None, int secondFontSize = 0, bool isStatement = false, 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("宋體", FontCharRange.None);//設置字體(如:微軟雅黑,華文楷體,宋體) 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, XWPFTable table, string path, ParagraphAlignment paragraphAlign, 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 = ST_Merge.@continue; } } }
四、 生成Word,控制表格允許跨頁斷行
PictureAddress fileJArray = GetEcaiFile(Entity);
string currentDate = DateTime.Now.ToString("yyyyMMdd");
//保存文件到靜態資源wwwroot,使用絕對路徑路徑
var uploadPath = "Temp";
if (!Path.IsPathRooted(uploadPath))
{
uploadPath = HttpContext.Current.Server.MapPath("~") + "Temp";
}
string fileName = string.Format("{0}.docx", "聯想商用產品報價單", System.Text.Encoding.UTF8);
if (!Directory.Exists(uploadPath))
{
Directory.CreateDirectory(uploadPath);
}
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;//右邊距
//創建頁腳 帶頁碼(第幾頁 共幾頁)
CreateFooter(document, m_SectPr, Entity);
//創建頁眉
CreateHeader(document, m_SectPr, Entity);
////文本標題
document.SetParagraph(ParagraphInstanceSetting(document, "聯想商用產品報價單", true, 15, "微軟雅黑", "", UnderlinePatterns.None, ParagraphAlignment.CENTER, ParagraphAlignment.RIGHT), DocIndex++);
document.SetParagraph(ParagraphInstanceSetting(document, "", false, 14, "微軟雅黑", "", UnderlinePatterns.None, ParagraphAlignment.RIGHT, ParagraphAlignment.RIGHT, 10, false, ""), 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, 1, 0, null);
zeroXwpfTable.SetTopBorder(XWPFBorderType.NONE, 1, 0, null);
zeroXwpfTable.SetRightBorder(XWPFBorderType.NONE, 1, 0, null);
zeroXwpfTable.SetInsideHBorder(XWPFBorderType.NONE, 1, 0, null);
zeroXwpfTable.SetInsideVBorder(XWPFBorderType.NONE, 1, 0, null);
MYMergeCells(zeroXwpfTable, 2, 2, 0, 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, 0, true, 10, "white", false, UnderlinePatterns.None, 10, true, Entity.quotationNumber.ToString()));
zeroXwpfTable.GetRow(0).GetCell(2).SetParagraph(SetWritePicture(document, zeroXwpfTable, HttpContext.Current.Server.MapPath("~") + "Images/2.png".ToString(), ParagraphAlignment.RIGHT, NPOI.XWPF.UserModel.PictureType.PNG, 160 * 9525, 38 * 9525));
zeroXwpfTable.GetRow(1).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, zeroXwpfTable, " 客戶名稱 ", ParagraphAlignment.LEFT, 10, true, 10, "white", false, UnderlinePatterns.None, 10, true, Entity.customerName.ToString()));
#endregion
document.SetParagraph(ParagraphInstanceSetting(document, "", false, 14, "微軟雅黑", "", UnderlinePatterns.None, ParagraphAlignment.RIGHT, ParagraphAlignment.RIGHT, 10, false, ""), DocIndex++);
if (Entity.quoteExport == 1)
{
#region Table1
XWPFTable firstXwpfTable = document.CreateTable(4, 2);//顯示的行列數rows:3行,cols:4列
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, 1, 0, null);
firstXwpfTable.SetLeftBorder(XWPFBorderType.NONE, 1, 0, null);
firstXwpfTable.SetTopBorder(XWPFBorderType.NONE, 1, 0, null);
firstXwpfTable.SetRightBorder(XWPFBorderType.NONE, 1, 0, null);
firstXwpfTable.SetInsideHBorder(XWPFBorderType.NONE, 1, 0, null);
firstXwpfTable.SetInsideVBorder(XWPFBorderType.NONE, 1, 0, null);
firstXwpfTable.GetRow(0).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, "報價單生成日期", ParagraphAlignment.LEFT, 10, false, 10, "#ff0000"));
firstXwpfTable.GetRow(0).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, "付款方式", ParagraphAlignment.LEFT, 10, false, 10, "#ff0000"));
firstXwpfTable.GetRow(1).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, Entity.createTime.ToString().Substring(0,10), ParagraphAlignment.LEFT, 40, false, 10));
firstXwpfTable.GetRow(1).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, Entity.payTypeName.ToString(), ParagraphAlignment.LEFT, 40, false, 10));
firstXwpfTable.GetRow(2).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, "報價單有效期", ParagraphAlignment.LEFT, 10, false, 10, "#ff0000"));
firstXwpfTable.GetRow(2).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, "預計供貨周期", ParagraphAlignment.LEFT, 10, false, 10, "#ff0000"));
firstXwpfTable.GetRow(3).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, Entity.expiredTime.ToString(), ParagraphAlignment.LEFT, 0, false, 10));
firstXwpfTable.GetRow(3).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, Entity.supplyTime.ToString() + "天", ParagraphAlignment.LEFT, 0, false, 10));
document.SetParagraph(ParagraphInstanceSetting(document, " ", false, 14, "微軟雅黑", "#ff0000", UnderlinePatterns.Single, ParagraphAlignment.LEFT, ParagraphAlignment.RIGHT, 10, false, ""), DocIndex++);
document.SetParagraph(ParagraphInstanceSetting(document, " ", false, 14, "微軟雅黑", "", UnderlinePatterns.None, ParagraphAlignment.LEFT, ParagraphAlignment.RIGHT, 10, false, ""), DocIndex++);
#endregion
RowIndex += 6;
}
if (Entity.customerExport == 1)
{
#region Table2
XWPFTable SecondXwpfTable = document.CreateTable(4, 2);//顯示的行列數rows:3行,cols:4列
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, 1, 0, null);
SecondXwpfTable.SetLeftBorder(XWPFBorderType.NONE, 1, 0, null);
SecondXwpfTable.SetTopBorder(XWPFBorderType.NONE, 1, 0, null);
SecondXwpfTable.SetRightBorder(XWPFBorderType.NONE, 1, 0, null);
SecondXwpfTable.SetInsideHBorder(XWPFBorderType.NONE, 1, 0, null);
SecondXwpfTable.SetInsideVBorder(XWPFBorderType.NONE, 1, 0, null);
SecondXwpfTable.GetRow(0).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, SecondXwpfTable, "收貨地址", ParagraphAlignment.LEFT, 20, false, 9, "#ff0000"));
SecondXwpfTable.GetRow(1).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, SecondXwpfTable, "客戶名稱:" + Entity.customerName.ToString() + "", ParagraphAlignment.LEFT, 30, false, 10, ""));
SecondXwpfTable.GetRow(2).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, SecondXwpfTable, "項目名稱:" + Entity.boName.ToString() + "", ParagraphAlignment.LEFT, 30, false, 10, ""));
SecondXwpfTable.GetRow(2).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, SecondXwpfTable, "聯系人:" + Entity.customerLinkName.ToString() + "", ParagraphAlignment.LEFT, 30, false, 10, ""));
SecondXwpfTable.GetRow(3).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, SecondXwpfTable, "地 址:" + Entity.customerAddress.ToString() + "", ParagraphAlignment.LEFT, 0, false, 10, ""));
SecondXwpfTable.GetRow(3).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, SecondXwpfTable, "電話:" + Entity.customerPhone.ToString() + "", ParagraphAlignment.LEFT, 0, false, 10));
document.SetParagraph(ParagraphInstanceSetting(document, " ", false, 14, "微軟雅黑", "#ff0000", UnderlinePatterns.Single, ParagraphAlignment.LEFT, ParagraphAlignment.RIGHT, 10, false, ""), DocIndex++);
document.SetParagraph(ParagraphInstanceSetting(document, " ", false, 14, "微軟雅黑", "", UnderlinePatterns.None, ParagraphAlignment.LEFT, ParagraphAlignment.RIGHT, 10, false, ""), DocIndex++);
#endregion
RowIndex += 6;
}
if (Entity.lenovoExport == 1)
{
#region Table3
XWPFTable ThreeXwpfTable = document.CreateTable(2, 3);//顯示的行列數rows:3行,cols:4列
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, 1, 0, null);
ThreeXwpfTable.SetLeftBorder(XWPFBorderType.NONE, 1, 0, null);
ThreeXwpfTable.SetTopBorder(XWPFBorderType.NONE, 1, 0, null);
ThreeXwpfTable.SetRightBorder(XWPFBorderType.NONE, 1, 0, null);
ThreeXwpfTable.SetInsideHBorder(XWPFBorderType.NONE, 1, 0, null);
ThreeXwpfTable.SetInsideVBorder(XWPFBorderType.NONE, 1, 0, null);
ThreeXwpfTable.GetRow(0).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, ThreeXwpfTable, "客戶經理", ParagraphAlignment.LEFT, 0, false, 10, "#ff0000"));
ThreeXwpfTable.GetRow(0).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, ThreeXwpfTable, "聯系電話", ParagraphAlignment.LEFT, 0, false, 10, "#ff0000"));
ThreeXwpfTable.GetRow(0).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, ThreeXwpfTable, "客戶經理郵箱", ParagraphAlignment.LEFT, 0, false, 10, "#ff0000"));
ThreeXwpfTable.GetRow(1).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, ThreeXwpfTable, Entity.lenovoLinkName.ToString(), ParagraphAlignment.LEFT, 20, false, 10, ""));
ThreeXwpfTable.GetRow(1).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, ThreeXwpfTable, Entity.lenovoPhone.ToString(), ParagraphAlignment.LEFT, 20, false, 10, ""));
ThreeXwpfTable.GetRow(1).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, ThreeXwpfTable, Entity.lenovoEmail.ToString(), ParagraphAlignment.LEFT, 20, false, 10, ""));
document.SetParagraph(ParagraphInstanceSetting(document, " ", false, 14, "微軟雅黑", "#ff0000", UnderlinePatterns.Single, ParagraphAlignment.LEFT, ParagraphAlignment.RIGHT, 10, false, ""), DocIndex++);
#endregion
RowIndex += 3;
}
if (Entity.invoiceExport == 1)
{
#region Table
XWPFTable Table = document.CreateTable(2, 3);//顯示的行列數rows:3行,cols:4列
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, 1, 0, null);
Table.SetLeftBorder(XWPFBorderType.NONE, 1, 0, null);
Table.SetTopBorder(XWPFBorderType.NONE, 1, 0, null);
Table.SetRightBorder(XWPFBorderType.NONE, 1, 0, null);
Table.SetInsideHBorder(XWPFBorderType.NONE, 1, 0, null);
Table.SetInsideVBorder(XWPFBorderType.NONE, 1, 0, null);
Table.GetRow(0).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, Table, "發票形式", ParagraphAlignment.LEFT, 0, false, 10, "#ff0000"));
Table.GetRow(0).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, Table, "發票收取方式", ParagraphAlignment.LEFT, 0, false, 10, "#ff0000"));
Table.GetRow(1).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, Table, Entity.InvoiceTypeName.ToString(), ParagraphAlignment.LEFT, 20, false, 10, ""));
Table.GetRow(1).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, Table, Entity.InvoiceReceiveTypeName.ToString(), ParagraphAlignment.LEFT, 20, false, 10, ""));
document.SetParagraph(ParagraphInstanceSetting(document, " ", false, 14, "微軟雅黑", "#ff0000", UnderlinePatterns.Single, ParagraphAlignment.LEFT, ParagraphAlignment.RIGHT, 10, false, ""), DocIndex++);
#endregion
RowIndex += 3;
}
#region Table4 價格匯總
document.SetParagraph(ParagraphInstanceSetting(document, "|價格匯總", true, 15, "微軟雅黑", "#ff0000", UnderlinePatterns.None, ParagraphAlignment.LEFT, ParagraphAlignment.RIGHT, 10, false, ""), DocIndex++);
document.SetParagraph(ParagraphInstanceSetting(document, " ", false, 14, "微軟雅黑", "", UnderlinePatterns.None, ParagraphAlignment.LEFT, ParagraphAlignment.RIGHT, 10, false, ""), 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 = new CT_TcPr();
XWPFTableRow FourxwpfTable;
//固定表格寬度
for (int d = 0; d < product.Count + 2; d++)
{
fourPr = FourXwpfTable.GetRow(d).GetCell(0).GetCTTc().AddNewTcPr();
fourPr.tcW = new CT_TblWidth();
fourPr.tcW.w = "2500";//單元格寬
fourPr.tcW.type = ST_TblWidth.dxa;
fourPr = FourXwpfTable.GetRow(d).GetCell(1).GetCTTc().AddNewTcPr();
fourPr.tcW = new CT_TblWidth();
fourPr.tcW.w = "3500";//單元格寬
fourPr.tcW.type = ST_TblWidth.dxa;
fourPr = FourXwpfTable.GetRow(d).GetCell(2).GetCTTc().AddNewTcPr();
fourPr.tcW = new CT_TblWidth();
fourPr.tcW.w = "800";//單元格寬
fourPr.tcW.type = ST_TblWidth.dxa;
fourPr = FourXwpfTable.GetRow(d).GetCell(3).GetCTTc().AddNewTcPr();
fourPr.tcW = new CT_TblWidth();
fourPr.tcW.w = "1000";//單元格寬
fourPr.tcW.type = ST_TblWidth.dxa;
fourPr = FourXwpfTable.GetRow(d).GetCell(4).GetCTTc().AddNewTcPr();
fourPr.tcW = new CT_TblWidth();
fourPr.tcW.w = "1000";//單元格寬
fourPr.tcW.type = ST_TblWidth.dxa;
//設置表格時候允許跨頁斷行
FourxwpfTable= FourXwpfTable.GetRow(d);
FourxwpfTable.IsCantSplitRow = true;
}
#region 設置樣式
FourXwpfTable.SetBottomBorder(XWPFBorderType.SINGLE, 10, 0, "pink");
FourXwpfTable.SetLeftBorder(XWPFBorderType.SINGLE, 10, 0, "pink");
FourXwpfTable.SetTopBorder(XWPFBorderType.SINGLE, 10, 0, "pink");
FourXwpfTable.SetRightBorder(XWPFBorderType.SINGLE, 10, 0, "pink");
FourXwpfTable.SetInsideHBorder(XWPFBorderType.SINGLE, 10, 0, "pink");
FourXwpfTable.SetInsideVBorder(XWPFBorderType.SINGLE, 10, 0, "pink");
FourXwpfTable.GetRow(0).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, FourXwpfTable, "產品名稱", ParagraphAlignment.LEFT, 30, false, 10, ""));
FourXwpfTable.GetRow(0).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, FourXwpfTable, "配置", ParagraphAlignment.LEFT, 30, false, 10, ""));
FourXwpfTable.GetRow(0).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, FourXwpfTable, "數量", ParagraphAlignment.LEFT, 30, false, 10, ""));
FourXwpfTable.GetRow(0).GetCell(3).SetParagraph(SetTableParagraphInstanceSetting(document, FourXwpfTable, "單價(含稅)", ParagraphAlignment.LEFT, 30, false, 10, ""));
FourXwpfTable.GetRow(0).GetCell(4).SetParagraph(SetTableParagraphInstanceSetting(document, FourXwpfTable, "金額(含稅)", ParagraphAlignment.LEFT, 30, false, 10, ""));
RowIndex += 3;
#endregion
int Num = 0;
int TotalPrice = 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(0).SetParagraph(SetTableParagraphInstanceSetting(document, FourXwpfTable, product[i].productName.ToString(), ParagraphAlignment.LEFT, -10, false, 10, ""));
FourXwpfTable.GetRow(i + 1).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, FourXwpfTable, product[i].majorParts.ToString(), ParagraphAlignment.LEFT, -10, false, 10, ""));
FourXwpfTable.GetRow(i + 1).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, FourXwpfTable, product[i].quantity.ToString(), ParagraphAlignment.LEFT, -10, false, 10, ""));
FourXwpfTable.GetRow(i + 1).GetCell(3).SetParagraph(SetTableParagraphInstanceSetting(document, FourXwpfTable, product[i].productPrice.ToString(), ParagraphAlignment.LEFT, -10, false, 10, ""));
FourXwpfTable.GetRow(i + 1).GetCell(4).SetParagraph(SetTableParagraphInstanceSetting(document, FourXwpfTable, "¥" + product[i].productTotalPrice.ToString(), ParagraphAlignment.LEFT, -10, false, 10, ""));
FourXwpfTable.GetRow(i + 1).GetCell(4).SetColor("#EEEEEE");
}
FourXwpfTable.GetRow(product.Count() + 1).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, FourXwpfTable, "總計", ParagraphAlignment.LEFT, 30, false, 10, ""));
FourXwpfTable.GetRow(product.Count() + 1).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, FourXwpfTable, "", ParagraphAlignment.LEFT, 30, false, 10, ""));
FourXwpfTable.GetRow(product.Count() + 1).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, FourXwpfTable, "", ParagraphAlignment.LEFT, 30, false, 10, ""));
FourXwpfTable.GetRow(product.Count() + 1).GetCell(3).SetParagraph(SetTableParagraphInstanceSetting(document, FourXwpfTable, "", ParagraphAlignment.LEFT, 30, false, 10, ""));
FourXwpfTable.GetRow(product.Count() + 1).GetCell(4).SetParagraph(SetTableParagraphInstanceSetting(document, FourXwpfTable, "¥" + TotalPrice.ToString(), ParagraphAlignment.LEFT, 30, false, 10, ""));
FourXwpfTable.GetRow(product.Count() + 1).GetCell(4).SetColor("#EEEEEE");
FourXwpfTable.GetRow(product.Count()).GetCell(0).SetBorderBottom(XWPFBorderType.SINGLE, 10, 0, "pink");
FourXwpfTable.GetRow(product.Count()).GetCell(1).SetBorderBottom(XWPFBorderType.SINGLE, 10, 0, "pink");
FourXwpfTable.GetRow(product.Count()).GetCell(2).SetBorderBottom(XWPFBorderType.SINGLE, 10, 0, "pink");
FourXwpfTable.GetRow(product.Count()).GetCell(3).SetBorderBottom(XWPFBorderType.SINGLE, 10, 0, "pink");
FourXwpfTable.GetRow(product.Count()).GetCell(4).SetBorderBottom(XWPFBorderType.SINGLE, 10, 0, "pink");
document.SetParagraph(ParagraphInstanceSetting(document, " ", false, 14, "微軟雅黑", "", UnderlinePatterns.None, ParagraphAlignment.LEFT, ParagraphAlignment.RIGHT, 10, false, ""), DocIndex++);
document.SetParagraph(ParagraphInstanceSetting(document, " ", false, 14, "微軟雅黑", "", UnderlinePatterns.None, ParagraphAlignment.LEFT, ParagraphAlignment.RIGHT, 10, false, ""), DocIndex++);
#endregion
#region Table5 溫馨提示
document.SetParagraph(ParagraphInstanceSetting(document, "|溫馨提示", true, 15, "微軟雅黑", "#ff0000", UnderlinePatterns.None, ParagraphAlignment.LEFT, ParagraphAlignment.RIGHT, 10, false, ""), DocIndex++);
document.SetParagraph(ParagraphInstanceSetting(document, " ", false, 14, "微軟雅黑", "", UnderlinePatterns.None, ParagraphAlignment.LEFT, ParagraphAlignment.RIGHT, 10, false, ""), 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;
XWPFTableRow FiveTavleXwpf = FiveXwpfTable.GetRow(0);
FiveTavleXwpf.IsCantSplitRow = true;
FiveTavleXwpf = FiveXwpfTable.GetRow(1);
FiveTavleXwpf.IsCantSplitRow = true;
FiveTavleXwpf = FiveXwpfTable.GetRow(2);
FiveTavleXwpf.IsCantSplitRow = true;
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;
XWPFTableRow fivexwpfTable = FourXwpfTable.GetRow(0);
fivexwpfTable.IsCantSplitRow = true;
FiveXwpfTable.SetBottomBorder(XWPFBorderType.SINGLE, 13, 0, "pink");
FiveXwpfTable.SetLeftBorder(XWPFBorderType.SINGLE, 13, 0, "pink");
FiveXwpfTable.SetTopBorder(XWPFBorderType.SINGLE, 13, 0, "pink");
FiveXwpfTable.SetRightBorder(XWPFBorderType.SINGLE, 13, 0, "pink");
FiveXwpfTable.SetInsideHBorder(XWPFBorderType.SINGLE, 1, 0, "pink");
FiveXwpfTable.SetInsideVBorder(XWPFBorderType.SINGLE, 1, 0, "pink");
FiveXwpfTable.GetRow(1).GetCell(0).SetBorderTop(XWPFBorderType.NONE, 1, 0, null);
FiveXwpfTable.GetRow(2).GetCell(0).SetBorderTop(XWPFBorderType.NONE, 1, 0, null);
FiveXwpfTable.GetRow(1).GetCell(0).SetBorderBottom(XWPFBorderType.NONE, 1, 0, null);
FiveXwpfTable.GetRow(0).GetCell(0).SetBorderBottom(XWPFBorderType.NONE, 1, 0, null);
FiveXwpfTable.GetRow(0).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, FiveXwpfTable, "1)本報價未考慮具體交易條件,價格為預付貸款條件,且不含任何未列部件和服務費用.請聯系當地聯想客戶經理,以確保獲取產品信息和價格.最終成交價格以聯想與客戶簽署的書面合同為准.", ParagraphAlignment.LEFT, -10, false, 9, ""));
FiveXwpfTable.GetRow(1).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, FiveXwpfTable, "2)本報價所含全部內容為聯想保密信息.未經聯想書面許可不得對外披露、復制、傳播或以其它任何方式使用.", ParagraphAlignment.LEFT, -10, false, 9, ""));
FiveXwpfTable.GetRow(2).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, FiveXwpfTable, "3)獲取產品詳細介紹請登錄聯想大客戶官網http://b2b.lenovo.com.cn", ParagraphAlignment.LEFT, 30, false, 9, ""));
if(product.Count>1)
{
document.SetParagraph(BreakPage(document), DocIndex++);
}
#endregion
#region Table6
if (Parts.Count > 0)
{
document.SetParagraph(ParagraphInstanceSetting(document, "|報價單描述", true, 15, "微軟雅黑", "#ff0000", UnderlinePatterns.None, ParagraphAlignment.LEFT, ParagraphAlignment.RIGHT, 10, false, ""), DocIndex++);
document.SetParagraph(ParagraphInstanceSetting(document, " ", false, 14, "微軟雅黑", "", UnderlinePatterns.None, ParagraphAlignment.LEFT, ParagraphAlignment.RIGHT, 10, false, ""), 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);
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, 1, 0, null);
SixXwpfTable.SetLeftBorder(XWPFBorderType.NONE, 1, 0, null);
SixXwpfTable.SetTopBorder(XWPFBorderType.NONE, 1, 0, null);
SixXwpfTable.SetRightBorder(XWPFBorderType.NONE, 1, 0, null);
SixXwpfTable.SetInsideHBorder(XWPFBorderType.NONE, 1, 0, null);
SixXwpfTable.SetInsideVBorder(XWPFBorderType.NONE, 1, 0, null);
MYMergeCells(SixXwpfTable, 0, 0, 0, Entity.projects[k].products[i].parts.Count() + 2);
MYMergeCells(SixXwpfTable, 1, 1, 0, 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, ParagraphAlignment.CENTER, NPOI.XWPF.UserModel.PictureType.JPEG, 170 * 9525, 170 * 9525));
}
else
{
SixXwpfTable.GetRow(0).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, SixXwpfTable, "", ParagraphAlignment.LEFT, -10, false, 10, "#ff0000"));
}
SixXwpfTable.GetRow(0).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, SixXwpfTable, "數量", ParagraphAlignment.LEFT, -10, false, 10, ""));
SixXwpfTable.GetRow(0).GetCell(3).SetParagraph(SetTableParagraphInstanceSetting(document, SixXwpfTable, "單價", ParagraphAlignment.LEFT, -10, false, 10, ""));
SixXwpfTable.GetRow(0).GetCell(4).SetParagraph(SetTableParagraphInstanceSetting(document, SixXwpfTable, "金額", ParagraphAlignment.LEFT, -10, false, 10, ""));
SixXwpfTable.GetRow(0).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, SixXwpfTable, Entity.projects[k].products[i].productName.ToString(), ParagraphAlignment.LEFT, -10, false, 10, "#ff0000"));
SixXwpfTable.GetRow(1).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, SixXwpfTable, Entity.projects[k].products[i].quantity.ToString(), ParagraphAlignment.LEFT, -10, false, 10, ""));
SixXwpfTable.GetRow(1).GetCell(3).SetParagraph(SetTableParagraphInstanceSetting(document, SixXwpfTable, Entity.projects[k].products[i].productPrice.ToString(), ParagraphAlignment.LEFT, -10, false, 10, ""));
SixXwpfTable.GetRow(1).GetCell(4).SetParagraph(SetTableParagraphInstanceSetting(document, SixXwpfTable, Entity.projects[k].products[i].productTotalPrice.ToString(), ParagraphAlignment.LEFT, -10, false, 10, ""));
// 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, "標簽", ParagraphAlignment.LEFT, -10, true, 10, ""));
SixXwpfTable.GetRow(2).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, SixXwpfTable, "描述", ParagraphAlignment.LEFT, -10, true, 10, ""));
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, SixXwpfTable, Entity.projects[k].products[i].parts[s].r3Name.ToString(), ParagraphAlignment.LEFT, -10, false, 10, ""));
SixXwpfTable.GetRow(3 + s).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, SixXwpfTable, Entity.projects[k].products[i].parts[s].r3VName.ToString(), ParagraphAlignment.LEFT, -10, false, 10, ""));
}
document.SetParagraph(ParagraphInstanceSetting(document, " ", false, 14, "微軟雅黑", "", UnderlinePatterns.None, ParagraphAlignment.LEFT, ParagraphAlignment.RIGHT, 10, false, ""), DocIndex++);
document.SetParagraph(ParagraphInstanceSetting(document, " ", false, 14, "微軟雅黑", "", UnderlinePatterns.None, ParagraphAlignment.LEFT, ParagraphAlignment.RIGHT, 10, false, ""), DocIndex++);
document.SetParagraph(ParagraphInstanceSetting(document, " ", false, 14, "微軟雅黑", "", UnderlinePatterns.None, ParagraphAlignment.LEFT, ParagraphAlignment.RIGHT, 10, false, ""), DocIndex++);
document.SetParagraph(ParagraphInstanceSetting(document, " ", false, 14, "微軟雅黑", "#ff0000", UnderlinePatterns.Single, ParagraphAlignment.LEFT, ParagraphAlignment.RIGHT, 10, false, ""), DocIndex++);
document.SetParagraph(ParagraphInstanceSetting(document, " ", false, 14, "微軟雅黑", "", UnderlinePatterns.None, ParagraphAlignment.LEFT, ParagraphAlignment.RIGHT, 10, false, ""), DocIndex++);
document.SetParagraph(ParagraphInstanceSetting(document, " ", false, 14, "微軟雅黑", "", UnderlinePatterns.None, ParagraphAlignment.LEFT, ParagraphAlignment.RIGHT, 10, false, ""), DocIndex++);
document.SetParagraph(ParagraphInstanceSetting(document, " ", false, 14, "微軟雅黑", "", UnderlinePatterns.None, ParagraphAlignment.LEFT, ParagraphAlignment.RIGHT, 10, false, ""), DocIndex++);
}
}
#endregion
#region 廣告位
if (fileJArray.code == 200 && fileJArray.fsp.adImage.Count() > 0)
{
document.SetParagraph(BreakPage(document), DocIndex++);
document.SetParagraph(ParagraphInstanceSetting(document, "|增值服務 ", true, 15, "微軟雅黑", "#ff0000", UnderlinePatterns.None, ParagraphAlignment.LEFT, ParagraphAlignment.RIGHT, 10, false, ""), DocIndex++);
document.SetParagraph(ParagraphInstanceSetting(document, " ", false, 14, "微軟雅黑", "", UnderlinePatterns.None, ParagraphAlignment.LEFT, ParagraphAlignment.RIGHT, 10, false, ""), 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, 0, "pink");
ImageXwpfTable.SetLeftBorder(XWPFBorderType.NONE, 13, 0, "pink");
ImageXwpfTable.SetTopBorder(XWPFBorderType.NONE, 13, 0, "pink");
ImageXwpfTable.SetRightBorder(XWPFBorderType.NONE, 13, 0, "pink");
ImageXwpfTable.SetInsideHBorder(XWPFBorderType.NONE, 1, 0, "pink");
ImageXwpfTable.SetInsideVBorder(XWPFBorderType.NONE, 1, 0, "pink");
ImageXwpfTable.GetRow(0).GetCell(0).SetParagraph(SetWritePicture(document, ImageXwpfTable, fileJArray.fsp.adImage.Count() > 0 ? fileJArray.fsp.adImage : "", ParagraphAlignment.RIGHT, NPOI.XWPF.UserModel.PictureType.PNG, 600 * 9525, 800 * 9525));
}
#endregion
document.Write(stream);
filePath = Path.Combine(uploadPath, fileName);
}
總結:
經歷了小一周的摸索,為了實現想要的樣子,通過不斷查閱與自己的理解終於達到了想要的效果,感謝那些寫資料的人讓我少走一些彎路,在這里記錄下自己的一些收獲,心得分享給大家,希望會幫助到大家