# 数据导入导出 **本文档引用的文件** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp) - [IOManager.h](file://h/IOManager.h) - [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp) - [DataOperator.h](file://h/DataOperator.h) - [excel.cpp](file://cpp/Tools/excel.cpp) - [OperTxtFile.cpp](file://cpp/Tools/OperTxtFile.cpp) - [OperUrfFile.cpp](file://cpp/Tools/OperUrfFile.cpp) - [IAP-GD10.bat](file://tools/IAP-GD10.bat) ## 目录 1. [引言](#引言) 2. [数据导入导出架构](#数据导入导出架构) 3. [核心组件分析](#核心组件分析) 4. [文件解析与数据映射](#文件解析与数据映射) 5. [批处理脚本集成](#批处理脚本集成) 6. [错误处理机制](#错误处理机制) 7. [结论](#结论) ## 引言 Geomative Studio 提供了全面的数据导入导出功能,支持多种数据格式(Excel、CSV、TXT、URF)的转换。本文档详细描述了CIOManager支持的多种数据格式的导入导出机制,包括文件解析流程、数据映射规则和格式转换策略。文档结合DataOperator类的实现,展示从外部文件读取数据并持久化到数据库的完整流程,以及从数据库导出为指定格式的实现细节。同时提供批处理脚本(如IAP-GD10.bat)与核心功能的集成方式说明,并包含格式不兼容、编码问题和数据丢失预防等错误处理机制。 ## 数据导入导出架构 Geomative Studio的数据导入导出功能采用分层架构设计,主要由IOManager、DataOperator和文件操作工具类组成。IOManager负责管理导入导出的整体流程,DataOperator处理具体的数据操作,而各种文件操作类(如COperTxtFile、COperUrfFile)则负责特定格式的文件读写。 ```mermaid graph TB subgraph "用户界面" UI[数据导入导出界面] end subgraph "业务逻辑层" IOManager[CIOManager] DataOperator[CDataOperator] end subgraph "数据访问层" FileOperator[文件操作工具] Database[数据库] end subgraph "文件格式" Excel[Excel文件] CSV[CSV文件] TXT[TXT文件] URF[URF文件] end UI --> IOManager IOManager --> DataOperator DataOperator --> FileOperator FileOperator --> Excel FileOperator --> CSV FileOperator --> TXT FileOperator --> URF DataOperator --> Database Database --> FileOperator ``` **Diagram sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L35-L98) - [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L79-L95) - [OperTxtFile.cpp](file://cpp/Tools/OperTxtFile.cpp#L19-L35) - [OperUrfFile.cpp](file://cpp/Tools/OperUrfFile.cpp#L19-L27) ## 核心组件分析 ### IOManager类 CIOManager类是数据导入导出功能的核心管理器,负责协调整个导入导出流程。它提供了Export和Import两个主要方法,分别处理数据导出和导入操作。在导出过程中,IOManager创建一个新的Access数据库文件,并将项目、测区、测点等数据结构化地导出到该数据库中。 ```mermaid classDiagram class CIOManager { +_ConnectionPtr m_pConnection +ADOX : : _CatalogPtr m_pCatalog +CHandleProcessor m_handleProcessor +CStateProcessor m_stateProcessor +UINT Export() +UINT Import() +_ConnectionPtr CreateExpDatabase(CString szFileName) +void ExportDataToAccdbFile(_ConnectionPtr pExpConnection, CTreeCtrl& dmsTree) +void ExportProjectToAccdbFile(_ConnectionPtr pExpConnection, DWORD dwProID) +void ExportTzToAccdbFile(_ConnectionPtr pExpConnection, DWORD dwTzID) +void ExportRspTdToAccdbFile(_ConnectionPtr pExpConnection, DWORD dwTdID) +void ExportIpspTdToAccdbFile(_ConnectionPtr pExpConnection, DWORD dwTdID) +void ImportProjectToDB(_ConnectionPtr pImpConnection) +void ImportTzToDB(_ConnectionPtr pImpConnection) +void ImportSptToDB(_ConnectionPtr pImpConnection) +void ImportRspTdToDB(_ConnectionPtr pImpConnection) +void ImportIpspTdToDB(_ConnectionPtr pImpConnection) } class CDataOperator { +_ConnectionPtr m_pConnection +CStateProcessor m_stateProcessor +CHandleProcessor m_handleProcessor +DWORD m_dwItemHandle +bool m_BatchExportFlag +UINT ExportIpCETdToExcel(CNavDataView *pNavDataView, CString f_szFileName) +UINT ExportIp2DTdToExcel(CNavDataView *pNavDataView, CString f_szFileName) +UINT ExportIp3DTdToExcel(CNavDataView *pNavDataView, CString f_szFileName) +UINT ExportIpCETdToCSV(CNavDataView *pNavDataView, CString f_szFileName) +UINT ExportIp2DTdToCSV(CNavDataView *pNavDataView, CString f_szFileName) +UINT ExportIp3DTdToCSV(CNavDataView *pNavDataView, CString f_szFileName) +UINT ExportIP2DToTxt(CNavDataView *pNavDataView, CString f_szFileName) +UINT ExportIP3DToTxt(CNavDataView *pNavDataView, CString f_szFileName) +UINT ExportIP1DToTxt(CNavDataView *pNavDataView, CString f_szFileName) +UINT ExportRspCETdToExcel(CNavDataView *pNavDataView, CString f_szFileName) +UINT ExportRsp2DTdToExcel(CNavDataView *pNavDataView, CString f_szFileName) +UINT ExportRsp3DTdToExcel(CNavDataView *pNavDataView, CString f_szFileName) +UINT ExportRspCETdToCSV(CNavDataView *pNavDataView, CString f_szFileName) +UINT ExportRsp2DTdToCSV(CNavDataView *pNavDataView, CString f_szFileName) +UINT ExportRsp3DTdToCSV(CNavDataView *pNavDataView, CString f_szFileName) +UINT ExportRsp2DTdToUrf(CNavDataView *pNavDataView, CString f_szFileName) +UINT ExportRsp3DTdToUrf(CNavDataView *pNavDataView, CString f_szFileName) } CIOManager --> CDataOperator : "使用" ``` **Diagram sources** - [IOManager.h](file://h/IOManager.h#L15-L49) - [DataOperator.h](file://h/DataOperator.h#L23-L171) **Section sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L35-L98) - [IOManager.h](file://h/IOManager.h#L15-L49) ### DataOperator类 CDataOperator类负责具体的数据操作,包括将数据导出为各种格式(Excel、CSV、TXT、URF)。它通过调用相应的文件操作工具类来实现不同格式的文件写入。该类提供了丰富的导出方法,支持一维、二维和三维电阻率及激电数据的导出。 **Section sources** - [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L79-L95) - [DataOperator.h](file://h/DataOperator.h#L23-L171) ## 文件解析与数据映射 ### Excel和CSV文件处理 Excel和CSV文件的处理通过excel.cpp文件中的类实现。系统使用COM接口与Excel应用程序交互,实现数据的读写操作。对于CSV文件,系统采用文本文件处理方式,通过逗号分隔符解析数据。 ```mermaid flowchart TD Start([开始导出]) --> CheckFormat["检查导出格式"] CheckFormat --> |Excel| CreateExcel["创建Excel工作簿"] CheckFormat --> |CSV| CreateCSV["创建CSV文件"] CheckFormat --> |TXT| CreateTXT["创建TXT文件"] CheckFormat --> |URF| CreateURF["创建URF文件"] CreateExcel --> WriteHeader["写入表头"] CreateCSV --> WriteHeader CreateTXT --> WriteHeader CreateURF --> WriteHeader WriteHeader --> GetData["从数据库获取数据"] GetData --> FormatData["格式化数据"] FormatData --> WriteData["写入数据行"] WriteData --> CheckMore["是否有更多数据?"] CheckMore --> |是| WriteData CheckMore --> |否| SaveFile["保存文件"] SaveFile --> End([导出完成]) ``` **Diagram sources** - [excel.cpp](file://cpp/Tools/excel.cpp#L19-L800) - [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L100-L112) **Section sources** - [excel.cpp](file://cpp/Tools/excel.cpp#L19-L800) - [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L100-L112) ### TXT文件处理 TXT文件处理由COperTxtFile类负责,该类提供了灵活的文本文件写入功能。系统允许设置参数宽度,确保数据对齐。写入时,不足宽度的部分用空格填充,保证了文件的可读性。 ```mermaid sequenceDiagram participant UI as "用户界面" participant DataOperator as "CDataOperator" participant OperTxtFile as "COperTxtFile" participant File as "文件系统" UI->>DataOperator : 请求导出TXT文件 DataOperator->>DataOperator : 获取选中的测点数据 DataOperator->>OperTxtFile : 创建COperTxtFile实例 OperTxtFile->>OperTxtFile : 设置参数宽度 OperTxtFile->>File : 打开文件进行写入 File-->>OperTxtFile : 文件句柄 OperTxtFile->>DataOperator : 准备数据数组 DataOperator->>OperTxtFile : 提供格式化数据 OperTxtFile->>File : 写入数据行 loop 每一行数据 OperTxtFile->>File : 写入格式化行 end OperTxtFile->>File : 关闭文件 DataOperator-->>UI : 返回导出结果 ``` **Diagram sources** - [OperTxtFile.cpp](file://cpp/Tools/OperTxtFile.cpp#L19-L166) - [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L110-L112) **Section sources** - [OperTxtFile.cpp](file://cpp/Tools/OperTxtFile.cpp#L19-L166) ### URF文件处理 URF(Universal Resistivity data File)文件处理由COperUrfFile类实现。该类支持多种电极阵列配置的URF文件生成,包括温纳-施伦贝格尔(Wenner-Schlumberger)、交叉孔(Cross Hole)等装置类型。系统根据不同的装置类型生成相应的电极坐标信息。 ```mermaid flowchart TD Start([开始URF导出]) --> CheckAR["检查装置类型"] CheckAR --> |温纳-施伦贝格尔| WenSch["生成Wenner-Schlumberger电极坐标"] CheckAR --> |交叉孔| CrossHole["生成Cross Hole电极坐标"] CheckAR --> |自定义| Custom["生成自定义电极坐标"] WenSch --> CalcCoord["计算电极坐标"] CrossHole --> CalcCoord Custom --> CalcCoord CalcCoord --> CreateFile["创建URF文件"] CreateFile --> WriteHeader["写入URF文件头"] WriteHeader --> WriteElec["写入电极信息"] WriteElec --> WriteData["写入测量数据"] WriteData --> SaveFile["保存URF文件"] SaveFile --> End([URF导出完成]) ``` **Diagram sources** - [OperUrfFile.cpp](file://cpp/Tools/OperUrfFile.cpp#L31-L800) - [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L146-L148) **Section sources** - [OperUrfFile.cpp](file://cpp/Tools/OperUrfFile.cpp#L31-L800) ## 批处理脚本集成 批处理脚本(如IAP-GD10.bat)与核心功能的集成主要通过命令行调用实现。这些脚本通常用于固件更新或设备配置,通过调用DFU工具来完成设备的编程操作。 ```mermaid sequenceDiagram participant User as "用户" participant BatchScript as "批处理脚本" participant DFUTool as "DFU工具" participant Device as "GD10设备" User->>BatchScript : 运行IAP-GD10.bat BatchScript->>BatchScript : 延迟10秒等待设备连接 BatchScript->>DFUTool : 调用DfuCreateFile创建DFU文件 DFUTool-->>BatchScript : 生成APP.dfu文件 BatchScript->>DFUTool : 调用DfuSeCommand烧录固件 DFUTool->>Device : 通过USB传输固件 Device-->>DFUTool : 确认烧录完成 DFUTool-->>BatchScript : 返回烧录结果 BatchScript->>BatchScript : 删除临时DFU文件 BatchScript-->>User : 完成固件更新 ``` **Diagram sources** - [IAP-GD10.bat](file://tools/IAP-GD10.bat#L1-L16) **Section sources** - [IAP-GD10.bat](file://tools/IAP-GD10.bat#L1-L16) ## 错误处理机制 系统实现了全面的错误处理机制,确保在数据导入导出过程中出现问题时能够及时发现并处理。错误处理包括格式验证、编码处理、数据完整性检查等方面。 ### 格式兼容性检查 在导入数据时,系统首先检查文件格式是否兼容。对于Access数据库文件,系统会验证是否存在特定的版本标识符,确保文件结构正确。 ```mermaid flowchart TD Start([开始导入]) --> CheckFile["检查文件是否存在"] CheckFile --> |不存在| ShowError1["显示文件不存在错误"] CheckFile --> |存在| OpenConnection["打开数据库连接"] OpenConnection --> |失败| ShowError2["显示连接错误"] OpenConnection --> |成功| CheckVersion["检查数据库版本"] CheckVersion --> |版本不匹配| ShowError3["显示版本不兼容错误"] CheckVersion --> |版本匹配| BeginTransaction["开始事务"] BeginTransaction --> ImportData["导入数据"] ImportData --> |成功| Commit["提交事务"] ImportData --> |失败| Rollback["回滚事务"] Commit --> End([导入成功]) Rollback --> ShowError4["显示导入失败错误"] ShowError1 --> End ShowError2 --> End ShowError3 --> End ShowError4 --> End ``` **Section sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L133-L158) ### 编码问题处理 系统在处理文本文件时,会自动检测文件编码,并在必要时进行转换。对于中文环境,系统使用适当的字符集确保中文字符的正确显示。 ### 数据丢失预防 为防止数据丢失,系统在执行导入导出操作时使用数据库事务。所有操作都在事务中进行,只有当所有操作都成功完成时才会提交事务,否则回滚到操作前的状态。 **Section sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L177-L188) - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L63-L77) ## 结论 Geomative Studio的数据导入导出功能提供了全面的解决方案,支持多种数据格式的转换。系统采用分层架构设计,各组件职责明确,便于维护和扩展。通过IOManager和DataOperator类的协同工作,实现了从数据库到各种文件格式的高效转换。同时,系统提供了完善的错误处理机制,确保数据操作的安全性和可靠性。批处理脚本的集成进一步增强了系统的自动化能力,为用户提供了便捷的操作体验。