UP | HOME

▼ 本文更新于 [2026-06-22 周一 16:24]

emacs-将org-table导出到buffer


org-mode 的 table 相当好用,究其根本,他可以被无缝引用到 elisp 代码块中,作为一个存储数据的变量。

然而,有的时候我们想将 org-table 与第三方表格软件协作。默认的 org-table-export 函数会将光标所在的 org-table 导出为一个文件,稍后就用 Excel/WPS 等软件打开。不过,我们可以采取更简单的办法转移数据。

(defun my/org-table-export-to-buffer (format)
  "将当前 Org 表格按指定 FORMAT 导出到 buffer。
FORMAT 可以是 \"tsv\", \"csv\", \"orgtbl-to-html\" 等。
如果导出 buffer 已经显示在某个窗口中,则重用该窗口更新内容,否则创建新窗口。"
  (interactive
   (list (read-string (format "导出格式 (默认 %s): "
                              org-table-export-default-format)
                      nil nil org-table-export-default-format)))
  (unless (org-table-p) (user-error "光标不在 Org 表格内"))
  (let* ((table (org-table-to-lisp))
         (func-symbol (intern (if (string-prefix-p "orgtbl-to-" format)
                                  format
                                (concat "orgtbl-to-" format))))
         (func (symbol-function func-symbol))
         (result (funcall func table '(:raw t)))
         (buf-name "*Org Table Export*")
         (buf (get-buffer-create buf-name))
         (win (get-buffer-window buf)))    ; 检查是否已有窗口显示该 buffer
    ;; 更新 buffer 内容(允许临时修改只读 buffer)
    (with-current-buffer buf
      (let ((inhibit-read-only t))
        (erase-buffer)
        (insert result)
        (goto-char (point-min))
        (set-buffer-modified-p nil)
        (read-only-mode 1)))              ; 重新设为只读
    ;; 显示 buffer:优先重用已有窗口,否则新建
    (if win
        (progn
          (select-window win)             ; 切换到已有窗口
          (message "已更新表格导出内容"))
      (switch-to-buffer-other-window buf)
      (message "表格已导出到 buffer: %s" buf-name))))

上面的函数可以将光标所在的表格导出到 buffer ,默认是 tsv 格式,也就是用制表符分割列、换行符分割行。这样一来,就可以直接把里面的内容复制,并在表格软件里粘贴了。

如果需要导出为 csv 格式,也可以在运行后的提示框中手动输入。

© Published by Emacs 31.0.90 (Org mode 10.0-pre) | RSS Comment