/// <summary> /// 开始异步处理. /// </summary> public void StartAsynchronousProcess() { // 首先判断 当前运行状态. // 避免 同时打开多个线程进行处理. if (runningStatus == ExcelExportProcessRunningStatus.NotStart || runningStatus == ExcelExportProcessRunningStatus.ProcessFinish) { // 默认情况下, 线程处于 等待状态. runningStatus = ExcelExportProcessRunningStatus.IsWaiting; // 消费线程. Thread reader = new Thread(CreateExcelReport); reader.Start(); } else { // 线程已经启动. // 抛出异常. throw new ThreadStateException("Excel 报表处理线程已经启动."); } }
/// <summary> /// 创建 Excel 报表. /// </summary> /// <param name="dataList"></param> /// <param name="outputFileName"></param> private void CreateExcelReport() { // 取得连接字符串. String sConnectionString = Common.GetOleDbConnectionString(OutputFileName); // 定义 Oledb 的数据库联接. OleDbConnection cn = new OleDbConnection(sConnectionString); try { // 打开连接. cn.Open(); // 首先建表. string sqlCreate = ExcelDataExportFormater.GetCreateTableSql(); // 仅仅当 GetCreateTableSql() 函数返回的字符串 // 非空的情况下, 才执行 // 如果返回为空,那么可以认为是目标 Excel 已经有这个表 // 不需要重复创建了. if (!String.IsNullOrEmpty(sqlCreate)) { OleDbCommand cmd = new OleDbCommand(sqlCreate, cn); // 创建Sheet. cmd.ExecuteNonQuery(); } // 然后插入行. OleDbCommand icmd = new OleDbCommand(); icmd.Connection = cn; icmd.CommandText = ExcelDataExportFormater.GetInsertSql(); // 准备写到 Excel 当中的数据. List <T2> dataList = new List <T2>(); while (true) { // 需要确保 lock 代码段里面的代码 // 尽可能仅仅用于 队列数据的判断与获取 // 获取数据以后的业务处理逻辑,放到 lock 代码段以外. lock (locker) { if (this.dataQueue.Count == 0) { // 如果 队列为空. if (finishResult) { // 如果执行结束了. // 退出循环. break; } // 等待数据. runningStatus = ExcelExportProcessRunningStatus.IsWaiting; // 等待通知. Monitor.Wait(locker); } // 从 队列中获取数据, 加入处理列表. while (dataQueue.Count > 0) { dataList.Add(dataQueue.Dequeue()); } } if (dataList.Count > 0) { // 运行状态. runningStatus = ExcelExportProcessRunningStatus.IsRunning; Console.WriteLine( "写入{0}条数据到 Excel 中 AT {1}", dataList.Count, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); // 将临时列表中的数据, 写入 Excel . foreach (T2 oneData in dataList) { // 清空参数. icmd.Parameters.Clear(); // 从对象获取参数数组. OleDbParameter[] parameters = ExcelDataExportFormater.GetInsertParameter(oneData); // 遍历填写参数. for (int i = 0; i < parameters.Length; i++) { icmd.Parameters.Add(parameters[i]); } // 执行数据库插入操作. icmd.ExecuteNonQuery(); } // 清空临时列表. dataList.Clear(); } } } finally { // 执行完毕后,关闭连接. if (cn != null && cn.State == ConnectionState.Open) { cn.Close(); } } // 处理结束标志. runningStatus = ExcelExportProcessRunningStatus.ProcessFinish; }