近期有需求根据数据库信息导出至Word文档,之前知道NPOI可以导出Word文档,因一直没有使用过,所以具体用法未知。
经过多个前人网页的过滤,发现NPOI的资料比较少,最终发现一个网页,对NPOI对Word的导出有了实质性的突破。
感谢这个作者!
下面是自己总结的NPOI对Word导出的源码片段!
1 Nuget安装NPOI
通过Nuget管理器,安装NPOI即可
2 帮助类
WordHelper.cs
这个类并不是帮助类,只是根据自己的需求,封装了几个方法。
public class WordHelper
{
//1 创建标题
/// <summary>
/// 创建标题
///
/// </summary>
/// <param name="doc"></param>
/// <param name="title"></param>
public void SetDocTitle(XWPFDocument doc, string title)
{
XWPFParagraph p0 = doc.CreateParagraph();//创建段落
p0.Alignment = ParagraphAlignment.CENTER;//居中显示
XWPFRun r0 = p0.CreateRun();
//设置字体
r0.FontFamily = "宋体";
//设置字体大小
r0.FontSize = 20;
//字体是否加粗,这里加粗了
r0.IsBold = true;
r0.SetText(title);//写入文本
}
/// <summary>
/// 创建H1
/// </summary>
/// <param name="doc"></param>
/// <param name="title"></param>
public void SetDocH1(XWPFDocument doc, string title)
{
XWPFParagraph p0 = doc.CreateParagraph();//创建段落
p0.Alignment = ParagraphAlignment.LEFT;//靠左显示
XWPFRun r0 = p0.CreateRun();
r0.IsCapitalized = true;
//设置字体
r0.FontFamily = "宋体";
//设置字体大小
r0.FontSize = 16;
//字体是否加粗,这里加粗了
r0.IsBold = true;
r0.SetText(title);//写入文本
}
public void SetDocH2(XWPFDocument doc, string title)
{
XWPFParagraph p0 = doc.CreateParagraph();//创建段落
p0.Alignment = ParagraphAlignment.LEFT;//靠左显示
XWPFRun r0 = p0.CreateRun();
r0.IsCapitalized = true;
//设置字体
r0.FontFamily = "宋体";
//设置字体大小
r0.FontSize = 14;
//字体是否加粗,这里加粗了
r0.IsBold = true;
r0.SetText(title);//写入文本
}
public void SetTableTitle(XWPFDocument doc, string title)
{
XWPFParagraph p1 = doc.CreateParagraph();
p1.Alignment = ParagraphAlignment.LEFT;
XWPFRun r1 = p1.CreateRun();
r1.SetText(title);
}
public void SetTable(XWPFDocument doc, DataTable dt)
{
if (dt != null && dt.Rows.Count > 0)
{
int rowCount = dt.Rows.Count;
int colCount = dt.Columns.Count;
XWPFTable table = doc.CreateTable(rowCount + 1, colCount);
int colWidth = 38 / colCount;
colWidth = colWidth == 0 ? 1 : colWidth;
//设置宽度
for (int i = 0; i < colCount; i++)
{
table.SetColumnWidth(i, (ulong)colWidth * 256);//设置列的宽度
}
//填写表的第一行
for (int i = 0; i < colCount; i++)
{
string colName = dt.Columns[i].ColumnName;
table.GetRow(0).GetCell(i).SetText(colName);
}
//填写表的内容
for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < colCount; j++)
{
string value = dt.Rows[i][j].ToString();
table.GetRow(i + 1).GetCell(j).SetText(value);
}
}
}
}
}
3 调用
XWPFDocument docx = new XWPFDocument();
MemoryStream ms = new MemoryStream();
WordHelper wordHelper = new WordHelper();
//1 设置标题
wordHelper.SetDocTitle(docx, "未注释的表");
2 创建模块信息
wordHelper.SetDocH1(docx, "1 模块");
wordHelper.SetTableTitle(docx, "模块编码名称:" + moduleInfo.ModuleName);
//3 创建表的信息
DataTable dtTables = TableInfoBiz.GetTableInfoByModule(moduleInfo.ModuleCode);
wordHelper.SetTable(docx, dtTables);
docx.Write(ms);
using (FileStream fs = new FileStream("Word/未找到注释的表.docx", FileMode.Create, FileAccess.Write))
{
byte[] data = ms.ToArray();
fs.Write(data, 0, data.Length);
fs.Flush();
}
ms.Close();
4 总结
- NPOI 可以生成Word文档
- NPOI对于Word操作的API解释很少
- 目前尚未研究出在Word中生成对应 “标题一”,“正文” 等格式的设置。因每个人Word的设置不同,因此感觉NPOI应该没有提供该功能。