利用NPOI導出Word文檔幫助類


    /// <summary>
    /// NPOI操作Word
    /// </summary>
    public class NpoiWordHelper
    {
        /// <summary>
        /// 創建文檔
        /// </summary>
        /// <param name="setting"></param>
        public static void ExportDocument(DocumentSetting setting)
        {
            XWPFDocument docx = new XWPFDocument();
            MemoryStream ms = new MemoryStream();

            //設置文檔
            docx.Document.body.sectPr = new CT_SectPr();
            CT_SectPr setPr = docx.Document.body.sectPr;
            //獲取頁面大小
            Tuple<int, int> size = GetPaperSize(setting.PaperType);
            setPr.pgSz.w = (ulong)size.Item1;
            setPr.pgSz.h = (ulong)size.Item2;
            //創建一個段落
            CT_P p = docx.Document.body.AddNewP();
            //段落水平居中
            p.AddNewPPr().AddNewJc().val = ST_Jc.center;
            XWPFParagraph gp = new XWPFParagraph(p, docx);

            XWPFRun gr = gp.CreateRun();
            //創建標題
            if (!string.IsNullOrEmpty(setting.TitleSetting.Title))
            {
                gr.GetCTR().AddNewRPr().AddNewRFonts().ascii = setting.TitleSetting.FontName;
                gr.GetCTR().AddNewRPr().AddNewRFonts().eastAsia = setting.TitleSetting.FontName;
                gr.GetCTR().AddNewRPr().AddNewRFonts().hint = ST_Hint.eastAsia;
                gr.GetCTR().AddNewRPr().AddNewSz().val = (ulong)setting.TitleSetting.FontSize;//2號字體
                gr.GetCTR().AddNewRPr().AddNewSzCs().val = (ulong)setting.TitleSetting.FontSize;
                gr.GetCTR().AddNewRPr().AddNewB().val = setting.TitleSetting.HasBold; //加粗
                gr.GetCTR().AddNewRPr().AddNewColor().val = "black";//字體顏色
                gr.SetText(setting.TitleSetting.Title);
            }

            //創建文檔主要內容
            if (!string.IsNullOrEmpty(setting.MainContentSetting.MainContent))
            {
                p = docx.Document.body.AddNewP();
                p.AddNewPPr().AddNewJc().val = ST_Jc.both;
                gp = new XWPFParagraph(p, docx)
                {
                    IndentationFirstLine = 2
                };

                //單倍為默認值(240)不需設置,1.5倍=240X1.5=360,2倍=240X2=480
                p.AddNewPPr().AddNewSpacing().line = "400";//固定20磅
                p.AddNewPPr().AddNewSpacing().lineRule = ST_LineSpacingRule.exact;

                gr = gp.CreateRun();
                CT_RPr rpr = gr.GetCTR().AddNewRPr();
                CT_Fonts rfonts = rpr.AddNewRFonts();
                rfonts.ascii = setting.MainContentSetting.FontName;
                rfonts.eastAsia = setting.MainContentSetting.FontName;
                rpr.AddNewSz().val = (ulong)setting.MainContentSetting.FontSize;//5號字體-21
                rpr.AddNewSzCs().val = (ulong)setting.MainContentSetting.FontSize;
                rpr.AddNewB().val = setting.MainContentSetting.HasBold;

                gr.SetText(setting.MainContentSetting.MainContent);
            }

            //開始寫入
            docx.Write(ms);

            using (FileStream fs = new FileStream(setting.SavePath, FileMode.Create, FileAccess.Write))
            {
                byte[] data = ms.ToArray();
                fs.Write(data, 0, data.Length);
                fs.Flush();
            }
            ms.Close();
        }

        /// <summary>
        /// 設置文檔
        /// </summary>
        public class DocumentSetting
        {
            /// <summary>
            /// 文檔類型,默認為A4縱向
            /// </summary>
            public PaperType PaperType { get; set; } = PaperType.A4_V;
            /// <summary>
            /// 保存地址,包含文件名
            /// </summary>
            public string SavePath { get; set; }
            /// <summary>
            /// 文檔標題相關
            /// </summary>
            public ContentItemSetting TitleSetting { get; set; }
            /// <summary>
            /// 文檔主要內容
            /// </summary>
            public ContentItemSetting MainContentSetting { get; set; }
        }

        /// <summary>
        /// 文檔內容相關
        /// </summary>
        public class ContentItemSetting
        {
            /// <summary>
            /// 標題
            /// </summary>
            public string Title { get; set; }
            /// <summary>
            /// 主要內容
            /// </summary>
            public string MainContent { get; set; }
            /// <summary>
            /// 使用字體
            /// </summary>
            public string FontName { get; set; } = "宋體";
            /// <summary>
            /// 字體大小,默認2號字體
            /// </summary>
            public int FontSize { get; set; } = 44;
            /// <summary>
            /// 是否加粗,默認不加粗
            /// </summary>
            public bool HasBold { get; set; } = false;
        }

        /// <summary>
        /// 紙張類型
        /// </summary>
        public enum PaperType
        {
            /// <summary>
            /// A4縱向
            /// </summary>
            A4_V,
            /// <summary>
            /// A4橫向
            /// </summary>
            A4_H,

            /// <summary>
            /// A5縱向
            /// </summary>
            A5_V,
            /// <summary>
            /// A5橫向
            /// </summary>
            A5_H,

            /// <summary>
            /// A6縱向
            /// </summary>
            A6_V,
            /// <summary>
            /// A6橫向
            /// </summary>
            A6_H
        }

        #region 私有方法
        /// <summary>
        /// 獲取紙張大小,單位:Twip
        /// <para>換算關系:1英寸=1440緹  1厘米=567緹  1磅=20緹  1像素=15緹</para>
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        private static Tuple<int, int> GetPaperSize(PaperType type)
        {
            Tuple<int, int> res = null;
            switch (type)
            {
                case PaperType.A4_V:
                    res = new Tuple<int, int>(11906, 16838);
                    break;
                case PaperType.A4_H:
                    res = new Tuple<int, int>(16838, 11906);
                    break;

                case PaperType.A5_V:
                    res = new Tuple<int, int>(8390, 11906);
                    break;
                case PaperType.A5_H:
                    res = new Tuple<int, int>(11906, 8390);
                    break;

                case PaperType.A6_V:
                    res = new Tuple<int, int>(5953, 8390);
                    break;
                case PaperType.A6_H:
                    res = new Tuple<int, int>(8390, 5953);
                    break;
            }
            return res;
        }
        #endregion
    }

 


免責聲明!

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



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