您的位置:首页 > 其它

通用邮件自动发送Winform控件开发(三)

2011-03-16 14:59 337 查看
在上一节中完成了Excel的打开,下面我们来看一下数据写入。首先我们分析一下,在Excel打开后,写入的过程应该是用户在外部调用写入方法,并传入一个DataTable数据源,其他的工作应该全部由写入方法完成,用户不需要管在写入过程中遇到的问题,好,那结合我们在上一节分析的在写入过程中可能遇到的问题,我们画出写入数据的流程图,如下:



上图中还有一个步骤缺失了,在写入数据完成后应该将本次数据写入的结束位置保存到配置文件中,以便下一次数据写入时直接读取。写入对外公开的方法只有一个,代码如下:

/// <summary>
/// 将需要写入的数据塞入队列,等待计时器轮询条件是否满足,满足时执行写入操作
/// </summary>
/// <param name="dt"></param>
public void WriteExcel(System.Data.DataTable dt)
{
dtQueue.Enqueue(dt);
}
private void BeginWrite()
{
t = new System.Timers.Timer();
t.Interval = 1000;
t.Enabled = true;
t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
t.Start();
}
private void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (dtQueue.Count > 0 && flag == true)
System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(WriteData));
}


计时器检查连个参数,一个是队列内对象的数量,第二个是上一次写入操作是否完成,当队列内对象数量不为0并且上一次写入操作已经完成时,队列弹出一个顶部对象,开始下一次数据写入,代码如下:

private void WriteData(object obj)
{
int version, workSheet, beginRow;
flag = false;
AppconfigOperate.FindBeginWritePlace(out version, out workSheet, out beginRow);
System.Data.DataTable dt = this.dtQueue.Dequeue();
switch (version)
{
case 2003:
{
if (dt.Rows.Count > 60000)
{
flag = true;
throw new Exception("数据表行数过大,无法处理");
}
object[,] objArray = DataTableToObjArray(dt);
WriteObjToExcel(objArray, workSheet, beginRow, 60000);
this._excelOperate.SaveChange();
flag = true;
break;
}
case 2007:
{
if (dt.Rows.Count > 1000000)
{
flag = true;
throw new Exception("数据表行数过大,无法处理");
}
object[,] objArray = DataTableToObjArray(dt);
WriteObjToExcel(objArray, workSheet, beginRow, 1000000);
this._excelOperate.SaveChange();
flag = true;
break;
}
}
}


其中需要将DataTable转换为二维对象数组,分割二维对象数组等方法就不一一啰嗦了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: