导入日历ICS文件---解析icS文件

转帖|其它|编辑:郝浩|2009-04-21 14:36:39.000|阅读 5031 次

概述:通过代码详细介绍导入日历ICS文件的方法。

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

因项目需要,这几天写了个日历导入导出代码 (ICS文件)

与大家探讨探讨: 

 


#region
        
public override void VerifyRenderingInServerForm(Control control)
        {
            
//base.VerifyRenderingInServerForm(control);
        }
        
private ArrayList calendarResult = new ArrayList();
        
private ScheduleEntity seResult = new ScheduleEntity();
        
private string headerStr = "";
        
private string bodyStr = "";
        
private string tailStr = "";
        
private string enterSprite = "\r\n";
        
protected void Button1_Click(object sender, EventArgs e)
        {
            
            ScheduleEntity[] seTest 
= sm.select_("61b065cb-5192-4980-a207-0cff70725075", DateTime.Parse("2000-1-1"), DateTime.Parse("2010-1-1"));
            
int seLenth = seTest.Length;
            
for (int i = 0; i < seLenth; i++)
            {
                
//string t = System.DateTime.Now.Month.ToString();
                bodyStr += "BEGIN:VEVENT" + enterSprite;
                bodyStr 
+= "DTSTART:" + //"20070108T053000Z" + enterSprite;
                    seTest[i].BeginTime.Year.ToString() + seTest[i]
.BeginTime.Month.ToString(
"d2"+ seTest[i].BeginTime.Day.ToString("d2")
                    
+ "T" + seTest[i].BeginTime.Hour.ToString("d2"+
 seTest[i].BeginTime.Minute.ToString("d2"+ seTest[i].BeginTime.Second.ToString("d2")
                    
+ seTest[i].BeginTime.Millisecond.ToString("d3"+ "Z" + enterSprite;
                bodyStr 
+= "DTEND:" + //"20070108T053000Z" + enterSprite;
                    seTest[i].EndTime.Year.ToString() + seTest[i].
EndTime.Month.ToString(
"d2"+ seTest[i].EndTime.Day.ToString("d2")
                    
+ "T" + seTest[i].EndTime.Hour.ToString("d2"+ 
seTest[i].EndTime.Minute.ToString(
"d2"+ seTest[i].EndTime.Second.ToString("d2")
                    
+ seTest[i].EndTime.Millisecond.ToString("d3"+ "Z" + enterSprite;
 

                bodyStr 
+= "DTSTAMP:" + //"20070108T053000Z" + enterSprite;
                    seTest[i].CreateTime.Year.ToString() + 
seTest[i].CreateTime.Month.ToString(
"d2"+ seTest[i].CreateTime.Day.ToString("d2")
                    
+ "T" + seTest[i].CreateTime.Hour.ToString("d2"+ 
seTest[i].CreateTime.Minute.ToString(
"d2"+ seTest[i].CreateTime.Second.ToString("d2")
                    
+ seTest[i].CreateTime.Millisecond.ToString("d3"+ "Z" + enterSprite;
                    
                    
                bodyStr 
+= "UID:"+System.Guid.NewGuid().ToString()+
"-lenovo.Calendar" + enterSprite;//
                bodyStr += "CLASS:"+"private"+ enterSprite;//
                bodyStr += "CREATED:" + //"20070108T053000Z" + enterSprite;
                    seTest[i].CreateTime.Year.ToString() + seTest[i].
CreateTime.Month.ToString(
"d2"+ seTest[i].CreateTime.Day.ToString("d2")
                    
+ "T" + seTest[i].CreateTime.Hour.ToString("d2"+ 
seTest[i].CreateTime.Minute.ToString(
"d2"+ seTest[i].CreateTime.Second.ToString("d2")
                    
+ seTest[i].CreateTime.Millisecond.ToString("d3"+ "Z" + enterSprite;

                bodyStr 
+= "DESCRIPTION:" + seTest[i].Brief + enterSprite;//
                bodyStr += "LAST-MODIFIED:" + //"20070108T053000Z" + enterSprite;
                    seTest[i].CreateTime.Year.ToString() + seTest[i].
CreateTime.Month.ToString(
"d2"+ seTest[i].CreateTime.Day.ToString("d2")
                    
+ "T" + seTest[i].CreateTime.Hour.ToString("d2"+ 
seTest[i].CreateTime.Minute.ToString(
"d2"+ seTest[i].CreateTime.Second.ToString("d2")
                    
+ seTest[i].CreateTime.Millisecond.ToString("d3"+ "Z" + enterSprite;
                bodyStr 
+= "LOCATION:" + seTest[i].Place + enterSprite;//
                bodyStr += "SEQUENCE:" + seTest[i].ScheduleTypeID.ToString() + enterSprite;//
                bodyStr += "STATUS:" + seTest[i].UserName + enterSprite;//
                bodyStr += "SUMMARY:" + seTest[i].Summary+ enterSprite;
                bodyStr 
+= "TRANSP:" + "OPAQUE" + enterSprite;
                bodyStr 
+= "END:VEVENT" + enterSprite;
                
string alarmBody = "";// Alarm 
                List<RemindParamEntity> awokeList = seTest[i].RemindParamList;
                
if (awokeList.Count > 0)
                {
                    ;
                    
int test1 = 0;
                    test1 
= 0;
                }
                
foreach (RemindParamEntity al in awokeList)
                {
                    ;
                    
int test = 0;
                    test 
= 0;
                    
//短信提醒
                    if ((al.NeedRemind & 0x01== 0x01)
                    {
                        alarmBody 
+= "BEGIN:VALARM" + enterSprite;
                        alarmBody 
+= "ACTION:" + "MOBILE" + enterSprite;
                        alarmBody 
+= "DESCRIPTION:This is an event reminder"
 + enterSprite;
                        alarmBody 
+= "TRIGGER:" + setAwokeTime(al.TimeType,al.TimeValue) + enterSprite;
                        alarmBody 
+= "END:VALARM" + enterSprite;
                    }
                    
//邮件提醒
                    if ((al.NeedRemind & 0x02== 0x02)
                    {
                        alarmBody 
+= "BEGIN:VALARM" + enterSprite;
                        alarmBody 
+= "ACTION:" + "EMAIL" + enterSprite;
                        alarmBody 
+= "DESCRIPTION:This is an event reminder" +
 enterSprite;
                        alarmBody 
+= "SUMMARY:Alarm notification" + enterSprite;
                        alarmBody 
+= "ATTENDEE:mailto:" + Common.CommonLib.
GetMemberInfo().Email 
+ enterSprite;
                        alarmBody 
+= "TRIGGER:" + setAwokeTime(al.TimeType, al.
TimeValue) 
+ enterSprite;
                        alarmBody 
+= "END:VALARM" + enterSprite;

                    }
                    
//PC提醒
                    if ((al.NeedRemind & 0x04== 0x04)
                    {
                        alarmBody 
+= "BEGIN:VALARM" + enterSprite;
                        alarmBody 
+= "ACTION:" + "DISPLAY" + enterSprite;
                        alarmBody 
+= "DESCRIPTION:This is an event reminder" + enterSprite;
                        alarmBody 
+= "TRIGGER:" + setAwokeTime(al.TimeType, 
al.TimeValue) 
+ enterSprite;
                        alarmBody 
+= "END:VALARM" + enterSprite;

                    }
                }
                
//include the Alarm
                bodyStr += alarmBody;
               

            }


            headerStr 
= "BEGIN:VCALENDAR" + enterSprite +
                        
"PRODID:-//Lenovo Inc//Lenovo Calendar 90.6054//CN" + enterSprite +
                        
"VERSION:1.0" + enterSprite +
                        
"CALSCALE:GREGORIAN" + enterSprite +
                        
"METHOD:PUBLISH" + enterSprite +
                        
"X-WR-CALNAME:chen chen" + enterSprite +
                        
"X-WR-TIMEZONE:Asia/Shanghai" + enterSprite +

                        
"BEGIN:VTIMEZONE" + enterSprite +
                        
"TZID:Asia/Shanghai" + enterSprite +
                        
"X-LIC-LOCATION:Asia/Shanghai" + enterSprite +

                        
"BEGIN:STANDARD" + enterSprite +
                        
"TZOFFSETFROM:+0800" + enterSprite +
                        
"TZOFFSETTO:+0800" + enterSprite +
                        
"TZNAME:CST" + enterSprite +
                        
"DTSTART:19700101T000000" + enterSprite +
                        
"END:STANDARD" + enterSprite +

                        
"END:VTIMEZONE" + enterSprite;

            tailStr 
= "END:VCALENDAR"+enterSprite;

            Response.Clear();
            Response.Buffer 
= false;
            Response.ContentEncoding 
= System.Text.Encoding.UTF8;
            Response.AppendHeader(
"Content-Disposition"
"attachment;filename=" + Server.UrlEncode("fileName"+ ".ics");
            Response.ContentType 
= "text/calendar";
            
this.EnableViewState = false;
            Response.Write(headerStr
+bodyStr+tailStr);
            
//Response.Write(sb.ToString());
            Response.End();

        }
        
private string setAwokeTime(short valueType,int value)
        {
            
string result = "";
            
//TRIGGER:-P0DT0H10M0S

            
//提醒时间(TimeType)
            switch (valueType)
            {
                
//分钟
                case 1:
                    
if (value < 60)
                    {
                        result 
= "-P0DT0H" + value.ToString() + "M0S";
                    }
                    
else if (value < 1440)
                    {
                        
double aa = value / 60;
                        result 
= "-P0DT" + Math.Floor(aa).ToString() + "H" + 
(value 
% 60).ToString() + "M0S";
                    }
                    
else
                    {
                        
double aa = value / 1440;
                        
int leftM = value % 1440;//get this day value
                        double muniteLeft = leftM / 60;//get the hour value
                        result = "-P" + Math.Floor(aa).ToString() + "DT" +
 Math.Floor(muniteLeft).ToString() + "H" + (leftM % 60).ToString() + "M0S";
                    }
                    
break;
                
//小时//1440
                case 2:
                    
if (value < 24)
                    {
                        result 
= "-P0DT" + value.ToString() + "H0M0S";
                    }
                    
else
                    {
                        
double aa = value / 24;
                        result 
= "-P"+Math.Floor(aa).ToString()+"DT" + 
(value
%24).ToString() + "H0M0S";
                    }
                     
break;
                
//
                case 3:
                     result 
= "-P" + value.ToString() + "DT0H0M0S";
                     
break;
                
//
                case 4:
                     result 
= "-P" + (value * 7).ToString() + "DT0H0M0S";
                    
break;
            }
            
return result;

        }
        
private DateTime getDateTime(string tmp)
        {
            
//20090406T235959000Z
            string value = "";
            value 
= tmp.Substring(04+ "-" + tmp.Substring(42+ "-" + 
tmp.Substring(
62+ " " +
                tmp.Substring(
92+ ":" + tmp.Substring(112);
            
return Convert.ToDateTime(value);
        }
        
//case calendar
        private List<RemindParamEntity> awokeList = new
 List<RemindParamEntity>();
        
private string caseCalendar(string tmp,string value )
        {
            
bool alarmBegin = false;
            
if (tmp == "BEGIN")
            {
                alarmBegin 
= true;
                awokeList
=seResult.RemindParamList;
                
return;
            }
            
else if (tmp == "END")
            {
                alarmBegin 
= true;
            }
            
else if (alarmBegin)
            {

                
return;
            }
            
//List<RemindParamEntity> awokeList = seResult.RemindParamList;
            
//List<string> singleCalendarList = new List<string>();
            
//for (int i = 0; i < sLenth; i++)
            
//{
            
//    if (s[i] == "BEGIN:VEVENT")
            
//    {
            
//        calendarBegin = true;
            
//        singleCalendarList = new List<string>();
            
//        //singleCalendarList.Clear();
            
//    }
            
//    else if (s[i] == "END:VEVENT")
            
//    {
            
//        calendarArray.Add(singleCalendarList);
            
//        calendarBegin = false;
            
//    }
            
//    else if (calendarBegin)
            
//    {
            
//        singleCalendarList.Add(s[i]);
            
//    }

            
//}
            //////
            switch (tmp)
            {
                
case "DTSTART":

                    seResult.BeginTime 
= getDateTime(value);

                    
break;
                
case "DTEND":

                    seResult.EndTime 
= getDateTime(value);

                    
break;
                
case "DTSTAMP":

                   
// seResult.CreateTime = getDateTime(value);
                    ;

                    
break;
                
case "UID":

                    
//seResult.ScheduleID = 1;
                    ;

                    
break;
                
case "CLASS":

                    seResult.ScheduleTypeSet 
= value;

                    
break;
                
case "CREATED":

                    seResult.CreateTime 
= getDateTime(value);

                    
break;
                
case "DESCRIPTION":

                    seResult.Brief 
= value;

                    
break;
                
case "LAST-MODIFIED":

                    
//seResult.CreateTime = getDateTime(value);
                    ;

                    
break;
                
case "LOCATION":

                    seResult.Place 
= value;

                    
break;
                
case "SEQUENCE":

                      
//
                    ;

                    
break;
                
case "STATUS":

                    
//;
                    ;

                    
break;
                
case "SUMMARY":

                    seResult.Summary 
= value;

                    
break;
                
case "TRANSP":

                    
//;
                    ;

                    
break;
                
case "END":

                    ;
                    ;

                    
break;
                
default:
                    ;
                    
break;
               

            }
            
return "";

        }
        
private ArrayList calendarArray = new ArrayList();
        
protected void Button2_Click(object sender, EventArgs e)
        {
            
string[] s = GetStopWords();
            
int sLenth = s.Length;
            List
<string> singleCalendarList= new List<string>();
            
bool calendarBegin = false;
            
for (int i = 0; i < sLenth; i++)
            {
                
if (s[i] == "BEGIN:VEVENT")
                {
                    calendarBegin 
= true;
                    singleCalendarList
=new List<string>();
                    
//singleCalendarList.Clear();
                }
                
else if (s[i] == "END:VEVENT")
                {
                    calendarArray.Add(singleCalendarList);
                    calendarBegin 
= false;
                }
                
else if(calendarBegin)
                {
                    singleCalendarList.Add(s[i]);
                }
                
            }
            doWork(calendarArray);
            
        }
        
private void doWork(ArrayList a)
        {
            
//separate calendar
             List<string> calendar = new List<string>();
            
int len = a.Count;
            
for (int i = 0; i < len; i++)
            {
                calendar 
= (List<string>)a[i];
                doBusiness(calendar);
            }
            
//to do ddataBase
        }
        
private void doBusiness(List<string> L)
        {
            
//seResult init;
            
//seResult.BeginTime = "";
            seResult = new ScheduleEntity();
            
//singel calendar business
            foreach(string calendar in L)
            {
                
string[] subChild = calendar.Split(':');
                caseCalendar(subChild[
0], subChild[1]);
            }
            calendarResult.Add(seResult);

        }
        
protected string[] GetStopWords()
        {
            
using (StreamReader reader = new StreamReader(Server.MapPath("~" + "http://www.cnblogs.com/zhegebucuo/admin/file://page//files//calendarFile//44.ics")))
            {
                
string words = reader.ReadToEnd();
                
return words.Split(new char[] { '\r''\n' }, StringSplitOptions.RemoveEmptyEntries);

            }
        }
        

标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP