1. 程式人生 > 其它 >NPOI匯出word檔案 方法封裝及示例

NPOI匯出word檔案 方法封裝及示例

  • 擴充套件方法封裝
    /// <summary>
    /// word匯出擴充套件類
    /// </summary>

    public static class XWPFDocumentExtention
    {
        /// <summary>
        /// 設定行的高度
        /// </summary>
        /// <param name="row"></param>
        /// <param name="height"></param>
        /// <returns></returns>
        public static XWPFTableRow SetRowHeight(this XWPFTableRow row,int height)
        {
            row.Height = height;
            return row;
        }
        /// <summary>
        /// 設定表格寬度
        /// </summary>
        /// <param name="table"></param>
        /// <param name="width"></param>
        /// <returns></returns>
        public static XWPFTable SetTableWidth(this XWPFTable table, int width)
        {
            table.Width = width;
            return table;
        }
        /// <summary>
        /// 建立表格,並設定列寬
        /// </summary>
        /// <param name="document"></param>
        /// <param name="rows"></param>
        /// <param name="columnWidths"></param>
        /// <returns></returns>
        public static XWPFTable CreateTableAndSetColumnWidth(this XWPFDocument document, 
            int rows,params ulong[] columnWidths)
        {
            var table = document.CreateTable(rows, columnWidths.Length);
            for (int i = 0; i < columnWidths.Length; i++)
            {
                table.SetColumnWidth(i, columnWidths[i]);
            }
            return table;
        }

        /// <summary>
        /// 合併指定行的指定單元格
        /// </summary>
        /// <param name="table"></param>
        /// <param name="rowIndex"></param>
        /// <param name="cellStartIndex"></param>
        /// <param name="cellEndIndex"></param>
        /// <returns></returns>
        public static XWPFTable MergeRowCells(this XWPFTable table,int rowIndex,int cellStartIndex,int cellEndIndex)
        {
            var row = table.GetRow(rowIndex);
            if (row == null) throw new ArgumentException("行索引超過了已有的行");
            row.MergeCells(cellStartIndex, cellEndIndex);
            return table;
        }
        /// <summary>
        /// 設定表格的表頭內容
        /// </summary>
        /// <param name="table"></param>
        /// <param name="paragraphAlign"></param>
        /// <param name="textPosition"></param>
        /// <param name="isBold"></param>
        /// <param name="fontSize"></param>
        /// <param name="titles"></param>
        public static XWPFTable SetTableHeadTitle(this XWPFTable table,
            ParagraphAlignment paragraphAlign,
            int textPosition = 24,
            bool isBold = false,
            int fontSize = 10,
            params string[] titles
            )
        {
            if (titles.Any())
            {
                for (int i = 0; i < titles.Length; i++)
                {
                    table.SetTableParagraph(0, i, titles[i], paragraphAlign, textPosition, isBold, fontSize);
                }
            }
            return table;
        }


        /// <summary>
        /// 設定指定行的段落文字
        /// </summary>
        /// <param name="document"></param>
        /// <param name="docPoint"></param>
        /// <param name="fillContent"></param>
        /// <param name="isBold"></param>
        /// <param name="fontSize"></param>
        /// <param name="fontFamily"></param>
        /// <param name="paragraphAlign"></param>
        /// <param name="isStatement"></param>
        /// <param name="secondFillContent"></param>
        /// <param name="fontColor"></param>
        /// <param name="isItalic"></param>
        /// <param name="position"></param>
        public static void SetDocumentParagraph(this XWPFDocument document,
            int docPoint,
            string fillContent,
            bool isBold,
            int fontSize,
            string fontFamily,
            ParagraphAlignment paragraphAlign,
            bool isStatement = false,
            string secondFillContent = "",
            string fontColor = "000000",
            bool isItalic = false,
            int position = 35
            )
        {
            XWPFParagraph paragraph = document.CreateParagraph();//建立段落物件
            paragraph.Alignment = paragraphAlign;//文字顯示位置,段落排列(左對齊,居中,右對齊)


            XWPFRun xwpfRun = paragraph.CreateRun();//建立段落文字物件
            xwpfRun.IsBold = isBold;//文字加粗
            xwpfRun.SetText(fillContent);//填充內容
            xwpfRun.FontSize = fontSize;//設定文字大小
            xwpfRun.IsItalic = isItalic;//是否設定斜體(字型傾斜)
            xwpfRun.SetColor(fontColor);//設定字型顏色--十六進位制
            xwpfRun.SetFontFamily(fontFamily, FontCharRange.None); //設定標題樣式如:(微軟雅黑,隸書,楷體)根據自己的需求而定
            xwpfRun.SetTextPosition(position);// 設定行間距
            if (isStatement)
            {
                XWPFRun secondXwpfRun = paragraph.CreateRun();//建立段落文字物件
                secondXwpfRun.IsBold = isBold;//文字加粗
                secondXwpfRun.SetText(secondFillContent);//填充內容
                secondXwpfRun.FontSize = fontSize;//設定文字大小
                secondXwpfRun.IsItalic = isItalic;//是否設定斜體(字型傾斜)
                secondXwpfRun.SetColor(fontColor);//設定字型顏色--十六進位制
                secondXwpfRun.SetTextPosition(position);// 設定行間距
                secondXwpfRun.SetFontFamily(fontFamily, FontCharRange.None); //設定標題樣式如:(微軟雅黑,隸書,楷體)根據自己的需
            }
            document.SetParagraph(paragraph, docPoint);
        }
        /// <summary>
        /// 設定table 單元格的段落
        /// </summary>
        /// <param name="table"></param>
        /// <param name="rowIndex"></param>
        /// <param name="cellIndex"></param>
        /// <param name="fillContent"></param>
        /// <param name="paragraphAlign"></param>
        /// <param name="textPosition"></param>
        /// <param name="isBold"></param>
        /// <param name="fontSize"></param>
        /// <param name="fontColor"></param>
        /// <param name="isItalic"></param>
        public static XWPFTable SetTableParagraph(
            this XWPFTable table,
            int rowIndex,
            int cellIndex,
            string fillContent,
            ParagraphAlignment paragraphAlign,
            int textPosition = 24,
            bool isBold = false,
            int fontSize = 10,
            string fontColor = "000000",
            bool isItalic = false
            )
        {
            var para = new CT_P();
            //設定單元格文字對齊
            para.AddNewPPr().AddNewTextAlignment();
            XWPFParagraph paragraph = new XWPFParagraph(para, table.Body);//建立表格中的段落物件
            paragraph.Alignment = paragraphAlign;//文字顯示位置,段落排列(左對齊,居中,右對齊)
            paragraph.FontAlignment =Convert.ToInt32(ParagraphAlignment.CENTER);//字型在單元格內顯示位置與 paragraph.Alignment效果相似
            XWPFRun xwpfRun = paragraph.CreateRun();//建立段落文字物件
            xwpfRun.SetText(fillContent);
            xwpfRun.FontSize = fontSize;//字型大小
            xwpfRun.SetColor(fontColor);//設定字型顏色--十六進位制
            xwpfRun.IsItalic = isItalic;//是否設定斜體(字型傾斜)
            xwpfRun.IsBold = isBold;//是否加粗
            xwpfRun.SetFontFamily("宋體", FontCharRange.None);//設定字型(如:微軟雅黑,華文楷體,宋體)
            xwpfRun.SetTextPosition(textPosition);//設定文字位置(設定兩行之間的行間),從而實現table的高度設定效果 
            table.GetRow(rowIndex).GetCell(cellIndex)
                .SetParagraph(paragraph);
            return table;
        }


        /// <summary>
        /// 設定頁邊距
        /// </summary>
        /// <param name="document"></param>
        /// <param name="left"></param>
        /// <param name="top"></param>
        /// <param name="right"></param>
        /// <param name="bottom"></param>
        public static XWPFDocument SetDocumentMargin(this XWPFDocument document,
            string left,//左邊距
            string top,// 上邊距
            string right,
            string bottom
            )
        {
            CT_PageMar mar = new CT_PageMar();
            CT_SectPr sectPr = new CT_SectPr();
            sectPr.pgMar = mar;
            mar.bottom = bottom;
            mar.top = top;
            mar.left = ulong.Parse(left);
            mar.right = ulong.Parse(right);
            document.Document.body.sectPr = sectPr;
            return document;
        }
    }
  • 示例程式碼
try
            {
                string currentDate = DateTime.Now.ToString("yyyyMMdd");
                string checkTime = DateTime.Now.ToString("yyyy年MM月dd日");//檢查時間
                string workFileName = checkTime + "2021年7月用料需求單";
                string fileName = string.Format("{0}.docx", workFileName, System.Text.Encoding.UTF8);
                //通過使用檔案流,建立檔案流物件,向檔案流中寫入內容,並儲存為Word文件格式
                using (var stream = new FileStream(Path.Combine("F:\\", fileName), FileMode.Create, FileAccess.Write))
                {
                    //建立document文件物件物件例項
                    XWPFDocument document = new XWPFDocument();
                    var tableWidth = 5000;

                    //文字標題
                    document.SetDocumentParagraph(0, workFileName, true, 14, "宋體", ParagraphAlignment.CENTER, position: 40);
                    //TODO:這裡一行需要顯示兩個文字
                    var docString1 = $"編號:20190927101120445887";
                    var docString2 = $"                                           計劃時間:{checkTime}";
                    document.SetDocumentParagraph(1, docString1, true, 10, "宋體", ParagraphAlignment.LEFT, true, $"{docString2}");

                    // 建立一個 3行 4列的表格
                    document
                        .CreateTableAndSetColumnWidth(3, 1000, 1500, 1000, 1500)
                        .SetTableWidth(tableWidth)
                        .MergeRowCells(0, 1, 3)
                        .SetTableParagraph(0, 0, "計劃名稱", ParagraphAlignment.CENTER, 35, true)
                        .SetTableParagraph(0, 1, "天津地鐵十一號線用料需求計劃單", ParagraphAlignment.CENTER, 35, true)
                        .SetTableParagraph(1, 0, "提交人", ParagraphAlignment.CENTER, 35, true)
                        .SetTableParagraph(1, 1, "張麻子", ParagraphAlignment.CENTER, 35, false)
                        .SetTableParagraph(1, 2, "提交時間", ParagraphAlignment.CENTER, 50, true)
                        .SetTableParagraph(1, 3, "2020-01-01 12:00:00", ParagraphAlignment.CENTER, 35, false)
                        .MergeRowCells(2, 0, 3)// 合併單元格
                        .SetTableParagraph(2, 0, "材料清單", ParagraphAlignment.CENTER, 35, true, 15);

                    // 建立材料清單的表格
                    var headTitles = new string[] { "序號", "材料類別", "材料名稱", "規格型號", "計量單位", "需求數量" };
                    var twoTable = document
                        .CreateTableAndSetColumnWidth(8, 200, 800, 1500, 1000, 750, 750)
                        .SetTableHeadTitle(ParagraphAlignment.CENTER, 24, true, titles: headTitles)
                        .MergeRowCells(7, 0, 5)
                        .SetTableParagraph(7, 0, "審批結果", ParagraphAlignment.CENTER, 50, true, 15);
                    for (int i = 1; i < 7; i++)
                    {
                        for (int j = 0; j < headTitles.Length; j++)
                        {
                            twoTable.SetTableParagraph(i, j, headTitles[j].ToString() + i, ParagraphAlignment.CENTER, 24, false);
                        }
                    }

                    // 建立第三個表格
                    var threeTableHeadTitle = new string[] { "序號", "審批意見", "審批狀態","審批人", "審批時間" };
                    var threeTable = document.CreateTableAndSetColumnWidth(5, 200, 2400, 1000, 1000, 1000)
                        .SetTableWidth(tableWidth)
                        .SetTableHeadTitle(ParagraphAlignment.CENTER, 24, true, titles: threeTableHeadTitle);

                    for (int i = 1; i < 5; i++)
                    {
                        threeTable
                            .SetTableParagraph(i, 0, "1", ParagraphAlignment.CENTER, 80, false)
                            .SetTableParagraph(i, 1, "同意", ParagraphAlignment.CENTER, 80, false)
                            .SetTableParagraph(i, 2, "審批通過", ParagraphAlignment.CENTER, 80, false)
                            .SetTableParagraph(i, 3, "張三", ParagraphAlignment.CENTER, 80, false)
                            .SetTableParagraph(i, 4, "2020-01-01 12:23:21", ParagraphAlignment.CENTER, 80, false);
                    }
                    document.
                        SetDocumentMargin("1000", "1500", "1000", "1000")
                        .Write(stream);
                }
            }
            catch (Exception ex)
            {
                savePath = ex.Message;
            }

匯出效果:

轉載時請註明出處!