以下内容显然是 AI 生成的,但如果你把你的 AI 指向本贴,就能让你的健身应用与市面上的许多其他应用的导出文件兼容。

实际健身训练应用在 CSV 导出中包含的内容

I built an importer for my gym log app and had to figure out what every popular lifting app writes when you hit "Export". There is no single place that documents this, so here is everything I found: columns, date formats, units and the quirks that will bite you. The example rows are made up; the headers and formats are the apps'. Confidence is marked per app: real export means I parsed an actual file from the app, docs/samples means public sources, sample files or other open-source importers.

简要版本

  • 每行对应一组(几乎所有应用都如此)。只有 JEFIT(_id)和更新的 Strong(Workout #)有工作out编号。其他所有应用:按开始时间 + workout名称(Strong、Hevy、MassBuilder)、日期(FitNotes、MacroFactor)或时间戳(Fitbod)分组。
  • 单位** 通常出现在列名中(weight_kg、Weight(kg)、Weight (kg)),也可能在独立的列里(FitNotes Android、Liftosaur),或者根本没有(旧 Strong、JEFIT、Lyfta)。如果没有单位,请用户提供。
  • 时间** :Strong、Hevy 和 MassBuilder 记录本地时间且不包含时区。Fitbod 和 Liftosaur 使用 UTC。JEFIT 使用 Unix 秒,StrengthLog 使用 Unix 毫秒。FitNotes 和 MacroFactor 只有日期。
  • delimiters** :大多数使用逗号。更新的 Strong 和 GymRun 使用分号,JEFIT 同一文件内包含两个 CSV 部分。请通过表头行检测分隔符。
  • 表头即可区分各应用**:exercise_title + set_index(Hevy),Exercise Name + Set Order(Strong),isWarmup(Fitbod),Is Warmup Set?(Liftosaur),Exercise Base Weight (kg)(MacroFactor),Set Duration (sec)(Gravl),Kind(FitNotes iOS),### WORKOUT SESSIONS ###(JEFIT),specialset + extraWeight(StrengthLog),Para6(GymRun),exercise_id + target_reps(MassBuilder)。
  • 零值** :Strong 将未使用的 Distance 和 Seconds 写为 0,且多个应用在体重组中使用重量 0。请不要将这些转换为 0 kg 举重。

各应用

Strong(真实导出,变体 A)

设置 → 导出 Strong 数据。存在三种变体:

A: Date,Workout Name,Duration,Exercise Name,Set Order,Weight,Reps,Distance,Seconds,Notes,Workout Notes,RPE
2026-10-05 17:30:00,Evening Workout,52m,Squat (Barbell),1,100.0,5,0,0,,,

B: "Workout #";"Date";"Workout Name";"Duration (sec)";"Exercise Name";"Set Order";"Weight (kg)";"Reps";"RPE";"Distance (meters)";"Seconds";"Notes";"Workout Notes"

C: A's columns, but with Workout Duration (seconds) last and no Duration

  • A 无单位。B 包含 Weight (kg) 或 Weight (lbs),所有字段均已引号包裹,并可使用逗号小数点(102,5)。Set Order 在我看到的文件中是纯数字;其他导入器报告 W、D、F 表示热身、下降和失败集,以及非集行("Rest Timer", "Note")。请兼容两种写法。
  • 许多应用(包括 Hevy)导入 Strong 格式,因此它是最接近的交换格式。

Hevy(真实导出,两个文件)

个人资料 → 设置 → 导出与导入数据 → 导出训练。

" "title","start_time","end_time","description","exercise_title","superset_id","exercise_notes","set_index","set_type","weight_kg","reps","distance_km","duration_seconds","rpe"
"Push","5 Oct 2026, 17:30","5 Oct 2026, 18:22","","Bench Press (Barbell)",,"",0,"warmup",40,8,,,"

  • Imperial 账户会改用 weight_lbs 和 distance_miles。
  • 日期为 d MMM yyyy, HH:mm 的本地时间格式,月份名称会随应用语言(如法语的 3 févr. 2026, 18:00)。请使用正确的区域设置,否则非英文文件将无法解析。
  • set_index 从每个运动开始计数 0。set_type 可以是 normal、warmup、dropset 或 failure。空的 superset_id 表示没有超集;相同的数字表示同一超集。

Fitbod(真实导出)

日志 → 装备 → 导出训练数据 → WorkoutExport.csv。

Date,Exercise,Reps,Weight(kg),Duration(s),Distance(m),Incline,Resistance,isWarmup,Note,multiplier
2026-10-05 17:30:00 +0000,Dumbbell Row, 8,20.0,0.0,0.0,0.0,0.0,false,, 2.0

  • 每个训练的所有集都有相同的时间戳(即整个训练的时间),因此无法得到单独的集时间或训练时长。请按时间戳分组。
  • Reps 和 multiplier 前面有空格。在解析数字前请去除空格。
  • multiplier 为哑铃及单侧动作设为 2.0,哑铃弓步设为 4.0,杠铃及体重设为 1.0,计时或有氧行设为 0.0。它似乎是 Fitbod 的体积倍数;重量是每个哑铃的重量,请按原样读取。
  • 卡路里和保持(跑步、平板支撑)的 Reps 为 0,并使用 Duration(s) 和 Distance(m) 替代。
  • 没有训练名称和训练 ID。旧版文件缺少 multiplier。
  • Fitbod 包含许多其他应用没有的运动名称(如 Prone Y's、Mini Loop Band Squat、如 Romanian Deadlift to Bent-Over Row 的组合),因此需要规划手动匹配。

Lyfta(真实导出)

Title,Date,Duration,Exercise,"Superset id",Weight,Reps,Distance,Time,"Set Type"
"Leg day","2026-10-13 18:02:10",01:12:30,"Lever Seated Leg Press",,40.000,10,,,NORMAL_SET

  • 表头以空格开头。请去除空格,否则无法匹配。
  • 文件中的非 ASCII 字符使用八进制转义(如 \\344 表示 ä)。请对其进行解码。
  • Duration 为训练时长(hh:mm:ss),Time 为集的时间。文件中没有单位。
  • 运动名称来源于 ExerciseDB(“Lever” 表示机器:Lever Seated Hip Abduction、Lever Seated Fly)。

StrengthLog(真实导出)

workout,start,end,exercise,specialset,weight,bodyweight,extraWeight,reps,warmup,max,fail,checked,setComment,workoutComment,form,sleep,calories,stress
Full Body: Workout 1,1791214200000,1791217320000,Squat,,60,,,8,true,false,false,1791214260000,,,,,,

  • start、end 以及 checked(在集被勾选时)均为 Unix 毫秒。
  • 体重动作的次数保存在 reps,负荷保存在 bodyweight 和 extraWeight。
  • warmup、max 和 fail 均为 true 或 false。

Liftosaur(来自应用自身的导出代码)

个人 → Import/Export → 导出历史记录至 CSV。共 25 列:

Workout DateTime,Program,Day Name,Exercise,Is Warmup Set?,Required Reps,Completed Reps,Is AMRAP?,Required RPE,Completed RPE,Log RPE?,Required Weight Value,Required Weight Unit,Completed Weight Value,Completed Weight Unit,Ask Weight?,Completed Reps Time,Target Muscles,Synergist Muscles,Notes,Completed Reps Left,Required Set Time Seconds,Is Overflow Set Time?,Completed Set Time Seconds,Completed Set Time Left Seconds

  • ISO 8601 格式的 UTC 时间(2026-03-01T10:00:00.000Z),标志位为 0/1,每行有单位(kg/lb)。请使用 Completed * 列。

FitNotes(文档/样本,另一开源导出器验证)

iOS (FitNotes 2): Date,Exercise,Category,Weight (kg),Weight (lbs),Reps,Distance,Distance Unit,Time,Notes,Kind
Android: Date,