• 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>

    Excel格式1:

     Excel格式2:

  • 相关阅读:
    关于隐藏UITabBarController和UINavigationController
    Google地图根据地址查询经纬度坐标
    领域驱动设计
    MFMessageComposeViewController
    关于什么时候使用NMock
    博客园现代化建设—[Entity Framework]在LINQ查询中指定返回的字段
    真相大白:为什么Entity Framework不能进行跨数据库查询(附解决方法)
    新问题新方法:在Entity Framework中实现指定字段更新
    分享我对领域驱动设计(DDD)的学习成果
    (转)js去空格
  • 原文地址:https://www.cnblogs.com/guxingy/p/11362870.html
Copyright © 2020-2023  润新知