訂判斷及所需輸入
假設工作簿 A1 值 A,有 Discussed 註解原文及 A/B 清單驗證定義,範圍 A1。程序用 OpenPyxl3.1.5 在記憶體建 XLSX 再開,核值、原文、規則類型、算式及範圍。只出數值的 CSV 留 A,兩功能卻沒有。
| 情況 | 輸入 JSON |
|---|---|
| 原例測試 | {"format":"xlsx"} |
跑所附比較
這是真正生成再開的檔案核對。只限普通註解文字及已存驗證資料,不含討論串註解、格式保留或試算表程式執行限制;此測試不由 OpenPyxl 評估驗證。
| 路徑 | 輸出 JSON |
|---|---|
| 錯誤路徑 | {"value":"A","commentText":null,"validation":null} |
| 所需路徑 | {"value":"A","commentText":"Discussed","validation":{"type":"list","formula":"\"A,B\"","range":"A1"}} |
import assert from 'node:assert/strict';
import {spawnSync} from 'node:child_process';
const run=function run(i,corrected=true){
if(!['xlsx','csv'].includes(i.format))return {held:true};
const python=`import io,json,csv,sys
from openpyxl import Workbook,load_workbook
from openpyxl.comments import Comment
from openpyxl.worksheet.datavalidation import DataValidation
i=json.load(sys.stdin)
w=Workbook();s=w.active;s["A1"]="A";s["A1"].comment=Comment("Discussed","Reviewer")
v=DataValidation(type="list",formula1='"A,B"');s.add_data_validation(v);v.add(s["A1"])
if i["format"]=="xlsx":
b=io.BytesIO();w.save(b);b.seek(0);r=load_workbook(b).active;rule=r.data_validations.dataValidation[0]
out={"value":r["A1"].value,"commentText":r["A1"].comment.text,"validation":{"type":rule.type,"formula":rule.formula1,"range":str(rule.sqref)}}
else:
b=io.StringIO();csv.writer(b).writerow([s["A1"].value]);b.seek(0)
out={"value":next(csv.reader(b))[0],"commentText":None,"validation":None}
print(json.dumps(out))
`;
const result=spawnSync(process.env.PYTHON||'python',['-c',python],{input:JSON.stringify({format:corrected?i.format:'csv'}),encoding:'utf8',windowsHide:true});if(result.status!==0)throw new Error(result.stderr);return JSON.parse(result.stdout);
};
const cases=[{"input":{"format":"xlsx"},"corrected":false,"expected":{"value":"A","commentText":null,"validation":null}},{"input":{"format":"xlsx"},"corrected":true,"expected":{"value":"A","commentText":"Discussed","validation":{"type":"list","formula":"\"A,B\"","range":"A1"}}},{"input":{"format":"csv"},"corrected":true,"expected":{"value":"A","commentText":null,"validation":null}},{"input":{"format":null},"corrected":true,"expected":{"held":true}}];
for(const test of cases){const actual=await run(test.input,test.corrected);assert.deepEqual(actual,test.expected);console.log(actual);}
按邊界依據作判斷
明選 CSV 就列清只保數值的缺項,不聲稱全部功能已搬;格式未選便停。
- 列所需工作簿功能
- 生成並重開所選格式
- 核真正保留資料
儲存格值相同,未證明功能都保到。
| 條件 | 輸入 JSON | 預期輸出 JSON |
|---|---|---|
| 明選只有值的 CSV | {"format":"csv"} | {"value":"A","commentText":null,"validation":null} |
| 尚未選檔案格式 | {"format":null} | {"held":true} |
原例更正 XLSX 來回,保到哪些項目?
查看參考答案
A、Discussed 及清單規則,算式 "A,B"、範圍 A1。若要求實際限制輸入,接收程式仍須另試行為。