import React, { useState, useEffect } from "react"; import { useNavigate, useLocation } from "react-router-dom"; import ProgressPanel from "../components/ProgressPanel"; export default function Generate() { const navigate = useNavigate(); const location = useLocation(); const preselectedId = location.state?.templateId; const [templates, setTemplates] = useState([]); const [selectedId, setSelectedId] = useState(preselectedId || ""); const [dataSource, setDataSource] = useState("file"); const [dataFilePath, setDataFilePath] = useState(""); const [manualRows, setManualRows] = useState([{}]); const [outputDir, setOutputDir] = useState(""); const [filenamePattern, setFilenamePattern] = useState("输出_{{编号}}.xlsx"); const [generating, setGenerating] = useState(false); const [results, setResults] = useState(null); useEffect(() => { window.api.listTemplates().then(setTemplates); }, []); const selectedTemplate = templates.find((t) => t.id === selectedId); const fields = selectedTemplate?.fields || []; async function handleSelectDataFile() { const path = await window.api.selectFile([ { name: "Excel 文件", extensions: ["xlsx"] }, ]); if (path) setDataFilePath(path); } async function handleSelectOutputDir() { const dir = await window.api.selectDirectory(); if (dir) setOutputDir(dir); } function updateManualRow(rowIdx, fieldName, value) { setManualRows((prev) => { const next = [...prev]; next[rowIdx] = { ...next[rowIdx], [fieldName]: value }; return next; }); } function addManualRow() { setManualRows((prev) => [...prev, {}]); } function removeManualRow(idx) { setManualRows((prev) => prev.filter((_, i) => i !== idx)); } async function handleGenerate() { if (!selectedId) return alert("请选择模板"); if (!outputDir) return alert("请选择输出目录"); setGenerating(true); setResults(null); try { const result = await window.api.generate({ template_path: selectedTemplate.file_path, fields: fields, rows: dataSource === "manual" ? manualRows : null, data_file_path: dataSource === "file" ? dataFilePath : null, output_dir: outputDir, filename_pattern: filenamePattern, }); setResults(result.results); } finally { setGenerating(false); } } return (
| {f.name} | ))}|
|---|---|
| updateManualRow(idx, f.name, e.target.value)} className="w-full px-1 py-0.5 text-sm outline-none" /> | ))}
支持使用 {"{{字段名}}"} 作为变量