C# 导入Excel
Posted guxingy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 导入Excel相关的知识,希望对你有一定的参考价值。
项目结构:
配置文件
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.122.19.1, Culture=neutral, PublicKeyToken=89b483f429c47342"/> </configSections> <appSettings> <!-- 注意(备注): 特别注意 !!!: 导入数据前 需要删掉触发器和序列(Oracle),或 取消自增长ID(SQL Server) 如果导入的数据,没有形成树型结构,子节点和根节点在一个层级。 原因:没有删除触发器和序列(Oracle)或 自增长ID(SQL Server) 1、合同段名称必须统一,Excel后缀名统一为.xlsx ,文件名 节点名 合同段名 三个名字必须一致,方便导入数据 2、Excel附加属性(ExcelAdditionalAttr): 这个属性的更改,需要删除Debug目录下的Cache文件夹, 该字段会影响缓存,可能会导致缓存不是最新!!!,该字段默认为false(默认不启用缓存) 如果需要再新增属性列,需要修改代码的地方(在代码中搜索关键字:Excel附加属性)添加即可 添加Excel附加属性:需添加 中文名(Excel列名) 和 英文名(字段名),一一对应。 列名为:桩号,构件编码 的是属性列, 属性列 只作为 最后节点的属性 存入数据库,不会新建节点 如果最后节点不为属性列,那么每个字段都需要校验,即设置ExcelAdditionalAttr_AllFieldCheck为true即可 ExcelAdditionalAttr_AllFieldCheck属性默认值为true,该属性的意思是,每个字段都校验是否是属性列 Excel附加属性 的 英文名 必须和 类的属性名 一一对应 3、导入数据时替换原始节点: 这个功能本来是有的,后来删掉了该功能, 原因:实际情况较为复杂,有可能是三级节点,有可能是四级节点, 手动在数据库删除节点后,再导入数据,这种方式 较为妥当。 4、触发器和序列命名规则: 如果随意命名,这里的删除和添加触发器的功能(操作类型: 3、4、5)将无法正常使用。只能自己改‘功能3’生成的SQL文件 触发器命名:TR_TableName 序列命名:SQ_TableName 5、如果导入的数据,没有形成树型结构,子节点和根节点在一个层级。 原因:没有删除触发器和序列(Oracle)或 自增长ID(SQL Server) 6、Excel校验:导入数据前,可先进行数据校验,确保Excel数据无问题。 7、最新版本格式的Excel,列会从‘砼等级’开始过滤(包含砼等级),意思是从‘砼等级’列开始的列,不添加到分部分项 8、删除指定节点的子节点。需保证节点唯一,如果节点不唯一,会抛出异常。 9、 Excel校验内容: 01、隐藏行、隐藏列、 02、行高不足(可配置) 03、列名强制校验(必须包含指定列) 04、单元格为公式 05、构件编码为空 06、构件编码包含中文 07、构件编码重复 08、构件编码过少(可配置数量) 09、同行构件名称重复(子节点和父节点名称相同) 10、构件名称重复 11、首列为空校验,当前行为空则跳过校验 12、单元格缺失数据 或 忘合并的单元格 判断 10、(废弃)注意表结构是否和数据一样,注意一下,看字段“VersionIng”是string类型还是int类型,需要把该字段类型改为和数据库一直就可以了。 11、(废弃)旧表 换为 新表,程序使用了这几个字段(NextId,BiDSion)的地方注释掉了,修改的类:Node.cs、NodeHelper.cs 12、(废弃)切换新表和旧表,需要在程序中切换Model,重新编译 13、添加完分部分项,自动校验构件编码是否都保存到了数据库,前提是开启了附加属性,且Excel有该列 14、导入数据,系统已预设了三个版本,通过修改参数“ExportVersion”来控制 15、注意版本之间的差异,目前有三种导入方式 版本1:城开的那种导入方式 版本2:胡平安那个项目的导入方式 版本3:模板是城开的那种模板,只是在导入的数据上,把Excel的列名附加了进去 --> <!-- 操作类型: 0:添加初始节点(一二级节点) 1:批量导入合同段数据 2:Excel校验,写入到文件ErrorCell.txt 3:创建SQL脚本 for Oracle数据库的序列和触发器,写入文件SQL_TRIGGER_SEQUENCE.txt 4:删除Oracle数据库的序列和触发器(失效) 5:添加Oracle数据库的序列和触发器(失效) 6:删除指定节点的子节点,多个节点以逗号隔开,如:B2合同段-城开隧道左线,B2合同段-城开隧道右线 --> <add key="OperationType" value="1"/> <!-- 要导入的 合同段名称 多个名称以英文半角逗号隔开 --> <!--<add key="ImportExcelName" value="A2合同段,A3合同段,B1合同段,B2合同段,B3合同段,C1合同段,C2合同段,C3合同段"/>--> <add key="ImportExcelName" value="A2合同段"/> <!-- 表名 QMS.TB_PROJECTS TB_PROJECTS --> <add key="TableName" value="TB_PROJECTS_V2_2"/> <!-- 数据库类型 0:Oracle 1:SQLServer --> <add key="SQLType" value="1"/> <!-- 导入版本 版本号:1、 2、 3 已配置了两个版本 在CommonHelper.cs的Initial方法中查看 已包含了某些属性的初始化 --> <add key="ExportVersion" value="2"/> <!-- 删除指定节点的子节点,多个节点以逗号隔开,格式:父节点-子节点 如:B2合同段-城开隧道左线,B2合同段-城开隧道右线 注意:父节点不能含有‘-’,子节点可以有 --> <add key="DeleteChildNode" value=""/> <!-- 数据库连接 --> <add key="OracleConn" value="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.2.98)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=JJJT)));User ID=CMSP;Password=Oracle1;"/> <add key="SQLServerConn" value="data source=.\\sqlexpress;initial catalog=TEST1;user id=sa;password=sa;"/> <!--<add key="SQLServerConn" value="data source=192.168.2.98;initial catalog=QMS;user id=sa;password=Sql123456;"/>--> <!-- 下面的配置参数 不需要做调整 --> <!-- 编码前缀--> <add key="CodePrefix" value="LZEEE"/> <!-- Excel附加属性 列名,附加Excel列名 到 字段VersionIng 注意:以前的表无法使用,以前的表冉金海设置成的int类型。设置为false就能兼容以前的表 --> <add key="ExcelAdditionalAttr_ColumnName" value="false"/> <!-- 一级节点名称 城开高速公路 重庆城口至开州高速公路--> <add key="OneLevelName" value="城开高速公路"/> <!-- 一级节点的ID 添加初始节点时使用 --> <add key="OneLevelId" value="510321"/> <!-- 二级节点名称 --> <add key="TwoLevelNodesName" value="A1合同段,A2合同段,A3合同段,B1合同段,B2合同段,B3合同段,C1合同段,C2合同段,C3合同段"/> <!-- Excel字段过滤 的起始列名(过滤包含该列) --> <add key="ExcelFirstFilterAttrName" value="砼等级"/> <!-- Excel附加属性:是否允许附加属性 注意:这个属性的更改需要删除Debug目录下的Cache文件夹,该字段会影响缓存!!! --> <add key="ExcelAdditionalAttr" value="true"/> <!-- Excel附加属性: 中文名(Excel列名) 和 英文名(字段名) --> <add key="ExcelAdditionalAttr_Cn" value="桩号,构件编码,构件类型,设备编码"/> <add key="ExcelAdditionalAttr_En" value="MileageNo,NComponentCode,ProjectType,EquCode"/> <!-- Excel附加属性: 所有字段都校验 校验规则:默认只校验最后一个字段(不含附加属性)。 注意:当附加属性列在中间时,需要设置为true --> <add key="ExcelAdditionalAttr_AllFieldCheck" value="true"/> <!-- 保存到数据库 --> <add key="SaveDB" value="true"/> <!-- 保存SQL文件 --> <add key="SaveSQLFile" value="true"/> <!-- 是否支持 Excel公式 --> <add key="IsSupportFormula" value="true"/> <!-- 是否支持 缓存 --> <add key="IsAllowCache" value="false"/> <!-- 编码重复判断(很占用时间) --> <add key="CheckSameCode" value="false"/> <!-- Excel校验配置项 --> <!-- Excel必须包含的列 在Excel校验时使用 --> <add key="ExcelNeedColumn" value="构件名称,构件编码,砼等级"/> <!-- 最少构件编码数 不足时 在校验Excel时会提醒 --> <add key="MinCodeNum" value="5"/> <!-- 最小行高 不足时 在校验Excel时会提醒 --> <add key="MinRowHeight" value="200"/> <!-- 是否校验 Excel的构件编码 是否存在 --> <add key="CheckCodeExist" value="false"/> </appSettings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/> </startup> <system.data> <DbProviderFactories> <remove invariant="Oracle.ManagedDataAccess.Client"/> <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.122.19.1, Culture=neutral, PublicKeyToken=89b483f429c47342"/> </DbProviderFactories> </system.data> <!--<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <publisherPolicy apply="no"/> <assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral"/> <bindingRedirect oldVersion="4.121.0.0 - 4.65535.65535.65535" newVersion="4.122.19.1"/> </dependentAssembly> </assemblyBinding> </runtime>--> <!--<oracle.manageddataaccess.client> <version number="*"> <dataSources> <dataSource alias="SampleDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL))) "/> </dataSources> </version> </oracle.manageddataaccess.client>--> </configuration>
以上是关于C# 导入Excel的主要内容,如果未能解决你的问题,请参考以下文章