{"text_format":"2","workbook":"xlsx","n_sheets":7,"sheets":["目录","1-网页端发送指令及回复","2-服务端发送","3-配置文件结构","4-模拟操作指令","5-表达式与映射表","Win 虚拟按键对照表"],"not_rendered":{"charts":0,"images":0,"macros":0,"external_links":0,"defined_names":0,"comments":0,"pivot_tables":0},"unopened":[],"bounds":{"document_bytes":16777216,"sheet_cells":100000,"run_cost":"one","rows_first":2000,"rows_last":500,"rows_between":2000,"halvings":0,"cell_chars":16384,"cell_head_chars":4096},"cells_cut":0,"cells_raw":0,"read":"whole","date_system":"1900"}

{"sheet":"目录","index":0,"n_rows":18,"n_cols":3,"rows_kept":18,"cut":false,"hidden":false,"merged":[]}
[]
[null,"序号","说明"]
[null,1,"创建"]
[null,2,"增加配置文件文件结构设计"]
[null,3,"增加模拟操作协议、表达式与映射表"]
[null,4,"优化操作指令"]
[null,5,"新增操作指令/工作流程设计/PDF转换查询相关"]
[null,6,"新增文件监听传输&COM代理"]
[null,7,"新增电脑硬件设备编码信息获取，用于授权相关"]
[null,8,"报告文件查询与获取；DCM相关查询与配置；"]
[null,9,"多份报告文件获取"]
[null,10,"协议整理"]
[null,11,"PDF文字提取包含直接提取到的内容反馈"]
[null,12,"DCM相关"]
[null,13,"调整"]
[null,14,"增加报告查询相关内容"]
[null,15,"增加PDF文件监听目录"]
[null,16,"增加token更新"]

{"sheet":"1-网页端发送指令及回复","index":1,"n_rows":27,"n_cols":7,"rows_kept":27,"cut":false,"hidden":false,"merged":[[1,1,1,6]]}
[]
[null,"WEBSOCKET服务，服务端口9083（ws://127.0.0.1:9083）"]
[]
[]
[null,"序号","名称","发送消息格式","回复数据格式","说明","涉及版本"]
[null,1.1,"授权配置信息获取","{\n    id:'xxx',\n    command:'authQuery'\n}","{\n    id:'yyy', \n    command:'authQueryFeedback',\n    commandId:'xxx',\n    data:{\n        state:0,\n        message:'',\n        deviceId:'xxxxxxxxxx',\n        ip:'192.168.0.100',        \n        pcInfo:{\n            cpu:'',\n            motherBoard:'',\n            hardDisk:'',\n            mac:''\n        },\n        licenseState:1\n    }\n}","获取当前的配置信息，主要包括\n1）deviceId 设备Id\n2）ip 当前电脑IP地址\n3）hotKey 热键\n4）电脑设备Id，包括CPU编码/主板编码/硬盘编码/MAC地址等","v1.4.4"]
[null,1.2,"授权设置","{\n    id:'xxx',\n    command:'authSet',\n    data:'KEY-DATA'\n}","{\n    id:'yyy', \n    command:'licenseSetFeedback',\n    commandId:'xxx',\n    data:{\n        state:0,\n        message:''\n    }\n}","授权信息设置，返回是否成功信息","v1.4.4"]
[null,2.1,"常规检查参数查询","{\n    id:'xxx',\n    command:'cgConfigQuery'\n}","{\n    id:'yyy', \n    command:'cgConfigQueryFeedback',\n    commandId:'xxx',\n    data:{\n        state:0,\n        message:''，\n        comPorts:['com1','com2',...], // 串口名称列表\n        portName:'COM1', // 串口名称\n        baudRate:9600, // 波特率\n        parity:0, // 校验位\n        dataBits:8, // 数据位\n        stopBits:0, // 停止位\n        ftpHostName:'',  // ftp主机名\n        ftpUserName:'',  // ftp用户名\n        ftpPassWord:'',   // ftp密码\n        inspectionDir:\"c:\\hm\\inspection\", //常规检查监视目录\n        comStatus:''  // 目前设定串口当下的工作状态信息，文字方式\n    }\n}",null,"v1.4.4\nv1.4.6"]
[null,2.2,"常规检查参数配置","{\n    id:'xxx',\n    command:'cgConfigSet',\n    data:{\n        inspectionDir:\"c:\\hm\\inspection\",\n        ftpHostName:'',  // ftp主机名\n        ftpUserName:'',  // ftp用户名\n        ftpPassWord:'',  // ftp密码\n        portName:'COM1', // 串口名称\n        baudRate:9600,  // 波特率\n        parity:0, // 校验位\n        dataBits:8, // 数据位\n        stopBits:0, // 停止位\n        wait:2000,\n        maxTimeLength:50000\n    }\n}","{\n    id:'yyy', \n    command:'cgConfigSetFeedback',\n    commandId:'xxx',\n    data:{\n        state:0,\n        message:''\n    }\n}","1）inspectionDir 常规检查监视目录，允许配置多个，用“,”(英文逗号)分隔\n2）wait：数据等待时长，毫秒\n3）maxTimeLength:最大处理时长，默认5s","v1.4.4"]
[null,3.1,"特检参数查询","{\n    id:'xxx',\n    command:'tjConfigQuery'\n}","{\n    id:'yyy', \n    command:'tjCconfigQueryFeedback',\n    commandId:'xxx',\n    data:{\n        state:0,\n        message:''，\n        titleText:'HM',\n        hotKey:'F4',\n        deviceId:'xxxxxxxxxx',\n        ip:'192.168.0.100',\n        pluginName:'AAAAAA',\n        url:'http://xxx.xxx.xxx.xxx:xxx/xxx/',  // v.1.6.0\n        postUrl:'http://xxx.xxx.xxx.xxx/xxx',\n        queryUrlDCM:'http://a.b.c.d:xxxx/queryXX',\n        postUrlDCM:'http://a.b.c.d:xxxx/postXX',\n        dcmPluginId:'xxx',\n        imageDir:'#dir-image',\n        dbDir:'#dir-db',\n        pdfDir:'#dir'\n    }\n}","获取当前的配置信息，主要包括\n1）deviceId 设备Id\n2）ip 当前电脑IP地址\n3）pluginName 配置的组件名称\n4）postUrl 报告文件上传URL接口地址\n5）licenseState 授权状态（0-未授权；1-已授权）\n6）titleText 窗体名称关键字\n7）hotKey 热键\n8）电脑设备Id，包括CPU编码/主板编码/硬盘编码/MAC地址等\n9)DCM相关配置：查询患者信息&提交图像相关接口；dcmPluginId为当前配置的DCM处理插件的Id；dirDCM-文件监控目录，多个用英文逗号分隔(v1.5.0删除)\n10) 移除原设定的最终交互地址，改成项目地址（v1.6.0）\n11)增加图片目录信息（v1.6.2）\n12）v1.6.3 增加PDF文件目录","v1.5.0\nv1.6.0\nv1.6.2\nv1.6.3"]
[null,3.2,"特检参数配置","{\n    id:'xxx',\n    command:'tjConfigSet',\n    data:{\n        titleText:'HM',\n        hotKey:'F4',\n        deviceId:'xxxxxxxxxx',\n        pluginName:'AAAAAA',\n        pluginContent:'BASE64*********',\n        postUrl:'http://xxx.xxx.xxx.xxx/xxx',\n        queryUrlDCM:'http://a.b.c.d:xxxx/queryXX',\n        postUrlDCM:'http://a.b.c.d:xxxx/postXX',\n        url:'http://xxx.xxx.xxx.xxx:xxx/xxx/',  // v.1.6.0\n        examType:'#examination type',\n        imageDir:'#dir-image',\n        dbDir:'#dir-db',\n        dcmPluginId:'xxx',\n        dcmPluginName:'xxx',\n        dcmPluginData:'dll-base64',\n        pdfDir:'#dir'\n    }\n}","{\n    id:'yyy', \n    command:'tjConfigSetFeedback',\n    commandId:'xxx',\n    data:{\n        state:0,\n        message:''\n    }\n}","配置\n  >> titleText：根据titleText配置的内容找进程，找到后激活\n  >> hotKey：全局热键配置\n  >> dcmPluginId：DCM处理插件Id\n  >> dcmPluginName:DCM处理插件名称\n  >> dcmPluginData:dll文件base64编码后数据\n  >> examType:检查类型，OP/OPT/..\n返回配置是否成功信息\n\n\nv1.6.0 移除原设定的最终交互地址，改成项目地址\nv1.6.2 增加图片目录设置；移除检查类型配置；改由查询接口完成\nv1.6.3 增加pdfDir，用于客户端程序监听新导出的PDF文件，多个目录用,分割","v1.5.0\nv1.6.0\nv1.6.2\nv1.6.3"]
[null,4.1,"数据录入","{\n    id:'xxx',\n    command:'input',\n    data:{\n        id:'业务Id',\n        uid:'用户Id',\n        pid:'患者Id',\n        firstName:'',\n        lastName:'',\n        sex:0,\n        birthday:'2010-01-01',\n        projectCode:'11111',\n        projectName:'xxx检查',\n        orgcode:'#orgcode',\n        deptcode:'#deptcode',\n        token:'#token'\n    }\n}","{\n    id:'yyy', \n    command:'inputFeedback',\n    commandId:'xxx',\n    data:{\n        state:0,\n        message:''\n    }\n}","xxx/yyy为uuid随机值，标记指令Id\nsex：0-女；1-男；其他值自动按1处理;\nbirthday:生日，数据格式yyyy-MM-dd\n\n返回的数据中id非必须；state为0，表示顺利接收指令；非0表示有异常，message为异常说明；","v1.0.0"]
[null,4.2,"信息查询","{\n    id:'xxx',\n    command:'search',\n    data:{\n        id:'业务Id',\n        uid:'用户Id',\n        pid:'患者Id',\n        firstName:'',\n        lastName:'',\n        sex:0,\n        birthday:'2010-01-01',\n        projectCode:'11111',\n        projectName:'xxx检查'\n    }\n}","{\n    id:'yyy', \n    command:'searchFeedback',\n    commandId:'xxx',\n    data:{\n        state:0,\n        message:''\n    }\n}","发起一键自动查询","v1.3.0"]
[null,5.1,"PDF打印文件信息","{\n    id:'xxx',\n    command:'filesQuery',\n    data:{\n        beginDay:'2024-07-05',\n        endDay:'2024-07-05'\n    }\n}","{\n    id:'yyy', \n    command:'filesQueryFeedback',\n    commandId:'xxx',\n    data:{\n        state:0,\n        message:'',\n        detail:[{\n            id:'文件id',\n            name:'文件名',\n            createTime:'创建时间',\n            url:'http://127.0.0.1:xxx/report/xxxxxx.pdf'\n        }]\n    }\n}",">data为检索条件\n  >> beginDay与endDay若需要检索的话必须都有值\n，否则默认当天\n  >> 会自动忽略已上传的文件信息\n  >> name调整为全路径","v1.3.0\nv1.4.2"]
[null,5.2,"pdf报告文件上传","{\n    id:'xxx',\n    command:'sendPdf',\n    data:{\n        fileId:'',\n        token:'',\n        examNo:'',\n        orgCode:'',\n        deptCode:''\n    }\n}","{\n    id:'yyy', \n    command:'sendPdfFeedback',\n    commandId:'xxx',\n    data:{\n        state:0,\n        message:''\n    }\n}",null,"v1.4.2"]
[null,5.3,"pdf报告文件上传-多份","{\n    id:'xxx',\n    command:'sendPdfs',\n    data:{\n        fileId:['','',''],\n        token:'',\n        examNo:'',\n        orgCode:'',\n        deptCode:''\n    }\n}","{\n    id:'yyy', \n    command:'sendPdfsFeedback',\n    commandId:'xxx',\n    data:{\n        state:0,\n        message:''\n    }\n}","多份PDF上传","1.4.3"]
[null,5.4,"PDF-OCR识别","{\n    id:'xxx',\n    command:'pdfOcr',\n    data:{\n        fileId:'文件Id',\n        contentMode:0,\n        pageMode:0\n    }\n}","{\n    id:'yyy', \n    command:'pdfOcrFeedback',\n    commandId:'xxx',\n    data:{\n        state:0,\n        message:'',\n        fileId:'',\n        content:'',   // OCR识别结果\n        text:'',       // PDF文字提取结果\n        images:['xxx','xxx']    // base64\n    }\n}","获取指定PDF文件的OCR结果\nfileId:指定PDF-ID\ncontentMode:0-PDF文字提取；\n            1-OCR识别；\n            2-PDF文字提取+OCR识别；\n            3-PDF文字提取（保持空格）+OCR识别（带位置信息）；\npageMode：0-仅第一页,，默认0\n          1-全部页面\n","v1.4.3\nv1.4.5"]
[null,6.1,"DCM文件信息（不再使用）","{\n    id:'xxx',\n    command:'dcmQuery',\n    data:{\n        pid:'#pid',\n        beginDay:'2024-07-05',\n        endDay:'2024-07-05'\n    }\n}","{\n    id:'yyy', \n    command:'dcmQueryFeedback',\n    commandId:'xxx',\n    data:{\n        state:0,\n        message:'',\n        detail:[{\n            pid:'文件id',\n            eid:'检查Id',\n            examTime:'检查时间',\n            dcm:[\n                'http://xxxx:xx/xxx/xxx.dcm'\n            ]\n        }]\n    }\n}",">data为检索条件\n  >> pid 患者Id，可以不提供\n  >> beginDay与endDay若需要检索的话必须都有值\n，否则默认当天","v1.5.0"]
[null,6.2,"DCM文件信息检索","{\n    id:'xxx',\n    command:'dcmQuery',\n    data:{\n        pid:'患者id',\n        day:'2024-07-05'\n    }\n}","{\n    id:'yyy', \n    command:'dcmQueryFeedback',\n    commandId:'xxx',\n    data:{\n        state:0,\n        message:'',\n        detail:[{\n            pidInner:'内部患者编号',\n            eidInner:'检查Id（内部）',\n            pid:'患者id',\n            eid:'检查Id',\n            examTime:'检查时间',\n            srcFile:'',\n            dcm:[\n                'http://xxxx:xx/xxx/xxx.dcm'\n            ]\n        }]\n    }\n}","data为检索条件\n  >> pid 患者Id，可以不提供\n  >> day：日期，不填写默认当天\n\n>> 返回值\n  srcFile：被转换的源文件路径信息","v1.6.0"]
[null,6.2,"DCM手工扫描（不再使用）","{\n    id:'xxx',\n    command:'dcmScan',\n    data:{\n        beginDay:'2024-07-05',\n        endDay:'2024-07-05'\n    }\n}","{\n    id:'yyy', \n    command:'dcmScanFeedback',\n    commandId:'xxx',\n    data:{\n        state:0,\n        message:''\n    }\n}",">data为检索条件\n  >> beginDay与endDay都不录入的话默认当天","v1.5.0"]
[null,6.3,"DCM文件提交","{\n    id:'xxx',\n    command:'sendDCM',\n    data:{\n        pidInner:'#pid',\n        eidInner:'#eid',\n        pid:'#pid',\n        eid:'#eid',\n        patientName:'#name',\n        patientBirthday: '#birthday',\n        patientSex: '1',\n        patientAge: '25',\n        modality:'OP',\n        srcFile:'原始文件路径'\n    }\n}","{\n    id:'yyy', \n    command:'sendDCMFeedback',\n    commandId:'xxx',\n    data:{\n        state:0,\n        message:''\n    }\n}",">data为设置条件\n  >> pid:调整后患者编号\n  >> eid:调整后检查编号\n由于DCM文件较多，会进行压缩操作之后提交，提交zip文件","v1.5.0\nv1.6.0"]
[null,null,"DCM脚本创建","{\n    id:'xxx',\n    command:'MakeDcmXML',\n    data:{\n        patientNo:'#no',\n        examTime:'#yyyy-MM-dd HH:mm:ss',\n        laterality:'#laterality', \n        instanceNumber:'#instanceNumber',\n        filePath:'#path' \n    }\n}","{\n    id:'yyy', \n    command:'MakeDcmXMLFeedback',\n    commandId:'xxx',\n    data:{\n        state:0,\n        detail:{#jsonData},\n        message:''\n    }\n}",null,"v1.7.0"]
[null,null,"DCM创建","{\n    id:'xxx',\n    command:'MakeDcm',\n    data:{\n        type:'0/1/2/3/4',\n        xmlData:{#jsonData},\n        fileData:'#base64' \n    }\n}","{\n    id:'yyy', \n    command:'MakeDcmFeedback',\n    commandId:'xxx',\n    data:{\n        state:0,\n        message:''\n    }\n}",null,"v1.7.0"]
[null,7.1,"检查报告参数设置","{\n    id:'xxx',\n    command:'reportConfigSet',\n    data:{\n        dataDir:\"c:\\abc\\data\",\n        pluginName:'Plugin_Report_Oculus_77000.dll',\n        pluginContent:'#dll base64 string'\n    }\n}","{\n    id:'yyy', \n    command:'reportConfigSetFeedback',\n    commandId:'xxx',\n    data:{\n        state:0,\n        message:''\n    }\n}",null,"v1.6.2"]
[null,7.2,"检查报告参数查询","{\n    id:'xxx',\n    command:'reportConfigQuery'\n}","{\n    id:'yyy', \n    command:'reportConfigQueryFeedback',\n    commandId:'xxx',\n    data:{\n        state:0,\n        message:'',\n        dataDir:\"c:\\abc\\data\",\n        pluginName:'Plugin_Report_Oculus_77000.dll'\n    }\n}",null,"v1.6.2"]
[null,7.3,"检查报告数据查询","{\n    id:'xxx',\n    command:'reportDataQuery',\n    data:{\n        pid:'#pid',    \n        day:'2025-01-01'\n    }\n}","{\n    id:'yyy', \n    command:'reportDataQueryFeedback',\n    commandId:'xxx',\n    data:{\n        state:0,\n        message:'',\n        detail:'#json data'\n    }\n}","查询指定pid相关报告信息，返回结果与具体设备、型号相关\npid：患者Id\nday：检查日期 yyyy-MM-dd","v1.6.2"]
[null,8.1,"更新token","{\n    id:'xxx',\n    command:'updateToken',\n    data:{\n        token:'#token'\n    }\n}","{\n    id:'yyy', \n    command:'updateTokenFeedback',\n    commandId:'xxx',\n    data:{\n        state:0,\n        message:''\n    }\n}",null,"v1.6.4"]

{"sheet":"2-服务端发送","index":2,"n_rows":10,"n_cols":7,"rows_kept":10,"cut":false,"hidden":false,"merged":[]}
[]
[]
[null,"序号","名称","发送数据格式","接收数据格式","说明","涉及版本"]
[null,1,"常规检查数据发送","{\n    id:'xxx', \n    command:'examineData',\n    data:{\n        deviceId:'',\n        value:'BASE64数据形式'\n    }\n}",null,"数据发送，不需要返回确认信息","v1.4.0"]
[null,2,"文件提交完成通知信息","{\n    id:'xxx', \n    command:'fileSendOK',\n    data:{\n        deviceId:'',\n        fileId:''\n    }\n}",null,"消息推送，不需要返回确认信息\n报告文件与DCM文件提交完成之后对webSocket客户端进行消息通知\n只涉及PDF报告文件，DCM提交事件单独处理（v1.5.0）\n","v1.4.2\nv1.5.0"]
[null,3,"DCM文件创建完成消息","{\n    id:'xxx', \n    command:'newDcmFile',\n    data:{\n        deviceId:'#deviceId',\n        pid:'#pid',\n        eid:'#eid'\n    }\n}",null,"发现新的DCM事件信息，包含患者Id，检查Id","v1.4.2\nv1.5.0"]
[null,4,"发现新报告文件消息","{\n    id:'xxx', \n    command:'newReportFile',\n    data:{\n        deviceId:'',\n        fileId:'文件id',\n        name:'文件名',\n        createTime:'创建时间',\n        url:'http://127.0.0.1:xxx/xxx/xxxxxx'\n    }\n}",null,"消息推送，不需要返回确认信息","v1.4.2"]
[null,5,"串口工作状态变更消息","{\n    id:'xxx', \n    command:'comStatusChanged',\n    data:{\n        status:'',    // 状态信息，文字方式\n        message:''    // 其他说明\n    }\n}",null,"消息推送，不需要返回确认信息","v1.4.6"]
[null,6,"DCM文件提交完成通知信息","{\n    id:'xxx', \n    command:'dcmFileSendOK',\n    data:{\n        deviceId:'',\n        pid:'#pid',\n        eid:'#eid'\n    }\n}",null,"消息推送，不需要返回确认信息\nDCM文件提交完成之后对webSocket客户端进行消息通知\n","v1.5.0"]
[null,7,"DCM处理插件内容获取","{\n    id:'xxx', \n    command:'getDcmPlugin',\n    data:'#pluginId'\n}","{\n    id:'yyy', \n    command:'getDcmPluginFeedback',\n    commandId:'xxx',\n    data:{\n        state:0,\n        message:'',\n        dcmPluginId:'#id',\n        dcmPluginName:'#name',\n        pluginData:'base64-dll'\n    }\n}","获取DCM处理插件，提供Id，获取Id/Name/dll内容base64","v1.5.0"]

{"sheet":"3-配置文件结构","index":3,"n_rows":9,"n_cols":4,"rows_kept":9,"cut":false,"hidden":false,"merged":[[1,1,1,3]]}
[null,"发布版本：1.0"]
[null,"工作配置文件使用标准zip进行多文件压缩方式，最终命名xxx.obp"]
[null,"文件结构如下"]
[null,1,"config.ini","配置文件，全局配置等信息（忽略，暂时用不上）"]
[null,2,"work.json","操作流程配置文件，执行动作与操作序列"]
[null,3,"query.json","应用查询操作流程配置文件，执行动作与操作序列"]
[null,4,"readme.txt","说明文件"]
[null,5,"map.txt","映射文件(可以无)"]
[null,6,"资源文件","如目标对象图形文件等"]

{"sheet":"4-模拟操作指令","index":4,"n_rows":8,"n_cols":6,"rows_kept":8,"cut":false,"hidden":false,"merged":[]}
[]
[null,"序号","名称","协议","说明","涉及版本"]
[null,1,"程序（检查）启动","{\n    action:'startProgram',\n    target:'c:\\\\123\\\\abc.exe',\n    wait:100,\n    delay:200\n}",">操作之前会检查进程快照，已启动则自动忽略本次操作\n>target为应用程序启动文件路径","1.2.0\n1.2.1 移除"]
[null,2,"窗体激活","{\n    action:'activateWindow',\n    programPath:'c:\\\\abc\\\\aaa.exe',\n    processName:'aaa',\n    wait:100,\n    delay:100\n}",">根据进程名称【processName】，激活主窗体\n>若发现程序没有启动，则根据指定的启动路径【programPath】进行程序启动操作","1.2.0\n1.2.1"]
[null,3,"点击操作","{\n    action:'click',\n    ignore:'${sex}==0',\n    target:'xxxx.png',\n    position:'100,100',\n    interval:200,\n    wait:100,\n    delay:50,\n    overtime:3000,\n    continueAfterFail:0,\n    description:'点击xxx操作等动作描述'\n}",">针对指定识别目标的指定位置进行点击操作\n>ignore可以不配置，若配置，表达式计算结果为true，则忽略本次操作\n>【target】为识别目标图片对象，position为具体点击位置\n >>target不配置的话，默认继续使用上一步骤识别的区域\n >>position格式为\"x,y\",不配置的话，默认为图片中心位置\n>interval为寻找频率，默认间隔200ms\n>wait是操作前等待时长，默认100ms\n>delay为操作后延时反馈时长，默认50ms\n>overtime为操作整体允许的最大时间，默认3s，超过这个时间，未发现目标也反馈操作结果\n>continueAfterFail标记在对目标对象识别失败时候是否继续流程，默认0,1-继续\n","1.2.0\n1.2.1"]
[null,4,"数据复制","{\n    action:'copy',\n    ignore:'${sex}==0',\n    data:'xxxxxxxxxx',\n    wait:100,\n    delay:0,\n    description:'利用粘贴板进行内容复制'\n}",null,"1.2.0\n1.2.1 移除"]
[null,5,"文字模拟按键录入","{\n    action:'input',\n    ignore:'${sex}==0',\n    data:'xxxxxxxxxx',\n    wait:100,\n    delay:50,\n    description:'内容输入'\n}",null,"1.2.0"]
[null,6,"指定ASC码模拟按键","{\n    action:'inputKey',\n    ignore:'${sex}==0',\n    keyData:0x28,\n    times:1,\n    interval:50,\n    wait:100,\n    delay:50,\n    description:'虚拟按键'\n}",">keyData为虚拟按键值，允许10进制或者0x28这样的16进制格式，参考Win虚拟按键对照表\n>times默认为1，执行次数\n>interval为多次执行之间的等待时长，单位ms，默认50","1.2.0"]

{"sheet":"5-表达式与映射表","index":5,"n_rows":14,"n_cols":7,"rows_kept":14,"cut":false,"hidden":false,"merged":[[1,1,1,4],[3,2,11,2],[12,2,13,2]]}
[]
[null,"基本遵循JS逻辑操作，${xxx}为根据变量名进行value替换",null,null,null,"涉及版本","1.2.0"]
[null,"序号","分类","变量名/方法","可使用表达式说明","DEMO","备注"]
[null,1,"变量名","id",null,"${id}"]
[null,2,null,"uid"]
[null,3,null,"pid"]
[null,4,null,"firstName",null,"${firstName}+' '+${lastName}"]
[null,5,null,"lastName"]
[null,6,null,"sex",null,"${sex}=='0'?'女':'男'"]
[null,7,null,"birthday"]
[null,8,null,"projectCode"]
[null,9,null,"projectName"]
[null,10,"方法","contentMap(key)",">key为变量或者变量计算后的结果\n>从全部的映射文件中查找，返回第一个符合条件的，若找不到，则直接返回KEY","contentMap(formatDateTime('${birthday}','MM'))","当前只能出现在data字段中，返回string格式"]
[null,11,null,"formatDateTime(dateData,dateFormat)",">dateData,必须为日期，格式固定为yyyy-MM-dd形式\ndateFormat则是根据yyyy/MM/dd进行格式转换","formatDateTime('${birthday}','yyyy')","当前只能出现在data字段中，返回string格式"]

{"sheet":"Win 虚拟按键对照表","index":6,"n_rows":383,"n_cols":3,"rows_kept":383,"cut":false,"hidden":false,"merged":[[1,1,1,2],[2,1,2,2],[3,1,3,2],[43,1,44,1],[289,1,291,1],[301,1,303,1],[305,1,307,1],[313,1,316,1],[318,1,321,1],[323,1,326,1],[328,1,331,1],[332,1,334,1],[335,1,337,1],[342,1,344,1],[350,1,360,1],[5,2,6,2],[7,2,8,2],[9,2,10,2],[11,2,12,2],[13,2,14,2],[15,2,16,2],[17,2,18,2],[19,2,20,2],[21,2,22,2],[23,2,24,2],[25,2,26,2],[27,2,28,2],[29,2,30,2],[31,2,32,2],[33,2,34,2],[35,2,36,2],[37,2,38,2],[39,2,40,2],[41,2,42,2],[46,2,47,2],[48,2,49,2],[50,2,51,2],[52,2,53,2],[54,2,55,2],[56,2,57,2],[58,2,59,2],[60,2,61,2],[62,2,63,2],[64,2,65,2],[66,2,67,2],[68,2,69,2],[70,2,71,2],[72,2,73,2],[74,2,75,2],[76,2,77,2],[78,2,79,2],[80,2,81,2],[82,2,83,2],[84,2,85,2],[86,2,87,2],[88,2,89,2],[90,2,91,2],[92,2,93,2],[94,2,95,2],[96,2,97,2],[98,2,99,2],[100,2,101,2],[112,2,113,2],[140,2,141,2],[142,2,143,2],[144,2,145,2],[146,2,147,2],[148,2,149,2],[150,2,151,2],[152,2,153,2],[154,2,155,2],[156,2,157,2],[158,2,159,2],[160,2,161,2],[162,2,163,2],[164,2,165,2],[166,2,167,2],[168,2,169,2],[170,2,171,2],[172,2,173,2],[174,2,175,2],[176,2,177,2],[178,2,179,2],[180,2,181,2],[182,2,183,2],[184,2,185,2],[186,2,187,2],[188,2,189,2],[190,2,191,2],[192,2,193,2],[194,2,195,2],[196,2,197,2],[198,2,199,2],[200,2,201,2],[202,2,203,2],[204,2,205,2],[206,2,207,2],[208,2,209,2],[210,2,211,2],[212,2,213,2],[214,2,215,2],[216,2,217,2],[218,2,219,2],[220,2,221,2],[222,2,223,2],[224,2,225,2],[226,2,227,2],[228,2,229,2],[230,2,231,2],[232,2,233,2],[234,2,235,2],[237,2,238,2],[239,2,240,2],[241,2,242,2],[243,2,244,2],[245,2,246,2],[247,2,248,2],[249,2,250,2],[251,2,252,2],[253,2,254,2],[255,2,256,2],[257,2,258,2],[259,2,260,2],[261,2,262,2],[263,2,264,2],[265,2,266,2],[267,2,268,2],[269,2,270,2],[271,2,272,2],[273,2,274,2],[275,2,276,2],[277,2,278,2],[279,2,280,2],[281,2,282,2],[283,2,284,2],[285,2,286,2],[287,2,288,2],[293,2,294,2],[295,2,296,2],[297,2,298,2],[299,2,300,2],[309,2,310,2],[311,2,312,2],[339,2,340,2],[347,2,348,2],[362,2,363,2],[365,2,366,2],[367,2,368,2],[369,2,370,2],[371,2,372,2],[373,2,374,2],[375,2,376,2],[377,2,378,2],[379,2,380,2],[381,2,382,2]]}
[]
[null,"Win 虚拟按键对照表(Virtual-Key Codes)"]
[null,"Win 虚拟按键对照表(Virtual-Key Codes)"]
[null,"下表显示了系统使用的虚拟键代码的符号常量名称、十六进制值以及鼠标或键盘等效项。代码按数字顺序列出。"]
[null,"Constant/value（常量/值）","Description（描述）"]
[null,"VK_LBUTTON","Left mouse button"]
[null,"0x01"]
[null,"VK_RBUTTON","Right mouse button"]
[null,"0x02"]
[null,"VK_CANCEL","Control-break processing"]
[null,"0x03"]
[null,"VK_MBUTTON","Middle mouse button (three-button mouse)"]
[null,"0x04"]
[null,"VK_XBUTTON1","X1 mouse button"]
[null,"0x05"]
[null,"VK_XBUTTON2","X2 mouse button"]
[null,"0x06"]
[null,"-","Undefined"]
[null,"0x07"]
[null,"VK_BACK","BACKSPACE key"]
[null,"0x08"]
[null,"VK_TAB","TAB key"]
[null,"0x09"]
[null,"-","Reserved"]
[null,"0x0A-0B"]
[null,"VK_CLEAR","CLEAR key"]
[null,"0x0C"]
[null,"VK_RETURN","ENTER key"]
[null,"0x0D"]
[null,"-","Undefined"]
[null,"0x0E-0F"]
[null,"VK_SHIFT","SHIFT key"]
[null,"0x10"]
[null,"VK_CONTROL","CTRL key"]
[null,"0x11"]
[null,"VK_MENU","ALT key"]
[null,"0x12"]
[null,"VK_PAUSE","PAUSE key"]
[null,"0x13"]
[null,"VK_CAPITAL","CAPS LOCK key"]
[null,"0x14"]
[null,"VK_KANA","IME Kana mode"]
[null,"0x15"]
[null,"VK_HANGUEL","IME Hanguel mode (maintained for compatibility;"]
[]
[null,"0x15","use VK_HANGUL)"]
[null,"VK_HANGUL","IME Hangul mode"]
[null,"0x15"]
[null,"VK_IME_ON","IME On"]
[null,"0x16"]
[null,"VK_JUNJA","IME Junja mode"]
[null,"0x17"]
[null,"VK_FINAL","IME final mode"]
[null,"0x18"]
[null,"VK_HANJA","IME Hanja mode"]
[null,"0x19"]
[null,"VK_KANJI","IME Kanji mode"]
[null,"0x19"]
[null,"VK_IME_OFF","IME Off"]
[null,"0x1A"]
[null,"VK_ESCAPE","ESC key"]
[null,"0x1B"]
[null,"VK_CONVERT","IME convert"]
[null,"0x1C"]
[null,"VK_NONCONVERT","IME nonconvert"]
[null,"0x1D"]
[null,"VK_ACCEPT","IME accept"]
[null,"0x1E"]
[null,"VK_MODECHANGE","IME mode change request"]
[null,"0x1F"]
[null,"VK_SPACE","SPACEBAR"]
[null,"0x20"]
[null,"VK_PRIOR","PAGE UP key"]
[null,"0x21"]
[null,"VK_NEXT","PAGE DOWN key"]
[null,"0x22"]
[null,"VK_END","END key"]
[null,"0x23"]
[null,"VK_HOME","HOME key"]
[null,"0x24"]
[null,"VK_LEFT","LEFT ARROW key"]
[null,"0x25"]
[null,"VK_UP","UP ARROW key"]
[null,"0x26"]
[null,"VK_RIGHT","RIGHT ARROW key"]
[null,"0x27"]
[null,"VK_DOWN","DOWN ARROW key"]
[null,"0x28"]
[null,"VK_SELECT","SELECT key"]
[null,"0x29"]
[null,"VK_PRINT","PRINT key"]
[null,"0x2A"]
[null,"VK_EXECUTE","EXECUTE key"]
[null,"0x2B"]
[null,"VK_SNAPSHOT","PRINT SCREEN key"]
[null,"0x2C"]
[null,"VK_INSERT","INS key"]
[null,"0x2D"]
[null,"VK_DELETE","DEL key"]
[null,"0x2E"]
[null,"VK_HELP","HELP key"]
[null,"0x2F"]
[null,"0x30","0 key"]
[null,"0x31","1 key"]
[null,"0x32","2 key"]
[null,"0x33","3 key"]
[null,"0x34","4 key"]
[null,"0x35","5 key"]
[null,"0x36","6 key"]
[null,"0x37","7 key"]
[null,"0x38","8 key"]
[null,"0x39","9 key"]
[null,"-","Undefined"]
[null,"0x3A-40"]
[null,"0x41","A key"]
[null,"0x42","B key"]
[null,"0x43","C key"]
[null,"0x44","D key"]
[null,"0x45","E key"]
[null,"0x46","F key"]
[null,"0x47","G key"]
[null,"0x48","H key"]
[null,"0x49","I key"]
[null,"0x4A","J key"]
[null,"0x4B","K key"]
[null,"0x4C","L key"]
[null,"0x4D","M key"]
[null,"0x4E","N key"]
[null,"0x4F","O key"]
[null,"0x50","P key"]
[null,"0x51","Q key"]
[null,"0x52","R key"]
[null,"0x53","S key"]
[null,"0x54","T key"]
[null,"0x55","U key"]
[null,"0x56","V key"]
[null,"0x57","W key"]
[null,"0x58","X key"]
[null,"0x59","Y key"]
[null,"0x5A","Z key"]
[null,"VK_LWIN","Left Windows key (Natural keyboard)"]
[null,"0x5B"]
[null,"VK_RWIN","Right Windows key (Natural keyboard)"]
[null,"0x5C"]
[null,"VK_APPS","Applications key (Natural keyboard)"]
[null,"0x5D"]
[null,"-","Reserved"]
[null,"0x5E"]
[null,"VK_SLEEP","Computer Sleep key"]
[null,"0x5F"]
[null,"VK_NUMPAD0","Numeric keypad 0 key"]
[null,"0x60"]
[null,"VK_NUMPAD1","Numeric keypad 1 key"]
[null,"0x61"]
[null,"VK_NUMPAD2","Numeric keypad 2 key"]
[null,"0x62"]
[null,"VK_NUMPAD3","Numeric keypad 3 key"]
[null,"0x63"]
[null,"VK_NUMPAD4","Numeric keypad 4 key"]
[null,"0x64"]
[null,"VK_NUMPAD5","Numeric keypad 5 key"]
[null,"0x65"]
[null,"VK_NUMPAD6","Numeric keypad 6 key"]
[null,"0x66"]
[null,"VK_NUMPAD7","Numeric keypad 7 key"]
[null,"0x67"]
[null,"VK_NUMPAD8","Numeric keypad 8 key"]
[null,"0x68"]
[null,"VK_NUMPAD9","Numeric keypad 9 key"]
[null,"0x69"]
[null,"VK_MULTIPLY","Multiply key"]
[null,"0x6A"]
[null,"VK_ADD","Add key"]
[null,"0x6B"]
[null,"VK_SEPARATOR","Separator key"]
[null,"0x6C"]
[null,"VK_SUBTRACT","Subtract key"]
[null,"0x6D"]
[null,"VK_DECIMAL","Decimal key"]
[null,"0x6E"]
[null,"VK_DIVIDE","Divide key"]
[null,"0x6F"]
[null,"VK_F1","F1 key"]
[null,"0x70"]
[null,"VK_F2","F2 key"]
[null,"0x71"]
[null,"VK_F3","F3 key"]
[null,"0x72"]
[null,"VK_F4","F4 key"]
[null,"0x73"]
[null,"VK_F5","F5 key"]
[null,"0x74"]
[null,"VK_F6","F6 key"]
[null,"0x75"]
[null,"VK_F7","F7 key"]
[null,"0x76"]
[null,"VK_F8","F8 key"]
[null,"0x77"]
[null,"VK_F9","F9 key"]
[null,"0x78"]
[null,"VK_F10","F10 key"]
[null,"0x79"]
[null,"VK_F11","F11 key"]
[null,"0x7A"]
[null,"VK_F12","F12 key"]
[null,"0x7B"]
[null,"VK_F13","F13 key"]
[null,"0x7C"]
[null,"VK_F14","F14 key"]
[null,"0x7D"]
[null,"VK_F15","F15 key"]
[null,"0x7E"]
[null,"VK_F16","F16 key"]
[null,"0x7F"]
[null,"VK_F17","F17 key"]
[null,"0x80"]
[null,"VK_F18","F18 key"]
[null,"0x81"]
[null,"VK_F19","F19 key"]
[null,"0x82"]
[null,"VK_F20","F20 key"]
[null,"0x83"]
[null,"VK_F21","F21 key"]
[null,"0x84"]
[null,"VK_F22","F22 key"]
[null,"0x85"]
[null,"VK_F23","F23 key"]
[null,"0x86"]
[null,"VK_F24","F24 key"]
[null,"0x87"]
[null,"-","Unassigned"]
[null,"0x88-8F"]
[null,"VK_NUMLOCK","NUM LOCK key"]
[null,"0x90"]
[null,"VK_SCROLL","SCROLL LOCK key"]
[null,"0x91"]
[null,"0x92-96","OEM specific"]
[null,"-","Unassigned"]
[null,"0x97-9F"]
[null,"VK_LSHIFT","Left SHIFT key"]
[null,"0xA0"]
[null,"VK_RSHIFT","Right SHIFT key"]
[null,"0xA1"]
[null,"VK_LCONTROL","Left CONTROL key"]
[null,"0xA2"]
[null,"VK_RCONTROL","Right CONTROL key"]
[null,"0xA3"]
[null,"VK_LMENU","Left MENU key"]
[null,"0xA4"]
[null,"VK_RMENU","Right MENU key"]
[null,"0xA5"]
[null,"VK_BROWSER_BACK","Browser Back key"]
[null,"0xA6"]
[null,"VK_BROWSER_FORWARD","Browser Forward key"]
[null,"0xA7"]
[null,"VK_BROWSER_REFRESH","Browser Refresh key"]
[null,"0xA8"]
[null,"VK_BROWSER_STOP","Browser Stop key"]
[null,"0xA9"]
[null,"VK_BROWSER_SEARCH","Browser Search key"]
[null,"0xAA"]
[null,"VK_BROWSER_FAVORITES","Browser Favorites key"]
[null,"0xAB"]
[null,"VK_BROWSER_HOME","Browser Start and Home key"]
[null,"0xAC"]
[null,"VK_VOLUME_MUTE","Volume Mute key"]
[null,"0xAD"]
[null,"VK_VOLUME_DOWN","Volume Down key"]
[null,"0xAE"]
[null,"VK_VOLUME_UP","Volume Up key"]
[null,"0xAF"]
[null,"VK_MEDIA_NEXT_TRACK","Next Track key"]
[null,"0xB0"]
[null,"VK_MEDIA_PREV_TRACK","Previous Track key"]
[null,"0xB1"]
[null,"VK_MEDIA_STOP","Stop Media key"]
[null,"0xB2"]
[null,"VK_MEDIA_PLAY_PAUSE","Play/Pause Media key"]
[null,"0xB3"]
[null,"VK_LAUNCH_MAIL","Start Mail key"]
[null,"0xB4"]
[null,"VK_LAUNCH_MEDIA_SELECT","Select Media key"]
[null,"0xB5"]
[null,"VK_LAUNCH_APP1","Start Application 1 key"]
[null,"0xB6"]
[null,"VK_LAUNCH_APP2","Start Application 2 key"]
[null,"0xB7"]
[null,"-","Reserved"]
[null,"0xB8-B9"]
[null,"VK_OEM_1","Used for miscellaneous characters; it can vary by"]
[]
[null,null,"keyboard."]
[null,"0xBA","For the US standard keyboard, the ';:' key"]
[null,"VK_OEM_PLUS","For any country/region, the '+' key"]
[null,"0xBB"]
[null,"VK_OEM_COMMA","For any country/region, the ',' key"]
[null,"0xBC"]
[null,"VK_OEM_MINUS","For any country/region, the '-' key"]
[null,"0xBD"]
[null,"VK_OEM_PERIOD","For any country/region, the '.' key"]
[null,"0xBE"]
[null,"VK_OEM_2","Used for miscellaneous characters; it can vary by"]
[]
[null,null,"keyboard."]
[null,"0xBF","For the US standard keyboard, the '/?' key"]
[null,"VK_OEM_3","Used for miscellaneous characters; it can vary by"]
[]
[null,null,"keyboard."]
[null,"0xC0","For the US standard keyboard, the '`~' key"]
[null,"-","Reserved"]
[null,"0xC1-D7"]
[null,"-","Unassigned"]
[null,"0xD8-DA"]
[null,"VK_OEM_4","Used for miscellaneous characters; it can vary by"]
[]
[]
[null,null,"keyboard."]
[null,"0xDB","For the US standard keyboard, the '[{' key"]
[null,"VK_OEM_5","Used for miscellaneous characters; it can vary by"]
[]
[]
[null,null,"keyboard."]
[null,"0xDC","For the US standard keyboard, the '\\|' key"]
[null,"VK_OEM_6","Used for miscellaneous characters; it can vary by"]
[]
[]
[null,null,"keyboard."]
[null,"0xDD","For the US standard keyboard, the ']}' key"]
[null,"VK_OEM_7","Used for miscellaneous characters; it can vary by"]
[]
[]
[null,null,"keyboard."]
[null,"0xDE","For the US standard keyboard, the 'single-quote/double-"]
[]
[null,null,"quote' key"]
[null,"VK_OEM_8","Used for miscellaneous characters; it can vary by"]
[]
[]
[null,"0xDF","keyboard."]
[null,"-","Reserved"]
[null,"0xE0"]
[null,"0xE1","OEM specific"]
[null,"VK_OEM_102","Either the angle bracket key or the backslash key on the"]
[]
[]
[null,"0xE2","RT 102-key keyboard"]
[null,"0xE3-E4","OEM specific"]
[null,"VK_PROCESSKEY","IME PROCESS key"]
[null,"0xE5"]
[null,"0xE6","OEM specific"]
[null,"VK_PACKET","Used to pass Unicode characters as if they were"]
[]
[]
[null,null,"keystrokes. The VK_PACKET key is the low word of a 32-"]
[]
[null,null,"bit Virtual Key value used for non-keyboard input"]
[]
[null,null,"methods. For more information, see Remark"]
[]
[null,null,"in KEYBDINPUT, SendInput, WM_KEYDOWN,"]
[]
[null,"0xE7","and WM_KEYUP"]
[null,"-","Unassigned"]
[null,"0xE8"]
[null,"0xE9-F5","OEM specific"]
[null,"VK_ATTN","Attn key"]
[null,"0xF6"]
[null,"VK_CRSEL","CrSel key"]
[null,"0xF7"]
[null,"VK_EXSEL","ExSel key"]
[null,"0xF8"]
[null,"VK_EREOF","Erase EOF key"]
[null,"0xF9"]
[null,"VK_PLAY","Play key"]
[null,"0xFA"]
[null,"VK_ZOOM","Zoom key"]
[null,"0xFB"]
[null,"VK_NONAME","Reserved"]
[null,"0xFC"]
[null,"VK_PA1","PA1 key"]
[null,"0xFD"]
[null,"VK_OEM_CLEAR","Clear key"]
[null,"0xFE"]