gaoluyang
4 天以前 faa6b99d56c690bdb7974dddd95aab25b8645ef5
fix(财务): 科目明细账导出改为真实 CSV 下载

导出按钮原来只弹成功提示,现按当前科目与期间把明细账数据导出为带 BOM 的 CSV(Excel 打开不乱码)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
已修改1个文件
30 ■■■■■ 文件已修改
src/views/financialManagement/voucher/detailLedger.vue 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/financialManagement/voucher/detailLedger.vue
@@ -76,6 +76,7 @@
<script setup>
import { ref, reactive, onMounted, computed, watch, nextTick } from "vue";
import { ElMessage } from "element-plus";
import { saveAs } from "file-saver";
import { listAccountSubject } from "@/api/financialManagement/accountSubject";
import { getDetailLedger } from "@/api/financialManagement/ledger";
@@ -236,7 +237,36 @@
  ElMessage.info("打印功能");
};
const csvCell = (value) => {
  const text = value === undefined || value === null ? "" : String(value);
  return `"${text.replace(/"/g, '""').replace(/\r?\n/g, " ")}"`;
};
const handleOut = () => {
  if (!currentSubject.value) {
    ElMessage.warning("请先选择会计科目");
    return;
  }
  if (dataList.value.length === 0) {
    ElMessage.warning("当前没有可导出的数据");
    return;
  }
  const header = ["日期", "凭证字号", "摘要", "借方", "贷方", "方向", "余额"];
  const rows = dataList.value.map((row) => [
    row.date || "",
    row.voucherNo || "",
    row.summary || "",
    Number(row.debit || 0).toFixed(2),
    Number(row.credit || 0).toFixed(2),
    row.direction || "",
    Math.abs(Number(row.balance || 0)).toFixed(2),
  ]);
  const content = [header, ...rows].map((line) => line.map(csvCell).join(",")).join("\r\n");
  // 带 BOM,避免 Excel 打开中文乱码
  const blob = new Blob(["\ufeff" + content], { type: "text/csv;charset=utf-8;" });
  const period = [filters.startMonth, filters.endMonth].filter(Boolean).join("_");
  const name = `明细账_${currentSubject.value.code}_${currentSubject.value.name}${period ? `_${period}` : ""}.csv`;
  saveAs(blob, name);
  ElMessage.success("导出成功");
};