Files
coco df489d5640 a
2026-07-03 16:05:30 +08:00

13 KiB
Raw Permalink Blame History

数据导入导出

**本文档引用的文件** - [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)则负责特定格式的文件读写。

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类

CIOManager类是数据导入导出功能的核心管理器,负责协调整个导入导出流程。它提供了Export和Import两个主要方法,分别处理数据导出和导入操作。在导出过程中,IOManager创建一个新的Access数据库文件,并将项目、测区、测点等数据结构化地导出到该数据库中。

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

Section sources

DataOperator类

CDataOperator类负责具体的数据操作,包括将数据导出为各种格式(Excel、CSV、TXT、URF)。它通过调用相应的文件操作工具类来实现不同格式的文件写入。该类提供了丰富的导出方法,支持一维、二维和三维电阻率及激电数据的导出。

Section sources

文件解析与数据映射

Excel和CSV文件处理

Excel和CSV文件的处理通过excel.cpp文件中的类实现。系统使用COM接口与Excel应用程序交互,实现数据的读写操作。对于CSV文件,系统采用文本文件处理方式,通过逗号分隔符解析数据。

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

Section sources

TXT文件处理

TXT文件处理由COperTxtFile类负责,该类提供了灵活的文本文件写入功能。系统允许设置参数宽度,确保数据对齐。写入时,不足宽度的部分用空格填充,保证了文件的可读性。

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

Section sources

URF文件处理

URFUniversal Resistivity data File)文件处理由COperUrfFile类实现。该类支持多种电极阵列配置的URF文件生成,包括温纳-施伦贝格尔(Wenner-Schlumberger)、交叉孔(Cross Hole)等装置类型。系统根据不同的装置类型生成相应的电极坐标信息。

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

Section sources

批处理脚本集成

批处理脚本(如IAP-GD10.bat)与核心功能的集成主要通过命令行调用实现。这些脚本通常用于固件更新或设备配置,通过调用DFU工具来完成设备的编程操作。

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

Section sources

错误处理机制

系统实现了全面的错误处理机制,确保在数据导入导出过程中出现问题时能够及时发现并处理。错误处理包括格式验证、编码处理、数据完整性检查等方面。

格式兼容性检查

在导入数据时,系统首先检查文件格式是否兼容。对于Access数据库文件,系统会验证是否存在特定的版本标识符,确保文件结构正确。

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

编码问题处理

系统在处理文本文件时,会自动检测文件编码,并在必要时进行转换。对于中文环境,系统使用适当的字符集确保中文字符的正确显示。

数据丢失预防

为防止数据丢失,系统在执行导入导出操作时使用数据库事务。所有操作都在事务中进行,只有当所有操作都成功完成时才会提交事务,否则回滚到操作前的状态。

Section sources

结论

Geomative Studio的数据导入导出功能提供了全面的解决方案,支持多种数据格式的转换。系统采用分层架构设计,各组件职责明确,便于维护和扩展。通过IOManager和DataOperator类的协同工作,实现了从数据库到各种文件格式的高效转换。同时,系统提供了完善的错误处理机制,确保数据操作的安全性和可靠性。批处理脚本的集成进一步增强了系统的自动化能力,为用户提供了便捷的操作体验。