             text-headers       (concat plot-base-headers
                                        (get-ext-plot-headers project-id))
             number-headers     (get-value-distribution-headers sample-value-group)
-            headers-out        (str/join "," (map #(-> % name csv-quotes) (concat text-headers number-headers)))
+            headers-out        (->> (concat text-headers number-headers)
+                                    (map #(-> % name csv-quotes))
+                                    (str/join ",")
+                                    (str "\uFEFF")) ; Prefix headers with a UTF-8 tag
             data-rows          (map (fn [row]
                                       (let [samples       (tc/jsonb->clj (:samples row))
                                             ext-plot-data (tc/jsonb->clj (:ext_plot_data row))]

                   "Content-Disposition" (str "attachment; filename="
                                              (prepare-file-name (:name project-info) "plot")
                                              ".csv")}
         :body (str/join "\n" (conj data-rows (str "\uFEFF" headers-out)))})
      (data-response "Project not found."))))

(defn- get-ext-sample-headers

                   "Content-Disposition" (str "attachment; filename="
                                              (prepare-file-name (:name project-info) "sample")
                                              ".csv")}
         :body (str/join "\n" (cons headers-out data-rows))})
      (data-response "Project not found."))))
