您的位置:首页 > 编程语言 > ASP

npoi table样板填写并导出word

2017-08-09 15:29 218 查看
最近公司要做一个自己用的日志系统记录工作情况,最后生成一个word文档

word文档原始模板如下:

为了实现将每天的日志对应的填入表中,忙碌了一下午去网上搜素有关于npoi导出word的方法,但是网上那些东西,都和我这个有点区别,不能满足需求。

最后自己总结了一下npoi用法,希望能给各位和我一样初次使用npoi的小白一些帮助。

首先在自己的网站项目中放入一个已编辑过的模板:

将模板放入到自己网站项目的文件夹下面(我放入的路径是网站下面的document文件夹下):

最后就是代码阶段了:

前台页面放一个ImageButton(OnClick="btnExport_Click")来触发导出事件

后台代码如下:

protected void btnExport_Click(object sender, ImageClickEventArgs e)
{
string filePath = Server.MapPath("../Document/tmp.docx"); //模板文件路径

using (FileStream stream = File.OpenRead(filePath))
{
XWPFDocument doc = new XWPFDocument(stream);

XWPFTable table = doc.Tables[0];

foreach (XWPFTableRow row in table.Rows)
{
foreach (XWPFTableCell cell in row.GetTableCells())
{
ReplaceKey(cell, ((ImageButton)sender).CommandArgument.ToString());
}
}
string path = Server.MapPath("../Template/周工作任务报告.docx");

FileStream outfile = new FileStream(path, FileMode.Create);
doc.Write(outfile);
outfile.Close();
}

string strFilePath = Server.MapPath("../Template/周工作任务报告.docx");
string fileName = "周工作任务报告.docx";//客户端保存的文件名

FileStream fs = new FileStream(strFilePath, FileMode.Open);
byte[] bytes = new byte[(int)fs.Length];
fs.Read(bytes, 0, bytes.Length);
fs.Close();
Response.ContentType = "application/octet-stream";
//通知浏览器下载文件而不是打开
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
Response.BinaryWrite(bytes);
Response.Flush();
Response.End();

}
private void ReplaceKey(XWPFTableCell cell, string ss) //替换模板中的关键字,实现导出
{
string today = DateTime.Now.DayOfWeek.ToString();
DateTime date = DateTime.Now.Date;
switch (today)
{
case "Tuesday": date = date.AddDays(-1); break;
case "Wednesday": date = date.AddDays(-2); break;
case "Thursday": date = date.AddDays(-3); break;
case "Friday": date = date.AddDays(-4); break;
case "Saturday": date = date.AddDays(-5); break;
case "Sunday": date = date.AddDays(-6); break;
} //这里主要是计算本周一的日期,方便在数据库中查找用户本周的日志
string[] s = new string[7];
for (int i = 0; i < 7; i++)
{
DateTime date2 = date.AddDays(i);
RzdjEntity model = new RzdjAction().GetContent(User.UCode, date2, date2.AddDays(1)); //查找并取出日志实体(RzdjEntity)
s[i] = "";
if (model != null)
s[i] = model.content;
}

int id = int.Parse(ss);
switch (cell.GetText()) //替换word模板中的内容
{

case "name": cell.RemoveParagraph(0); cell.SetText(User.Name); break;
case "depart": cell.RemoveParagraph(0); cell.SetText(User.DName); break;
case "job": cell.RemoveParagraph(0);
if (User.Name == "吴孟浩" || User.Name == "蒋力超")
cell.SetText("实习"); break;
case "date": cell.RemoveParagraph(0); cell.SetText(DateTime.Now.Date.ToString("yyyy/MM/dd")); break;
case "nextweek": cell.RemoveParagraph(0); cell.SetText(new WeeklyLogAction().GetInfo(id).NextWeek.ToString()); break;

//周一到周六的工作具体情况
case "Monday": cell.RemoveParagraph(0); cell.SetText(s[0]); break;
case "Tuesday": cell.RemoveParagraph(0); cell.SetText(s[1]); break;
case "Wednesday": cell.RemoveParagraph(0); cell.SetText(s[2]); break;
case "Thursday": cell.RemoveParagraph(0); cell.SetText(s[3]); break;
case "Friday": cell.RemoveParagraph(0); cell.SetText(s[4]); break;
case "Saturday": cell.RemoveParagraph(0); cell.SetText(s[5]); break;

case "Sunday": cell.RemoveParagraph(0); cell.SetText(""); break;
default: break;
}

}

最后效果如下:

在替换的过程中要注意:先清空单元格然后setText()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  asp.net word npoi