Beispiel #1
0
        /// <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 报表处理线程已经启动.");
            }
        }
Beispiel #2
0
        /// <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;
        }