Ejemplo n.º 1
0
        private ExportConfigInfo readExcelInfo(XmlDocument document, string id)
        {
            // =========================================================
            // 讀取設定資訊
            // =========================================================
            XmlNode excelNode =
                document.SelectSingleNode(
                    "//" + Constant.ELEMENT_EXCEL +
                    "[@" + Constant.ATTRIBUTE_ID + "=\"" + id + "\"]");

            if (excelNode == null)
            {
                throw new ExcelOperateException("設定資訊:[" + id + "] 不存在!");
            }

            // =========================================================
            // 讀取 excelInfo
            // =========================================================
            var exportConfigInfo = new ExportConfigInfo
            {
                Id        = ExcelStringUtil.GetNodeAttr(excelNode, Constant.ATTRIBUTE_ID),
                FileName  = ExcelStringUtil.GetNodeAttr(excelNode, Constant.ATTRIBUTE_FILENAME),
                PaperSize =
                    this.getPaperSize(
                        ExcelStringUtil.GetNodeAttr(excelNode, Constant.ATTRIBUTE_PAPERSIZE))
            };

            // =========================================================
            // 讀取 範圍 style 設定
            // =========================================================
            // 讀取 style node
            XmlNode styleNode = excelNode.SelectSingleNode(Constant.ELEMENT_STYLE);
            // 讀取屬性設定
            var styleInfo = new StyleInfo();

            styleInfo.readStyleAttr(styleNode);
            // 將未設定的屬性,設為系統預設值
            styleInfo.setEmptyAttrToSystemDefault();
            // 放入 excelInfo
            exportConfigInfo.StyleInfo = styleInfo;

            // =========================================================
            // 讀取 sheet 設定
            // =========================================================」
            XmlNodeList sheetNodeList = excelNode.SelectNodes(Constant.ELEMENT_SHEET);

            // 記錄已使用的 dataId
            var dataIdSet = new Dictionary <string, Boolean>();
            // 逐筆讀取
            var sheetList = new List <SheetlInfo>();

            if (sheetNodeList != null)
            {
                foreach (XmlNode sheetNode in sheetNodeList)
                {
                    // sheet 基本資訊
                    var sheetlInfo = new SheetlInfo
                    {
                        Id        = ExcelStringUtil.GetNodeAttr(sheetNode, Constant.ATTRIBUTE_ID),
                        SheetName = ExcelStringUtil.GetNodeAttr(sheetNode, Constant.ATTRIBUTE_SHEETNAME)
                    };

                    // sheet 以下的 part 設定
                    var partInfoMap = new Dictionary <string, object>();

                    // 取得Node list
                    XmlNodeList nodeList =
                        sheetNode.SelectNodes("(" + Constant.ELEMENT_CONTEXT + "|" + Constant.ELEMENT_DETAIL + ")");

                    // 解析 node 設定
                    for (int i = 0; i < nodeList.Count; i++)
                    {
                        // 取得 node
                        XmlNode partInfoNode = nodeList[i];
                        // 取得 dataId
                        if (partInfoNode.Attributes != null)
                        {
                            string dataId = ExcelStringUtil.GetNodeAttr(partInfoNode, Constant.ATTRIBUTE_DATAID);
                            // 檢核 dataId 不可重複
                            if (dataIdSet.ContainsKey(dataId))
                            {
                                throw new ExcelOperateException(
                                          " <sheet> 標籤下的 (context|detail) 標籤, dataId 不可重複! " +
                                          "[" + dataId + "] (取用 ExportDataSet 中資料時會造成異常)");
                            }
                            dataIdSet.Add(dataId, true);

                            // 依據標籤類型,進行解析
                            if (Constant.ELEMENT_CONTEXT.Equals(partInfoNode.Name))
                            {
                                var contextInfo = new ContextInfo();
                                contextInfo.DataId     = dataId;
                                contextInfo.TrInfoList = this.readContextInfo(partInfoNode);
                                partInfoMap.Add(partInfoNode.Name + "_" + i, contextInfo);
                            }
                            else if (Constant.ELEMENT_DETAIL.Equals(partInfoNode.Name))
                            {
                                var xmlNodeList = partInfoNode.SelectNodes(Constant.ELEMENT_COLUMN);
                                if (xmlNodeList != null && xmlNodeList.Count < 1)
                                {
                                    throw new ExcelOperateException("<detail> 標籤下, 不可無 <column> 設定!");
                                }
                                var detailInfo = new DetailInfo
                                {
                                    DataId         = dataId,
                                    ColumnInfoList = this.readDetailInfo(partInfoNode)
                                };
                                partInfoMap.Add(partInfoNode.Name + "_" + i, detailInfo);
                            }
                        }
                    }
                    //
                    sheetlInfo.PartInfoMap = partInfoMap;

                    // 放入List
                    sheetList.Add(sheetlInfo);
                }
            }
            // 放入 excelInfo
            exportConfigInfo.SheetList = sheetList;

            return(exportConfigInfo);
        }