zoukankan      html  css  js  c++  java
  • 批量 生成 word 多线程

    以下示例将完成批量导出word的功能,由于涉及到批量,为了页面不‘假死’,用到了多线程。至于线程最多能有多少个,网上说没有限制,当时也懒得考虑了,直接多少份就用多少线程。

           导出借用的是水晶报表(Crystal Reports)的现有资源,主要就是稳定,比前一篇导出word的不确定因素相比少了很多。最重要的是,这个页面很复杂,使用了三个子报表,水晶报表的强大之处完全体现出来了。

         如果仔细看,你会发现,不只是导出word,最下面的方法是选择导出的格式,有5种,我所知道常用的,除了Cvs格式都有了,能够满足你的要求了吧。。

          /// <summary>
        /// 多线程操作
        /// </summary>
        class threadbody
        {
            Bill_Word billWord; //类
            int threadId;//线程编号
            string thCustId;   //客户编号
            string path;

            public threadbody(Bill_Word _billWord, int _threadId, string _thCustId, string _path)
            {     
                billWord = _billWord;
                threadId = _threadId;
                thCustId = _thCustId;
                path = _path;
            }

            /// <summary>
            /// 线程批量生成
            /// </summary>
            public void ThreadCreate()
            {
                    ReportDocument myReport = new ReportDocument();
                    string reportPath = System.Threading.Thread.GetDomain().BaseDirectory + "Reports\\rpt\\rp_word.rpt";

                    myReport.Load(reportPath);
                    //数据填充
                    DataSet fillDS = billWord.GetFill(thCustId);
                    myReport.SetDataSource(fillDS);
                    string fileName = fillDS.Tables[3].Rows[0][7].ToString() + DateTime.Now.ToString("yyyyMMddhhssmm");
                    if (billWord.Export(path + fileName, "doc", myReport, thCustId)) //如果导出成功,保存记录
                    {
                        clsReports.fExportFilesAction(1,"",fileName + ".doc",fillDS.Tables[3].Rows[0][6].ToString(),thCustId,DateTime.Now,false,Convert.ToDateTime(fillDS.Tables[3].Rows[0][0]).Month + "月");
                        billWord.BArr_threadw[threadId] = true;//表明此线程结束。
                    }

            }
        }

       

    /// <summary>
        /// 页面类(经过精简,只要相关内容)
        /// </summary>

        public partial class Bill_Word : System.Web.UI.Page
        {

            public bool[] BArr_threadw; //每个线程结束标志
            public bool BFinish;
            public string[] custIds;
            public string mes = "现在没信息啦";
            private StringBuilder sb_suc = new StringBuilder("");

            protected void Page_Load(object sender, EventArgs e)
            {
                if (Request["action"] == "1")   //批量生成
                {
                    //Thread thCreate = new Thread(new ThreadStart(ThreadCreate));
                    //thCreate.Start();
                    //ThreadCreate();
                    custIds = Request.Cookies["Bill_custs"].Value.Split(',');
                    //定义线程数组,启动接收线程
                    Thread[] threadSend = new Thread[custIds.Length];   //多线程
                    threadbody[] thBody = new threadbody[custIds.Length]; //类
                    for (int j = 0; j < custIds.Length; j++)
                    {
                        thBody[j] = new threadbody(this, j, custIds[j],Server.MapPath("..\\Bill\\Send\\"));
                        threadSend[j] = new Thread(new ThreadStart(thBody[j].ThreadCreate));
                        threadSend[j].Start();
                    }
                    BArr_threadw = new bool[custIds.Length];
                    MesShow();
                }
        }

            /// <summary>
            /// 所有线程结束提示
            /// </summary>
            public void MesShow()
            {
                while (true)//等待
                {
                    BFinish = true;
                    for (int i = 0; i <custIds.Length; i++)
                    {
                        if (BArr_threadw[i] == false)//有未结束线程,等待
                        {
                            BFinish = false;
                            Thread.Sleep(100);
                            break;
                        }
                    }
                    if (BFinish == true)//所有线程均已结束,停止等待,
                    {
                        break;
                    }
                }
                if (BFinish == true)
                {

                    //操作提示
                    int total = custIds.Length;
                    int suc = sb_suc.ToString().Split(',').Length;
                    int fail = total - suc;
                    //btnSend.AddScript(clsSystem.fGetExtMsgAlert("系统提示", string.Format("总共发送邮件{0}封,成功发送邮件{1}封,失败{2}封", total, suc, fail)));
                    //GridFiles.Reload();
                    mes = string.Format("总共生成对账单{0}份,成功生成{1}份,失败{2}份", total, suc, fail);
                    Response.Write("<script>alert('"+mes+"');</script>");
                }

            }

            /// <summary>
            /// 导出到服务器端
            /// </summary>
            /// <param name="FileName">文件保存路径</param>
            /// <param name="Ext">扩展名(doc.pdf.rtf.xls.html)</param>
            /// <param name="_report"></param>
             public bool Export(string FileName, string Ext,ReportDocument _report,string Id)
             {
                 try
                 {
                     ExportOptions exportOptions = new ExportOptions();
                     DiskFileDestinationOptions diskOptions = ExportOptions.CreateDiskFileDestinationOptions();
                     exportOptions.ExportFormatType = GetExportFormatType(Ext);
                     exportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
                     diskOptions.DiskFileName = FileName + "." + Ext;
                     exportOptions.ExportDestinationOptions = diskOptions;
                     _report.Export(exportOptions);
                     if (sb_suc.ToString() == "")
                         sb_suc.Append(Id);
                     else
                         sb_suc.Append("," + Id);
                     return true;
                 }
                 catch
                 {
                     return false;
                 }
             }

            /// <summary>
            /// 导出格式
            /// </summary>
            /// <param name="ext"></param>
            /// <returns></returns>
             private ExportFormatType GetExportFormatType(string ext)
             {
                 switch (ext)
                 {
                     case "pdf":
                          return ExportFormatType.PortableDocFormat;
                      case "rtf":
                          return ExportFormatType.RichText;
                      case "doc":
                          return ExportFormatType.WordForWindows;
                      case "xls":
                          return ExportFormatType.Excel;
                      case "html":
                          return ExportFormatType.HTML32;                
                     default:
                         return ExportFormatType.NoFormat;
                 }
             }
    }

  • 相关阅读:
    拓端tecdat|R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据(MNIST)
    拓端tecdat|R语言资产配置策略量化模型:改进的移动平均线策略动态回测
    拓端tecdat|R语言量化:合成波动率指数移动平均策略分析标准普尔500波动率指数(VIX)
    拓端tecdat|Python中的多项式回归拟合非线性关系实例
    从集团管控到集团赋能
    性能之巅-优化你的程序
    3个小时,从学到做,我用低代码平台搭了一套管理系统
    Hadoop架构原理
    硬核操作系统讲解
    一文弄懂什么是DevOps
  • 原文地址:https://www.cnblogs.com/ljg3020/p/2487062.html
Copyright © 2011-2022 走看看