npoi table样板填写并导出word

最近公司要做一个自己用的日志系统记录工作情况,最后生成一个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()



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值