public void formatTcxGpx(string fileName) { string ext = Path.GetExtension(fileName); if (ext == null) { string msg = "Format TCX/GPX: Cannot handle files with no extension"; raiseGpxTcxEvent(new GpxTcxEventArgs(EventType.ERR, msg)); return; } if (ext.ToLower().Equals(".tcx")) { TrainingCenterDatabase tcx = TrainingCenterDatabase.Load(fileName); string saveFilename = getSaveName(fileName, ".formatted"); if (saveFilename != null) { tcx.Save(saveFilename); } } else if (ext.ToLower().Equals(".gpx")) { gpx gpx = gpx.Load(fileName); string saveFilename = getSaveName(fileName, ".formatted"); if (saveFilename != null) { gpx.Save(saveFilename); } } else { string msg = "Format TCX/GPX: Not a supported extension: " + ext; raiseGpxTcxEvent(new GpxTcxEventArgs(EventType.ERR, msg)); return; } }
public static void formatSingleTcxGpx(string fileName) { string ext = Path.GetExtension(fileName); if (ext == null) { Utils.errMsg("formatSingleTcxGpx: Cannot handle files with no extension"); return; } if (ext.ToLower().Equals(".tcx")) { TrainingCenterDatabase tcx = TrainingCenterDatabase.Load(fileName); string saveFilename = getSaveName(fileName, ".formatted"); if (saveFilename != null) { tcx.Save(saveFilename); } } else if (ext.ToLower().Equals(".gpx")) { gpx gpx = gpx.Load(fileName); string saveFilename = getSaveName(fileName, ".formatted"); if (saveFilename != null) { gpx.Save(saveFilename); } } else { Utils.errMsg("Not a supported extension: " + ext); return; } }
public static void interpolateTcxFromGpx(string tcxFile, string gpxFile, MainForm mainForm, GpsData.InterpolateMode mode) { try { TcxResult res = GpsData.interpolateTcxFromGpx(tcxFile, gpxFile, mode); if (res.TCX == null) { Utils.errMsg("Interpolate Tcx From Gpx failed:" + NL + "for " + Path.GetFileName(tcxFile) + NL + " and " + Path.GetFileName(gpxFile) + NL + res.Message); return; } TrainingCenterDatabase tcxInterp = res.TCX; string saveFileName = getSaveName(tcxFile, ".interpolated"); if (saveFileName != null) { tcxInterp.Save(saveFileName); mainForm.gpxTxcCallback(NL + "Recalculated " + tcxFile + NL + " from " + gpxFile + NL + " Output is " + saveFileName + NL + " " + res.Message); } else { return; } } catch (Exception ex) { Utils.excMsg("Error interpolating TCX from GPX", ex); return; } }
/// <summary> /// <para>Processes inputFiles into Google Maps</para> /// </summary> /// <param name="inputFiles">List of inputFiles to process</param> /// <param name="googleMapsMatch">Export parameters to process</param> public static void ToGoogleMaps(List <FileInfo> inputFiles, Match googleMapsMatch) { System.Console.WriteLine("Starting GarminToGoogleMaps Process ..."); var exportDirectoryPath = googleMapsMatch.Groups["googleMapsExportDirectory"].Value; var exportDirectory = new DirectoryInfo(exportDirectoryPath); if (!exportDirectory.Exists) { Console.WriteLine("Failed to Export to Google Maps: Unable to find Directory \"" + exportDirectoryPath + "\""); Console.WriteLine(); GarminTo.Program.ShowUsageMessage(); } else { Console.WriteLine("Exporting to Google Maps ... "); var fileIndex = 0; foreach (var inputFile in inputFiles) { fileIndex++; Console.WriteLine("Processing " + fileIndex + " of " + inputFiles.Count + " file(s)"); /* read in training centre database from file provide as arg 0 */ var trainingCenterDatabase = TrainingCenterDatabase.ReadFromFile(inputFile.FullName); var activityIndex = 0; foreach (var activity in trainingCenterDatabase.Activities) { activityIndex++; Console.WriteLine(" Processing " + activityIndex + " of " + trainingCenterDatabase.Activities.Count + " activities"); /* create map points (google) for creation of google maps */ var mapPoints = activity.ToMapPoints(); /* create google map file */ if (mapPoints.Count == 0) { Console.WriteLine(" " + activityIndex + " contains no GPS data, no Google map created."); } else { var outputFilePath = exportDirectory.FullName + "\\" + activity.Id.Replace(":", "-") + ".htm"; var outputFile = new MapFile(outputFilePath); outputFile.GenerateMap(mapPoints); } } } Console.WriteLine("Completed Exporting to Google Maps."); } Console.WriteLine(); }
public static void convertTcxToGpx(string fileName) { TrainingCenterDatabase tcx = TrainingCenterDatabase.Load(fileName); gpx gpx = GpsData.convertTcxToGpx(tcx); if (gpx != null) { fileName = Path.ChangeExtension(fileName, ".gpx"); string saveFilename = getSaveName(fileName, ".converted"); if (saveFilename != null) { gpx.Save(saveFilename); } } }
public static void convertGpxToTcx(string fileName) { gpx gpx = gpx.Load(fileName); TrainingCenterDatabase tcx = GpsData.convertGpxToTcx(gpx); if (tcx != null) { fileName = Path.ChangeExtension(fileName, ".tcx"); string saveFilename = getSaveName(fileName, ".converted"); if (saveFilename != null) { tcx.Save(saveFilename); } } }
private static Lap ConfigureLap(TrainingCenterDatabase db, List <Trackpoint> lapPoints, bool isLast) { var Track = new Track { Trackpoint = lapPoints }; var DistanceMeters = isLast ? (decimal.Parse(lapPoints[lapPoints.Count - 1].DistanceMeters, System.Globalization.NumberStyles.AllowDecimalPoint) % 1000).ToString() : "1000"; var StartTime = lapPoints[0].Time; var MaximumSpeed = lapPoints.Max(x => decimal.Parse(x.Extensions.TPX.Speed, System.Globalization.NumberStyles.AllowDecimalPoint)).ToString(); var MaximumHeartRateBpm = new MaximumHeartRateBpm { Value = lapPoints.Max(x => decimal.Parse(x.HeartRateBpm.Value, System.Globalization.NumberStyles.AllowDecimalPoint)).ToString() }; var AverageHeartRateBpm = new AverageHeartRateBpm { Value = lapPoints.Average(x => decimal.Parse(x.HeartRateBpm.Value, System.Globalization.NumberStyles.AllowDecimalPoint)).ToString() }; var TriggerMethod = "Manual"; var Intensity = db.Activities.Activity.Lap[0].Intensity; var Calories = db.Activities.Activity.Lap.Average(x => decimal.Parse(x.Calories, System.Globalization.NumberStyles.AllowDecimalPoint)).ToString(); var Extensions = new Extensions { LX = new LX { AvgRunCadence = lapPoints.Average(x => decimal.Parse(x.Extensions.TPX.RunCadence, System.Globalization.NumberStyles.AllowDecimalPoint)).ToString(), AvgSpeed = lapPoints.Average(x => decimal.Parse(x.Extensions.TPX.Speed, System.Globalization.NumberStyles.AllowDecimalPoint)).ToString(), MaxRunCadence = lapPoints.Max(x => decimal.Parse(x.Extensions.TPX.RunCadence, System.Globalization.NumberStyles.AllowDecimalPoint)).ToString() } }; var TotalTimeSeconds = (DateTime.Parse(lapPoints[lapPoints.Count - 1].Time) - DateTime.Parse(lapPoints[0].Time)).TotalSeconds.ToString(); return(new Lap { Track = Track, DistanceMeters = DistanceMeters, StartTime = StartTime, MaximumSpeed = MaximumSpeed, MaximumHeartRateBpm = MaximumHeartRateBpm, AverageHeartRateBpm = AverageHeartRateBpm, TriggerMethod = TriggerMethod, Intensity = Intensity, Calories = Calories, Extensions = Extensions, TotalTimeSeconds = TotalTimeSeconds }); }
public static void recalculateTcx(string fileName, MainForm mainForm) { try { TrainingCenterDatabase tcx = GpsData.recalculateTcx(fileName); string saveFileName = getSaveName(fileName, ".recalculated"); if (saveFileName != null) { tcx.Save(saveFileName); mainForm.gpxTxcCallback(NL + "Recalculated " + fileName + NL + " Output is " + saveFileName); } else { return; } } catch (Exception ex) { Utils.excMsg("Error recalculating TCX", ex); return; } }
public void recalculateTcx(string fileName) { try { TrainingCenterDatabase tcx = GpsData.recalculateTcx(fileName); string saveFileName = getSaveName(fileName, ".recalculated"); if (saveFileName != null) { tcx.Save(saveFileName); string msg = "Recalculate TCX: Recalculated " + fileName + NL + " Output is " + saveFileName; raiseGpxTcxEvent(new GpxTcxEventArgs(EventType.MSG, NL + msg)); } else { return; } } catch (Exception ex) { string msg = "Error recalculating TCX"; raiseGpxTcxEvent(new GpxTcxEventArgs(EventType.EXC, msg, ex)); return; } }
public GpxFileModel(GpxModel parent, string fileName) { Parent = parent; FileName = fileName; if (Path.GetExtension(fileName).ToLower().Equals(".tcx")) { IsTcx = true; TrainingCenterDatabase tcx = TrainingCenterDatabase.Load(fileName); if (tcx != null) { Gpx = GpsData.convertTcxToGpx(tcx); } else { Utils.errMsg("Failed to convert to GPX: " + NL + fileName); } } else { Gpx = gpx.Load(fileName); } reset(); }
public void interpolateTcxFromGpx(string tcxFile, string gpxFile, GpsData.InterpolateMode mode) { try { TcxResult res = GpsData.interpolateTcxFromGpx(tcxFile, gpxFile, mode); if (res.TCX == null) { string msg = "Interpolate Tcx From Gpx failed:" + NL + "for " + Path.GetFileName(tcxFile) + NL + " and " + Path.GetFileName(gpxFile) + NL + res.Message; raiseGpxTcxEvent(new GpxTcxEventArgs(EventType.ERR, msg)); return; } TrainingCenterDatabase tcxInterp = res.TCX; string saveFileName = getSaveName(tcxFile, ".interpolated"); if (saveFileName != null) { tcxInterp.Save(saveFileName); string msg = "Interpolate TCX from GPX: Recalculated " + tcxFile + NL + " from " + gpxFile + NL + " Output is " + saveFileName + NL + " " + res.Message; raiseGpxTcxEvent(new GpxTcxEventArgs(EventType.MSG, NL + msg)); } else { return; } } catch (Exception ex) { string msg = "Error interpolating TCX from GPX"; raiseGpxTcxEvent(new GpxTcxEventArgs(EventType.EXC, msg, ex)); return; } }
void Export() { string selectedFile = FileService.SaveFileDialog(); if (!string.IsNullOrEmpty(selectedFile)) { OutputFilePath = selectedFile; } if (!string.IsNullOrEmpty(OutputFilePath)) { DbProviderFactory fact = DbProviderFactories.GetFactory("System.Data.SQLite"); using (SQLiteConnection cnn = (SQLiteConnection)fact.CreateConnection()) { cnn.ConnectionString = "Data Source=" + FilePath; cnn.Open(); SQLiteCommand command = new SQLiteCommand( "SELECT PK_IntervalId, StartTime, TotalElapsedTime, TotalDistance, AverageStrokeRate, AverageHeartRate, AverageSpeed, TotalStrokeCount FROM Intervals" + " WHERE FK_SessionId = @sessionId", cnn); SQLiteParameter sessionParam = new SQLiteParameter("sessionId", System.Data.DbType.Int32); sessionParam.Value = SelectedSession.Id; command.Parameters.Add(sessionParam); SQLiteCommand dataRecordCommand = new SQLiteCommand( "SELECT dr.PK_DataRecordId, dr.ElapsedTime, dr.Latitude, dr.Longitude, dr.SpeedGps, dr.SpeedImpeller, dr.DistanceGps, dr.DistanceImpeller, dr.StrokeRate, dr.HeartRate," + " osd.Power, osd.CatchAngle, osd.FinishAngle, osd.PositionOfMaxForce, osd.AverageHandleForce, osd.MaxHandleForce, osd.Slip, osd.Wash, osd.RealWorkPerStroke" + " FROM DataRecords dr LEFT OUTER JOIN OarlockStrokeData osd ON osd.PK_OarlockStrokeRecordId = (SELECT PK_OarlockStrokeRecordId FROM OarlockStrokeData WHERE FK_DataRecordId = dr.PK_DataRecordId LIMIT 1)" + " WHERE dr.FK_IntervalId = @intervalId AND dr.Type = 0", cnn); // Type filtered to 0 to just pick up strokes SQLiteParameter intervalParam = new SQLiteParameter("intervalId", System.Data.DbType.Int32); dataRecordCommand.Parameters.Add(intervalParam); SQLiteDataReader reader = command.ExecuteReader(); while (reader.Read()) { int id = (int)(long)reader[0]; DateTime startTime = NKDateTimeConverter.NKToClr((long)reader[1]); int totalElapsedTime = (int)(long)reader[2]; int totalDistance = (int)(long)reader[3]; double strokeRate = Convert.ToDouble((long)reader[4]) / 2; int averageHeartRate = reader.IsDBNull(5) ? 0 : (int)(long)reader[5]; double speed = Convert.ToDouble((long)reader[6]) / 100; int totalStrokeCount = (int)(long)reader[7]; Interval interval = new Interval(id, startTime, totalElapsedTime, totalDistance, strokeRate, averageHeartRate, speed, totalStrokeCount); intervalParam.Value = interval.Id; SQLiteDataReader dataRecordReader = dataRecordCommand.ExecuteReader(); while (dataRecordReader.Read()) { DataRecord record = new DataRecord(); record.ElapsedTime = (int)(long)dataRecordReader[1]; record.Latitude = (double)dataRecordReader[2]; record.Longitude = (double)dataRecordReader[3]; record.SpeedGps = Convert.ToDouble((long)dataRecordReader[4]) / 100; record.SpeedImpeller = Convert.ToDouble((long)dataRecordReader[5]) / 100; record.DistanceGps = (int)(long)dataRecordReader[6]; record.DistanceImpeller = (int)(long)dataRecordReader[7]; record.StrokeRate = Convert.ToDouble((long)dataRecordReader[8]) / 2; record.HeartRate = (int)(long)dataRecordReader[9]; record.Power = dataRecordReader.IsDBNull(10) ? 0 : Convert.ToDouble((long)dataRecordReader[10]) / 10; record.CatchAngle = dataRecordReader.IsDBNull(11) ? 0 : (int)(long)dataRecordReader[11]; record.FinishAngle = dataRecordReader.IsDBNull(12) ? 0 : (int)(long)dataRecordReader[12]; record.MaxForceAngle = dataRecordReader.IsDBNull(13) ? 0 : (int)(long)dataRecordReader[13]; record.AvgHandleForce = dataRecordReader.IsDBNull(14) ? 0 : Convert.ToDouble((long)dataRecordReader[14]) / 10; record.MaxHandleForce = dataRecordReader.IsDBNull(15) ? 0 : Convert.ToDouble((long)dataRecordReader[15]) / 10; record.SlipAngle = dataRecordReader.IsDBNull(16) ? 0 : (int)(long)dataRecordReader[16]; record.WashAngle = dataRecordReader.IsDBNull(17) ? 0 : (int)(long)dataRecordReader[17]; record.WorkPerStroke = dataRecordReader.IsDBNull(18) ? 0 : Convert.ToDouble((long)dataRecordReader[18]) / 10; interval.DataRecords.Add(record); } SelectedSession.Intervals.Add(interval); } reader.Close(); } Activity activity = new Activity() { Id = SelectedSession.StartTime, Sport = Sport.Other }; activity.Creator = new Device() { Name = "SpeedCoach GPS" }; foreach (Interval interval in SelectedSession.Intervals) { ActivityLap lap = interval.ToLap(); // TODO: Cadence/Stroke Rate (type conversion) double maxSpeed = 0; byte maxHeartRate = 0; foreach (DataRecord record in interval.DataRecords) { Trackpoint trackpoint = record.ToTrackpoint(lap.StartTime); if (trackpoint.HeartRateBpm.Value > maxHeartRate) { maxHeartRate = trackpoint.HeartRateBpm.Value; } switch (SelectedSession.SpeedInput) { case SpeedInput.Gps: if (record.SpeedGps > maxSpeed) { maxSpeed = record.SpeedGps; } break; case SpeedInput.Impeller: if (record.SpeedImpeller > maxSpeed) { maxSpeed = record.SpeedImpeller; } break; } lap.Track.Add(trackpoint); } lap.MaximumSpeed = maxSpeed; lap.MaximumHeartRateBpm = new HeartRateInBeatsPerMinute() { Value = maxHeartRate }; activity.Lap.Add(lap); } TrainingCenterDatabase tcd = new TrainingCenterDatabase(); tcd.Activities.Activity.Add(activity); using (XmlWriter writer = XmlWriter.Create(OutputFilePath)) { (new XmlSerializer(typeof(TrainingCenterDatabase))).Serialize(writer, tcd); } } }
public IActionResult OnPost() { if (TcxFile == null || Distance == null) { return(new BadRequestResult()); } var stream = TcxFile.OpenReadStream(); var xmlString = RemoveUnsupportedTypes(stream); TrainingCenterDatabase db = null; db = Deserialize(xmlString); var trackpoints = new List <Trackpoint>(); foreach (var lap in db.Activities.Activity.Lap) { trackpoints.AddRange(lap.Track.Trackpoint); } var baseDistance = decimal.Parse(trackpoints[trackpoints.Count - 1].DistanceMeters, System.Globalization.NumberStyles.AllowDecimalPoint); var coef = Distance.Value / baseDistance; foreach (var point in trackpoints) { point.DistanceMeters = (decimal.Parse(point.DistanceMeters, System.Globalization.NumberStyles.AllowDecimalPoint) * coef).ToString(); point.Extensions.TPX.Speed = (decimal.Parse(point.Extensions.TPX.Speed, System.Globalization.NumberStyles.AllowDecimalPoint) * coef).ToString(); } var newLaps = new List <Lap>(); int thousandIndex = 1; do { var lapPoints = trackpoints.TakeWhile(x => decimal.Parse(x.DistanceMeters, System.Globalization.NumberStyles.AllowDecimalPoint) < thousandIndex * 1000).ToList(); var lap = ConfigureLap(db, lapPoints, false); newLaps.Add(lap); thousandIndex++; trackpoints = trackpoints.Skip(lapPoints.Count).ToList(); }while (thousandIndex <= (int)(Distance.Value / 1000)); var lastPoints = trackpoints; var lastLap = ConfigureLap(db, lastPoints, true); newLaps.Add(lastLap); db.Activities.Activity.Lap = newLaps; db.Xsi = null; XmlSerializer serializer = new XmlSerializer(typeof(TrainingCenterDatabase)); var resultStream = new MemoryStream(); serializer.Serialize(resultStream, db); resultStream.Position = 0; var resultXmlString = ReturnUnsupportedTypes(resultStream); byte[] bytes = Encoding.Default.GetBytes(resultXmlString); string file_type = "application/octet-stream"; string file_name = TcxFile.FileName.Insert(TcxFile.FileName.IndexOf(".tcx"), "_converted"); return(File(bytes, file_type, file_name)); }
public TrainingCenterDatabase BuildFile() { var activityDate = ActivityDate; var activityDuration = ActivityDuration; var calories = Calories; var maxHR = MaxHR; var averageHR = AverageHR; var duration = TimeSpan.ParseExact(activityDuration, @"mm\:ss", CultureInfo.CurrentCulture, TimeSpanStyles.AssumeNegative); var date = DateTime.ParseExact(activityDate, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); var minHR = (2 * averageHR) - maxHR; var durationInSeconds = duration.TotalSeconds * -1; TrainingCenterDatabase trainingCenterDatabase = new TrainingCenterDatabase(); ActivityList_t activityList = new ActivityList_t(); Activity_t activity = new Activity_t(); activity.Sport = Sport_t.Other; activity.Id = date; ActivityLap_t lap = new ActivityLap_t(); HeartRateInBeatsPerMinute_t averageHeartRate = new HeartRateInBeatsPerMinute_t(); averageHeartRate.Value = (byte)averageHR; lap.AverageHeartRateBpm = averageHeartRate; HeartRateInBeatsPerMinute_t maxHeartRate = new HeartRateInBeatsPerMinute_t(); maxHeartRate.Value = (byte)maxHR; lap.MaximumHeartRateBpm = maxHeartRate; lap.Calories = (ushort)calories; lap.TotalTimeSeconds = durationInSeconds; lap.Intensity = Intensity_t.Active; lap.TriggerMethod = TriggerMethod_t.Manual; Track_t track = new Track_t(); var trackPoints = new List <Trackpoint_t>(); Trackpoint_t trackPoint1 = new Trackpoint_t(); trackPoint1.Time = date; HeartRateInBeatsPerMinute_t heartRate1 = new HeartRateInBeatsPerMinute_t(); heartRate1.Value = (byte)minHR; trackPoint1.HeartRateBpm = heartRate1; trackPoints.Add(trackPoint1); Trackpoint_t trackPoint2 = new Trackpoint_t(); trackPoint2.Time = date.AddSeconds(durationInSeconds / 4); HeartRateInBeatsPerMinute_t heartRate2 = new HeartRateInBeatsPerMinute_t(); heartRate2.Value = (byte)averageHR; trackPoint2.HeartRateBpm = heartRate2; trackPoints.Add(trackPoint2); Trackpoint_t trackPoint3 = new Trackpoint_t(); trackPoint3.Time = date.AddSeconds(2 * (durationInSeconds / 4)); HeartRateInBeatsPerMinute_t heartRate3 = new HeartRateInBeatsPerMinute_t(); heartRate3.Value = (byte)averageHR; trackPoint3.HeartRateBpm = heartRate3; trackPoints.Add(trackPoint3); Trackpoint_t trackPoint4 = new Trackpoint_t(); trackPoint4.Time = date.AddSeconds(3 * (durationInSeconds / 4)); HeartRateInBeatsPerMinute_t heartRate4 = new HeartRateInBeatsPerMinute_t(); heartRate4.Value = (byte)averageHR; trackPoint4.HeartRateBpm = heartRate4; trackPoints.Add(trackPoint4); Trackpoint_t trackPoint5 = new Trackpoint_t(); trackPoint5.Time = date.AddSeconds(durationInSeconds); HeartRateInBeatsPerMinute_t heartRate5 = new HeartRateInBeatsPerMinute_t(); heartRate5.Value = (byte)maxHR; trackPoint5.HeartRateBpm = heartRate5; trackPoints.Add(trackPoint5); track.Trackpoint = trackPoints; var tracks = new List <Track_t>(); tracks.Add(track); lap.Track = tracks; var laps = new List <ActivityLap_t>(); laps.Add(lap); activity.Lap = laps; var activities = new List <Activity_t>(); activities.Add(activity); activityList.Activity = activities; trainingCenterDatabase.Activities = activityList; return(trainingCenterDatabase); }
/// <summary> /// <para>Process inputFiles into Excel 2013</para> /// </summary> /// <param name="inputFiles">List of inputFiles to process</param> /// <param name="excel2013Match">Export parameters to process</param> public static void ToExcel2013(List <FileInfo> inputFiles, Match excel2013Match) { System.Console.WriteLine("Starting GarminToExcel2013 Process ..."); /* validate export values */ var exportDirectoryPath = excel2013Match.Groups["excel2013ExportDirectory"].Value; var exportDirectory = new DirectoryInfo(exportDirectoryPath); if (!exportDirectory.Exists) { Console.WriteLine("Failed to Export to Excel 2013: Unable to find Directory \"" + exportDirectoryPath + "\""); Console.WriteLine(); GarminTo.Program.ShowUsageMessage(); } else { Console.WriteLine("Exporting to Excel 2013 ... "); var fileIndex = 0; foreach (var inputFile in inputFiles) { fileIndex++; Console.WriteLine("Processing " + fileIndex + " of " + inputFiles.Count + " file(s)"); /* read in training centre database from file provide as arg 0 */ var trainingCenterDatabase = TrainingCenterDatabase.ReadFromFile(inputFile.FullName); var rowIndex = 0; var activityIndex = 0; foreach (var activity in trainingCenterDatabase.Activities) { activityIndex++; Console.WriteLine(" Processing " + activity + " of " + trainingCenterDatabase.Activities.Count + " activities"); var excelWorkbokFilePath = exportDirectory.FullName + "\\" + activity.Id.Replace(":", "-") + ".xlsx"; // start Excel and get Application object. var excelApplication = new Microsoft.Office.Interop.Excel.Application { Visible = false, UserControl = false }; Microsoft.Office.Interop.Excel.Workbook excelWorkbook = excelApplication.Workbooks.Add(); try { /* get the relevant Workbook Sheet */ Microsoft.Office.Interop.Excel.Worksheet excelSheet = excelWorkbook.Worksheets.Add(); /* create data to be written to excel * http://www.clear-lines.com/blog/post/Write-data-to-an-Excel-worksheet-with-C-fast.aspx */ var data = new string[activity.RowCount + 1, 8]; data[rowIndex, 0] = "ID"; data[rowIndex, 1] = "Sport"; data[rowIndex, 2] = "Time"; data[rowIndex, 3] = "LatitudeDegrees"; data[rowIndex, 4] = "LongitudeDegrees"; data[rowIndex, 5] = "AltitudeMeters"; data[rowIndex, 6] = "DistanceMeters"; data[rowIndex, 7] = "HeartRateBpm"; rowIndex++; /* for each lap read all the trackpoints from that lap and create a data row */ System.Console.Write(" Processing " + activity.RowCount + " trackpoints: "); foreach (var lap in activity.Laps) { foreach (var trackpoint in lap.Track) { data[rowIndex, 0] = rowIndex.ToString(); data[rowIndex, 1] = activity.Sport; data[rowIndex, 2] = trackpoint.Time != null?trackpoint.Time.ToString() : ""; data[rowIndex, 3] = trackpoint.Position != null?trackpoint.Position.LatitudeDegrees.ToString() : ""; data[rowIndex, 4] = trackpoint.Position != null?trackpoint.Position.LongitudeDegrees.ToString() : ""; data[rowIndex, 5] = trackpoint.AltitudeMeters != null?trackpoint.AltitudeMeters.ToString() : ""; data[rowIndex, 6] = trackpoint.AltitudeMeters != null?trackpoint.AltitudeMeters.ToString() : ""; data[rowIndex, 7] = trackpoint.HeartRateBpm != null?trackpoint.HeartRateBpm.Value.ToString() : ""; rowIndex++; if (rowIndex % 500 == 0) { System.Console.Write(rowIndex + ".."); } } } /* write the data set as a range to the workbook */ var startCell = (Microsoft.Office.Interop.Excel.Range)excelSheet.Cells[1, 1]; var endCell = (Microsoft.Office.Interop.Excel.Range)excelSheet.Cells[rowIndex, 8]; var writeRange = excelSheet.Range[startCell, endCell]; writeRange.Value2 = data; /* save the excel work book */ excelWorkbook.SaveAs(excelWorkbokFilePath, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing, false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); System.Console.WriteLine(); } catch (Exception exception) { throw exception; } finally { excelWorkbook.Close(); excelApplication.Quit(); } } } Console.WriteLine("Completed Exporting to Excel 2013."); } Console.WriteLine(); }