多线程导出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; |
| } |
| } |
| } |
浙公网安备 33010602011771号