Ejemplo n.º 1
0
        /// <summary>
        /// 获取模版结构
        /// </summary>
        /// <param name="fileId"></param>
        /// <returns></returns>
        public ImportTemplateStructure GetStructure()
        {
            ImportTemplateStructure struc = new ImportTemplateStructure();

            // 解析列节点
            foreach (ExcelCell tec in ExcelCellList)
            {
                ImportTemplateColumnNodeConfigProcessor tproc = new ImportTemplateColumnNodeConfigProcessor();
                ImportTemplateColumnNode tnode = tproc.GetObject(tec.Comment);

                if (tnode != null)
                {
                    if (!tnode.ValueColumnIndex.HasValue)
                    {
                        tnode.ValueColumnIndex = tec.ColumnIndex;
                    }

                    if (!tnode.ValueRowIndex.HasValue)
                    {
                        tnode.ValueRowIndex = tec.RowIndex;
                    }

                    if (struc.DefaultGroup.ColumnNodeList.Count(tent => tent.ColumnName == tnode.ColumnName) <= 0)
                    {
                        struc.DefaultGroup.ColumnNodeList.Add(tnode);
                    }
                    else
                    {
                        throw new Exception("不合法模版:模版中存在同名数据列“" + tnode.ColumnName + "”。");
                    }
                }
            }

            // 解析命令节点
            foreach (ExcelCell tec in ExcelCellList)
            {
                ImportTemplateCommandNodeConfigProcessor tproc = new ImportTemplateCommandNodeConfigProcessor();
                ImportTemplateCommandNode tnode = tproc.GetObject(tec.Comment);

                if (tnode != null)
                {
                    tnode.ColumnIndex = tec.ColumnIndex;
                    tnode.RowIndex    = tec.RowIndex;

                    struc.DefaultGroup.CommandNodeList.Add(tnode);
                }
            }

            // 解析属性节点
            foreach (ExcelCell tec in ExcelCellList)
            {
                ImportTemplatePropertyNodeConfigProcessor tproc = new ImportTemplatePropertyNodeConfigProcessor();
                ImportTemplatePropertyNode tnode = tproc.GetObject(tec.Comment);

                if (tnode != null)
                {
                    struc.DefaultGroup.PropertyNodeList.Add(tnode);
                }
            }

            return(struc);
        }
        /// <summary>
        /// 获取根据blockSize获取DataTable列表
        /// </summary>
        /// <param name="struc">模版结构</param>
        /// <param name="filePath">文件路径</param>
        /// <param name="blockSize">每个DataTable最大大小</param>
        /// <returns></returns>
        public static IList <DataTable> GetDataTableList(ImportTemplateStructure struc, string filePath, int blockSize)
        {
            if (blockSize <= 0)
            {
                blockSize = 1000;   // 默认一次性处理1000行
            }

            ImportTemplateCommandNode itcnBegin = struc.DefaultGroup.CommandNodeList.First(tent => tent.CommandCode == ImportTemplateCommandCode.Begin);
            ImportTemplateCommandNode itcnEnd   = struc.DefaultGroup.CommandNodeList.First(tent => tent.CommandCode == ImportTemplateCommandCode.End);

            IList <DataTable> dtList = new List <DataTable>();

            DataSet ds = new DataSet();

            using (ExcelProcessor processor = ExcelService.GetProcessor(filePath))
            {
                ds = processor.GetDataSet();
            }

            DataTable dt = ds.Tables[0];

            IList <ImportTemplateColumnNode> ccnodes = struc.DefaultGroup.GetCommonColumnNodeList();

            // 设置公用数据列默认值
            foreach (ImportTemplateColumnNode tnode in ccnodes)
            {
                // 行第一个“-1”DataSet从第二行开始,行第二个“-1”,列第一个“-1”数组从0开始
                tnode.DefaultValue = dt.Rows[tnode.ValueRowIndex.Value - 2][tnode.ValueColumnIndex.Value - 1];
            }

            IList <ImportTemplateColumnNode> ocnodes = struc.DefaultGroup.GetOrdinaireColumnNodeList();

            int startRowIndex = itcnBegin.RowIndex;
            int endRowIndex   = itcnEnd.RowIndex;

            int startColumnIndex = itcnBegin.ColumnIndex;
            int endColumnIndex   = itcnEnd.ColumnIndex;

            if (itcnBegin.RowIndex == itcnEnd.RowIndex)
            {
                // DataSet从第二行开始这里需要+1
                endRowIndex = dt.Rows.Count + 1;
            }

            DataTable tdt = null;

            for (int i = startRowIndex; i <= endRowIndex; i++)
            {
                if ((i - startRowIndex) % blockSize == 0)
                {
                    tdt = struc.DefaultGroup.GetDataTableSchema();
                    dtList.Add(tdt);
                }

                DataRow drow = tdt.NewRow();

                bool emptyflag = true;

                for (int j = startColumnIndex; j <= endColumnIndex; j++)
                {
                    ImportTemplateColumnNode tnode = ocnodes.First(tent => (tent.ValueColumnIndex) == j);

                    if (tnode != null)
                    {
                        object tval = dt.Rows[(i - 2)][(j - 1)];

                        if (tval != null && tval.ToString().Trim() != String.Empty)
                        {
                            emptyflag = false;
                        }

                        tval = (tval != null ? tval : tnode.DefaultValue);

                        drow[tnode.ColumnName] = tval;
                    }
                }

                // 当前行为空行,这跳过执行
                if (emptyflag == true)
                {
                    continue;
                }

                // 设置公共列值
                foreach (ImportTemplateColumnNode tnode in ccnodes)
                {
                    drow[tnode.ColumnName] = tnode.DefaultValue;
                }

                tdt.Rows.Add(drow);
            }

            return(dtList);
        }