表
表的創建腳本
CREATE TABLE [dbo].[TB_PROJECTS_New1]( [PROID] [decimal](10, 0) NOT NULL, [PROJECTNAME] [nvarchar](500) NULL, [PROJECTCODE] [nvarchar](100) NULL, [PARENTID] [decimal](10, 0) NULL, [NEXTID] [decimal](10, 0) NULL, [PROJECTORDER] [decimal](10, 0) NULL, [ISENABLED] [decimal](10, 0) NULL, [OWNERID] [decimal](10, 0) NULL, [CONSTRUCTIONID] [decimal](10, 0) NULL, [SUPERVISIONID] [decimal](10, 0) NULL, [CONTRACTID] [decimal](10, 0) NULL, [LEVEL] [decimal](10, 0) NULL, [QUANTITY] [decimal](10, 0) NULL, [VERSIONING] [nvarchar](max) NULL, [MILEAGENO] [nvarchar](100) NULL, [COMPONENTCODE] [varchar](255) NULL, [NCOMPONENTCODE] [varchar](255) NULL, [TASKSTATUS] [decimal](10, 0) NULL, [FBXID] [nvarchar](50) NULL, [ISSUBUNIT] [decimal](10, 0) NULL, [BIDSION] [varchar](10) NULL, [ProjectType] [nvarchar](max) NULL, [EquCode] [nvarchar](max) NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Excel的格式
導入后的樣子
數據庫的樣子:
導入需求:
節點從左到右,依次導入,樹的層級遞增。
不導入為空的單元格。
導入的列 從第一列 到 構件名稱(包含構件名稱)那列,其它列,不作為節點導入到數據庫。
構件編碼 作為 節點的屬性導入。構件編碼 做為 構件名稱那個節點(或者是構件編碼左邊的節點,有可能構件名稱為空) 的屬性 導入。
每個節點 都有一個屬性,屬性存Excel的列名
砼等級這列(包含砼等級這列),及右邊的所有列,不在導入數據的范圍內,跟導入數據沒有關系。
Excel的列名有時候會不對,或者很亂,但是構件編碼這列有,構件名稱可能會沒有,分部工程可能沒有,或者多了幾個分部工程(Excel列名肯定不會重復)
Excel需要做一些校驗,避免數據源錯誤
01、隱藏行、隱藏列、
02、行高不足(可配置)
03、列名強制校驗(必須包含指定列)
04、單元格為公式(配置項為不支持公式的情況)
05、構件編碼為空
06、構件編碼包含中文
07、構件編碼重復
08、構件編碼過少(可配置)
09、同行構件名稱重復
10、構件名稱重復
導入思路:
把Excel轉換為文本,
導入數據的時候,使用格式1的文本,
導入屬性 列名的時候,使用格式2的文本。
格式1
格式2
程序的配置參數截圖:
項目的結構:
導入時有一些算法的判斷,加快了導入的速度,也做了一些該有的緩存。
對性能影響比較大的一個算法:
比如,導入‘右幅A0-1#樁基砼澆築’節點的時候,不需要再對‘任河特大橋 右幅 下部結構 A0#橋台’ 這幾個節點進行判斷了,直接記錄與上一行不同的地方,用共用的parentId。
優化思路:
一開始是沒有注意性能的,數據一多,那個導入速度慢死,但是數據的正確性確實也是保證了的,后來就監控各個方法的執行效率,看哪些方法執行的次數多,占用的時間多,相應的優化該方法。
現在導入的數據可能有個10萬+吧
導入測試1:
導入的Excel: