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的主要内容,如果未能解决你的问题,请参考以下文章

C# winform 中如何导入Excel

用C#做Excel文件导入SQL不成功

C#导入导出数据到Excel的通用类代码

c# 导入导出excel表格式

c# WINFORM 导入EXCEL数据覆盖问题

转 (C#)利用Aspose.Cells组件导入导出excel文件