.NET Core使用NPOI导出复杂Word详解
前言:
最近使用NPOI做了个导出Word文档的功能,关于使用.NET Core 导出Word文档的方式有很多。最终我为什么选择了NPOI来实现了这个功能,首先是NPOI是一个开源,免费且容易上手的第三方框架(并且现在已支持.NET Core,GitHub源码地址:https://github.com/tonyqus/npoi)。因为之前使用NPOI导出Execl比较多,这次第一次使用NPOI 来导出Word文档还真没有什么头绪。首先看了下GItHub中的源码有一个简单Word导出的示例,然后在看了网上有很多关于NPOI导出Word文档的案例,发现一个特点网上的好像都差不多,对于我而言网上的这些案例完全能够实现我的这个功能,但是感觉看了网上这些案例对NPOI实例化段落,表格和设置相关样式不太清楚(可能是因为自己笨),并且假如使用网上的方法来实现我的功能的话代码量会比较大,而且感觉代码非常的冗余(我是一个追求代码简洁的人,怎么能够容忍这样的事情发生呢!),因此通过查阅了一些资料和自己的理解,把关于使用NPOI导出Word时所要涉及的一些段落,表格样式做了相关注释,和把段落和表格的创建实例,设置文字、字体、对齐方式都封装了起了(为了少写代码),文章末尾会附上一个完整的案例下载地址。
一、首先引入NPOI NuGet:
版本说明:
NPOI 2.4.1 (注意不同版本可能使用的姿势有点小差别)
程序包管理器控制台输入一下命令安装:
Install-Package NPOI -Version 2.4.1
通过NuGet管理解决方案安装:
选择=>工具=>NuGet包管理器=>程序包管理器控制台:
搜索:NPOI进行安装:
二、导出的Work文档内容展示格式如下图所示:
三、NPOI中的XWPFRun文本对象创建和常用属性简单概述:
XWPFRun文本对象说明:
XWPFRun是段落的文本对象,先创建段落对象才能够在段落对象的基础上创建文本对象,并设置相关文本样式。
使用方式,如下所示:
/// <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>
/// <param name="fontColor">字体颜色--十六进制</param>
/// <param name="isItalic">是否设置斜体(字体倾斜)</param>
/// <returns></returns>
public XWPFParagraph ParagraphInstanceSetting(XWPFDocument document, string fillContent, bool isBold, int fontSize, string fontFamily, ParagraphAlignment paragraphAlign, bool isStatement = false, string secondFillContent = "", string fontColor = "000000", bool isItalic = false)
{
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); //设置标题样式如:(微软雅黑,隶书,楷体)根据自己的需求而定 if (!isStatement) return paragraph; XWPFRun secondXwpfRun = paragraph.CreateRun();//创建段落文本对象
secondXwpfRun.IsBold = isBold;//文字加粗
secondXwpfRun.SetText(secondFillContent);//填充内容
secondXwpfRun.FontSize = fontSize;//设置文字大小
secondXwpfRun.IsItalic = isItalic;//是否设置斜体(字体倾斜)
secondXwpfRun.SetColor(fontColor);//设置字体颜色--十六进制
secondXwpfRun.SetFontFamily(fontFamily, FontCharRange.None); //设置标题样式如:(微软雅黑,隶书,楷体)根据自己的需求而定
return paragraph;
}
XWPFRun文本对象的属性比较多,以下我简单介绍下常用的一些属性:
XWPFParagraph paragraph = document.CreateParagraph();//创建段落对象
XWPFRun xwpfRun= paragraph.CreateRun();//创建段落文本对象
xwpfRun.IsBold = isBold;//文字加粗
xwpfRun.SetText(fillContent);//填充内容
xwpfRun.FontSize = fontSize;//设置文字大小
xwpfRun.SetFontFamily(fontFamily, FontCharRange.None); //设置标题样式如:(微软雅黑,隶书,楷体)根据自己的需求而定
xwpfRun.SetColor("BED4F1");//设置字体颜色--十六进制
xwpfRun.IsDoubleStrikeThrough=true;//是否显示双删除线
xwpfRun.IsStrikeThrough = true;//是否显示单删除线
xwpfRun.SetUnderline(UnderlinePatterns.Dash);//设置下划线,枚举类型
xwpfRun.SetTextPosition(20);//设置文本位置(设置两行之间的行间)
xwpfRun.AddBreak();//设置换行(</br>)
xwpfRun.AddTab();//添加tab键
xwpfRun.AddCarriageReturn();//添加回车键
xwpfRun.IsImprinted = true;//印迹(悬浮阴影),效果和浮雕类似
xwpfRun.IsItalic=true;//是否设置斜体(字体倾斜)
xwpfRun.Subscript = VerticalAlign.SUBSCRIPT;//设置下标,枚举类型
NPOI中关于XWPFRun属性的更多使用技巧,请阅读源码:
源码地址:https://github.com/tonyqus/npoi/blob/master/ooxml/XWPF/Usermodel/XWPFRun.cs
颜色的十六进制对照表:
参考地址:https://www.cnblogs.com/cainiao-chuanqi/p/11301471.html
四、NPOI生成Word完整代码:
NPOI-Export-Word段落,文本,表格,字体等相关样式统一封装【NpoiWordParagraphTextStyleHelper.cs】:
/**
* Author:追逐时光
* Description:Npoi之导出Word段落,文本,表格,字体等相关样式统一封装
* Description:2020年3月25日
*/ using System;
using NPOI.XWPF.UserModel;
using NPOI.OpenXmlFormats.Wordprocessing; namespace YY_Utility
{
public class NpoiWordParagraphTextStyleHelper
{
private static NpoiWordParagraphTextStyleHelper _exportHelper; public static NpoiWordParagraphTextStyleHelper _
{
get => _exportHelper ?? (_exportHelper = new NpoiWordParagraphTextStyleHelper());
set => _exportHelper = value;
} /// <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>
/// <param name="fontColor">字体颜色--十六进制</param>
/// <param name="isItalic">是否设置斜体(字体倾斜)</param>
/// <returns></returns>
public XWPFParagraph ParagraphInstanceSetting(XWPFDocument document, string fillContent, bool isBold, int fontSize, string fontFamily, ParagraphAlignment paragraphAlign, bool isStatement = false, string secondFillContent = "", string fontColor = "", bool isItalic = false)
{
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); //设置标题样式如:(微软雅黑,隶书,楷体)根据自己的需求而定 if (!isStatement) return paragraph; XWPFRun secondXwpfRun = paragraph.CreateRun();//创建段落文本对象
secondXwpfRun.IsBold = isBold;//文字加粗
secondXwpfRun.SetText(secondFillContent);//填充内容
secondXwpfRun.FontSize = fontSize;//设置文字大小
secondXwpfRun.IsItalic = isItalic;//是否设置斜体(字体倾斜)
secondXwpfRun.SetColor(fontColor);//设置字体颜色--十六进制
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 XWPFParagraph SetTableParagraphInstanceSetting(XWPFDocument document, XWPFTable table, string fillContent, ParagraphAlignment paragraphAlign, int textPosition = , bool isBold = false, int fontSize = , string fontColor = "", 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的高度设置效果
return paragraph;
}
}
}
生成并保存Word:
using Microsoft.AspNetCore.Hosting;
using NPOI.OpenXmlFormats.Wordprocessing;
using NPOI.XWPF.UserModel;
using System;
using System.IO;
using YY_Utility; namespace Export.Services
{
public class NpoiWordExportService
{
private static IHostingEnvironment _environment; public NpoiWordExportService(IHostingEnvironment iEnvironment)
{
_environment = iEnvironment;
} #region 生成word /// <summary>
/// 生成word文档,并保存静态资源文件夹(wwwroot)下的SaveWordFile文件夹中
/// </summary>
/// <param name="savePath">保存路径</param>
public bool SaveWordFile(out string savePath)
{
savePath = "";
try
{
string currentDate = DateTime.Now.ToString("yyyyMMdd");
string checkTime = DateTime.Now.ToString("yyyy年MM月dd日");//检查时间
//保存文件到静态资源wwwroot,使用绝对路径路径
var uploadPath = _environment.WebRootPath + "/SaveWordFile/" + currentDate + "/";//>>>相当于HttpContext.Current.Server.MapPath("") string workFileName = checkTime + "追逐时光企业员工培训考核统计记录表";
string fileName = string.Format("{0}.docx", workFileName, System.Text.Encoding.UTF8); if (!Directory.Exists(uploadPath))
{
Directory.CreateDirectory(uploadPath);
} //TODO:使用FileStream文件流来写入数据(传入参数为:文件所在路径,对文件的操作方式,对文件内数据的操作)
//通过使用文件流,创建文件流对象,向文件流中写入内容,并保存为Word文档格式
using (var stream = new FileStream(Path.Combine(uploadPath, fileName), FileMode.Create, FileAccess.Write))
{
//创建document文档对象对象实例
XWPFDocument document = new XWPFDocument(); /**
*这里我通过设置公共的Word文档中SetParagraph(段落)实例创建和段落样式格式设置,大大减少了代码的冗余,
* 避免每使用一个段落而去创建一次段落实例和设置段落的基本样式
*(如下,ParagraphInstanceSetting为段落实例创建和样式设置,后面索引表示为当前是第几行段落,索引从0开始)
*/
//文本标题
document.SetParagraph(NpoiWordParagraphTextStyleHelper._.ParagraphInstanceSetting(document, workFileName, true, , "宋体", ParagraphAlignment.CENTER), ); //TODO:这里一行需要显示两个文本
document.SetParagraph(NpoiWordParagraphTextStyleHelper._.ParagraphInstanceSetting(document, $"编号:20190927101120445887", false, , "宋体", ParagraphAlignment.LEFT, true, $" 检查时间:{checkTime}"), ); document.SetParagraph(NpoiWordParagraphTextStyleHelper._.ParagraphInstanceSetting(document, "登记机关:企业员工监督检查机构", false, , "宋体", ParagraphAlignment.LEFT), ); #region 文档第一个表格对象实例
//创建文档中的表格对象实例
XWPFTable firstXwpfTable = document.CreateTable(, );//显示的行列数rows:3行,cols:4列
firstXwpfTable.Width = ;//总宽度
firstXwpfTable.SetColumnWidth(, ); /* 设置列宽 */
firstXwpfTable.SetColumnWidth(, ); /* 设置列宽 */
firstXwpfTable.SetColumnWidth(, ); /* 设置列宽 */
firstXwpfTable.SetColumnWidth(, ); /* 设置列宽 */ //Table 表格第一行展示...后面的都是一样,只改变GetRow中的行数
firstXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "企业名称", ParagraphAlignment.CENTER, , true));
firstXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "追逐时光", ParagraphAlignment.CENTER, , false));
firstXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "企业地址", ParagraphAlignment.CENTER, , true));
firstXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "湖南省-长沙市-岳麓区", ParagraphAlignment.CENTER, , false)); //Table 表格第二行
firstXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "联系人", ParagraphAlignment.CENTER, , true));
firstXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "小明同学", ParagraphAlignment.CENTER, , false));
firstXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "联系方式", ParagraphAlignment.CENTER, , true));
firstXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "151****0456", ParagraphAlignment.CENTER, , false)); //Table 表格第三行
firstXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "企业许可证号", ParagraphAlignment.CENTER, , true));
firstXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "XXXXX-66666666", ParagraphAlignment.CENTER, , false));
firstXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "检查次数", ParagraphAlignment.CENTER, , true));
firstXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, $"本年度检查8次", ParagraphAlignment.CENTER, , false)); firstXwpfTable.GetRow().MergeCells(, );//合并3列
firstXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "", ParagraphAlignment.LEFT, , false)); #endregion var checkPeopleNum = ;//检查人数
var totalScore = ;//总得分 #region 文档第二个表格对象实例(遍历表格项)
//创建文档中的表格对象实例
XWPFTable secoedXwpfTable = document.CreateTable(, );//显示的行列数rows:8行,cols:4列
secoedXwpfTable.Width = ;//总宽度
secoedXwpfTable.SetColumnWidth(, ); /* 设置列宽 */
secoedXwpfTable.SetColumnWidth(, ); /* 设置列宽 */
secoedXwpfTable.SetColumnWidth(, ); /* 设置列宽 */
secoedXwpfTable.SetColumnWidth(, ); /* 设置列宽 */ //遍历表格标题
secoedXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "员工姓名", ParagraphAlignment.CENTER, , true));
secoedXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "性别", ParagraphAlignment.CENTER, , true));
secoedXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "年龄", ParagraphAlignment.CENTER, , true));
secoedXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "综合评分", ParagraphAlignment.CENTER, , true)); //遍历四条数据
for (var i = ; i < ; i++)
{
secoedXwpfTable.GetRow(i).GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "小明" + i + "号", ParagraphAlignment.CENTER, , false));
secoedXwpfTable.GetRow(i).GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, "男", ParagraphAlignment.CENTER, , false));
secoedXwpfTable.GetRow(i).GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, + i + "岁", ParagraphAlignment.CENTER, , false));
secoedXwpfTable.GetRow(i).GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, firstXwpfTable, + i + "分", ParagraphAlignment.CENTER, , false)); checkPeopleNum++;
totalScore += + i;
} #endregion #region 文档第三个表格对象实例
//创建文档中的表格对象实例
XWPFTable thirdXwpfTable = document.CreateTable(, );//显示的行列数rows:5行,cols:4列
thirdXwpfTable.Width = ;//总宽度
thirdXwpfTable.SetColumnWidth(, ); /* 设置列宽 */
thirdXwpfTable.SetColumnWidth(, ); /* 设置列宽 */
thirdXwpfTable.SetColumnWidth(, ); /* 设置列宽 */
thirdXwpfTable.SetColumnWidth(, ); /* 设置列宽 */
//Table 表格第一行,后面的合并3列(注意关于表格中行合并问题,先合并,后填充内容)
thirdXwpfTable.GetRow().MergeCells(, );//从第一列起,合并3列
thirdXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, thirdXwpfTable, " " + "检查内容: " +
$"于{checkTime}下午检查了追逐时光企业员工培训考核并对员工的相关信息进行了相关统计,统计结果如下: " +
"-------------------------------------------------------------------------------------" +
$"共对该企业({checkPeopleNum})人进行了培训考核,培训考核总得分为({totalScore})分。 " + "", ParagraphAlignment.LEFT, , false)); //Table 表格第二行
thirdXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, thirdXwpfTable, "检查结果: ", ParagraphAlignment.CENTER, , true));
thirdXwpfTable.GetRow().MergeCells(, );//从第二列起,合并三列
thirdXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, thirdXwpfTable, "该企业非常优秀,坚持每天学习打卡,具有蓬勃向上的活力。", ParagraphAlignment.LEFT, , false)); //Table 表格第三行
thirdXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, thirdXwpfTable, "处理结果: ", ParagraphAlignment.CENTER, , true));
thirdXwpfTable.GetRow().MergeCells(, );
thirdXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, thirdXwpfTable, "通过检查,评分为优秀!", ParagraphAlignment.LEFT, , false)); //Table 表格第四行,后面的合并3列(注意关于表格中行合并问题,先合并,后填充内容),额外说明
thirdXwpfTable.GetRow().MergeCells(, );//合并3列
thirdXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, thirdXwpfTable, "备注说明: 记住,坚持就是胜利,永远保持一种求知,好问的心理!", ParagraphAlignment.LEFT, , false)); //Table 表格第五行
thirdXwpfTable.GetRow().MergeCells(, );
thirdXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, thirdXwpfTable, " 检查人员签名: 年 月 日", ParagraphAlignment.LEFT, , false));
thirdXwpfTable.GetRow().MergeCells(, ); thirdXwpfTable.GetRow().GetCell().SetParagraph(NpoiWordParagraphTextStyleHelper._.SetTableParagraphInstanceSetting(document, thirdXwpfTable, " 企业法人签名: 年 月 日", ParagraphAlignment.LEFT, , false)); #endregion //向文档流中写入内容,生成word
document.Write(stream); savePath = "/SaveWordFile/" + currentDate + "/" + fileName; return true;
}
}
catch (Exception ex)
{
//ignore
savePath = ex.Message;
return false;
}
}
#endregion
}
}
总结:
写到最后我只想说我太难了,为了实现我想要的这个样式,通过不断的查阅资料,理解NPOI中的段落,文本,字体等基本属性。最终在我生成第28个Word时,总算是达到了我要的效果。这里我将自己在网上查阅的一些资料和自己在实践中的收获、心得分享给大家,希望能够帮到大家,别忘了给我star哟。
相关实例链接地址:
GitHub完整实例地址:
https://github.com/YSGStudyHards/NPOI-ExportWordAndExcel-ImportExcelData
.NET Core使用NPOI导出复杂,美观的Excel详解:
.NET Core使用NPOI导出复杂Word详解:
.NET Core使用NPOI将Excel中的数据批量导入到MySQL:
.NET Core使用NPOI导出复杂Word详解的更多相关文章
- .NET Core使用NPOI导出复杂,美观的Excel详解
前言: 这段时间一直专注于数据报表的开发,当然涉及到相关报表的开发数据导出肯定是一个不可避免的问题啦.客户要求要导出优雅,美观的Excel文档格式的来展示数据,当时的第一想法就是使用NPOI开源库来做 ...
- java实现excel的导入导出(poi详解)[转]
java实现excel的导入导出(poi详解) 博客分类: java技术 excel导出poijava 经过两天的研究,现在对excel导出有点心得了.我们使用的excel导出的jar包是poi这个 ...
- [转]mysqldump备份还原和mysqldump导入导出语句大全详解
FROM : http://www.cnblogs.com/zeroone/archive/2010/05/11/1732834.html mysqldump备份还原和mysqldump导入导出语句大 ...
- 深入浅出 Cocoa 之 Core Data(1)- 框架详解
深入浅出 Cocoa 之 Core Data(1)- 框架详解 罗朝辉(http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 Core data 是 Cocoa 中处 ...
- [Cocoa]深入浅出 Cocoa 之 Core Data(1)- 框架详解
Core data 是 Cocoa 中处理数据,绑定数据的关键特性,其重要性不言而喻,但也比较复杂.Core Data 相关的类比较多,初学者往往不太容易弄懂.计划用三个教程来讲解这一部分: 框架详解 ...
- StreamSets学习系列之StreamSets的Core Tarball方式安装(图文详解)
不多说,直接上干货! 前期博客 StreamSets学习系列之StreamSets支持多种安装方式[Core Tarball.Cloudera Parcel .Full Tarball .Full R ...
- .net core 实现npoi导出
Nuget 安装 NPOI 2.4.1 工作时间写着测试玩玩 public void ExportDataToExcel() { var workbook = new HSSFWorkbook(); ...
- java实现excel的导入导出(poi详解)
经过两天的研究,现在对excel导出有点心得了.我们使用的excel导出的jar包是poi这个阿帕奇公司的一个项目,后来被扩充了.是比较好用的excel导出工具. 下面来认识一下这个它吧. 我们知道要 ...
- EntityFramewok Core 1.1连接MSSql数据库详解
最近在研究ASP.NET Core,其中就用到了Entity Framework Core,对于Entity Framework Core连接SqlServer数据库,使用Code Frist创建数据 ...
随机推荐
- GUID做主键真的合适吗
在一个分布式环境中,我们习惯使用GUID做主键,来保证全局唯一,然后,GUID做主键真的合适吗? 其实GUID做主键本身没有问题,微软的很多项目自带DB都是使用GUID做主键的,显然,这样做是没有问题 ...
- 设计模式(C#)——08组合模式
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 游戏通常包含许多视图.主视图中显示角色.有一个子视图,显示玩家的积分.有一个子视图,显示游戏中剩下的时间. ...
- Java多线程之线程的启动
Java多线程之线程的启动 一.前言 启动线程的方法有如下两种. 利用Thread 类的子类的实例启动线程 利用Runnable 接口的实现类的实例启动线程 最后再介绍下java.util.concu ...
- Mysql系列 - 第3天:管理员必备技能(必须掌握)
这是mysql系列第3篇文章. 环境:mysql5.7.25,cmd命令中进行演示. 在玩mysql的过程中,经常遇到有很多朋友在云上面玩mysql的时候,说我创建了一个用户为什么不能登录?为什么没有 ...
- Unity进阶:PlayMaker
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- JavaScript label语句
使用label 语句可以在代码中添加标签,以便将来使用. 以下是label 语句的语法: label: statement 下面是一个示例: start: for (var i=0; i < c ...
- spark与mapreduce的区别
spark是通过借鉴Hadoop mapreduce发展而来,继承了其分布式并行计算的优点,并改进了mapreduce明显的缺陷,具体表现在以下几方面: 1.spark把中间计算结果存放在内存中,减少 ...
- 【Offer】[18-1] 【在O(1)时间内删除链表节点】
题目描述 思路分析 测试用例 代码链接 题目描述 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 思路分析 一般我们删除单链表中的节点是需要遍历链表,找到要删除节点的前一个 ...
- 【Offer】[17] 【打印1到最大的n位数】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数即999. 思路分析 要考虑到大数问题, ...
- SpringBoot——HelloWorld
微服务和单体应用的宏观理解 微服务:一组小型应用通过HTTP的方式进行沟通的开发思想 单体应用:ALL IN ONE 单体应用的不足: 随着业务逻辑的不断更新和迭代开发,起初的小型应用会不断膨胀,当应 ...