/// <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 }