客户端对象模型之Excel数据导入到列表

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script src="jquery-1.6.2.min.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#importbutton").attr("disabled", "disabled");
            ExecuteOrDelayUntilScriptLoaded(SearchExist, 'sp.js');
        })

        function SearchExist(itemId) {
            var projectId = getQueryString('ProjectID');
            if (projectId == null || projectId == 'null' || projectId == '') {
                alert("请通过项目信息来导入工作项!");
                return;
            }
            var siteUrl = _spPageContextInfo.webServerRelativeUrl;
            clientContext = new SP.ClientContext(siteUrl);
            oList = clientContext.get_web().get_lists().getByTitle('项目工作项');
            var camlQuery = new SP.CamlQuery();
            camlQuery.set_viewXml(
                        '<View><Query>' +
                        '<Where>' +
                            '<Eq>' +
                            '<FieldRef Name=\'Project\' LookupId=\'TRUE\'/><Value Type=\'Lookup\'>' + projectId + '</Value>' +
                            '</Eq>' +
                        '</Where></Query>' +
                        '</View>'
                    );

            this.collListItem = oList.getItems(camlQuery);
            clientContext.load(collListItem);
            clientContext.executeQueryAsync(
                Function.createDelegate(this, this.onSearchQuerySucceeded),
                Function.createDelegate(this, this.onSearchQueryFailed)
            );
        }

        function waring() {
            var filePath = $('input[type=file]').val();
            if (filePath == "") {
                alert('请先上传文件');
                return;
            }
            var fileText = filePath.substring(filePath.lastIndexOf("."), filePath.length);
            var fileName = fileText.toLowerCase();
            if ((fileName != '.xls')) {
                alert("对不起,系统仅支持上传97-2003格式的Excel文档");
                return;
            }
            else {
                $("#importbutton").attr("disabled", "disabled");
                getCount(filePath);
            }
        }
        function getCount(filePath) {
            var rs = null;
            var cn = null;
            try {
                cn = new ActiveXObject("ADODB.Connection");
                var strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " + filePath + ";Persist Security Info=False;Extended Properties=Excel 8.0;"
                cn.Open(strConn);
                rs = new ActiveXObject("ADODB.Recordset");
                var SQL = "select * from [Sheet1$]";
                rs.Open(SQL, cn);
                if (rs.bof) {
                    alert('没有可用的数据');
                    $("#importbutton").removeAttr("disabled");
                    return;
                }
            }
            catch (e) {
                alert("请确保是97-2003的Excel文档,并且已将本站点添加到ie的信任站点中,启用所有的ActiveX的安全设置。");
                $("#importbutton").removeAttr("disabled");
                return;

            }

            if (!rs.bof) {

                importdata = new Map();
                hasrundata = new Array();
                datarelationship = new Map();
                dictionary = new Map();
                errorlog = new Map();
                total = 0;
                $("#importLog").html("");
                rs.MoveFirst()
                while (!rs.eof) {
                    var task = new Array();
                    var title = rs.fields(0).value.trim();
                    if (title != null && title != 'null' && title != '') {
                        total++;
                        for (var i = 0; i != rs.fields.count; ++i) {
                            try {
                                task[i] = rs.fields(i).value.trim();
                            } catch (e) {
                                task[i] = rs.fields(i).value;
                            }
                        }
                        if (!dictionary.ContainsKey(title) && !existData.ContainsKey(title)) {
                            dictionary.set(title, task);
                        }
                        else {
                            var messagespan = document.createElement("span");
                            $(messagespan).html("工作项[<span style='font-weight:bold;'>" + title + '</span>]名称重复,取消导入');
                            $(messagespan).addClass("spanerror");
                            var br = document.createElement("br");
                            $(messagespan).appendTo($("#importLog"));
                            $(br).appendTo($("#importLog"));
                        }
                    }
                    rs.MoveNext();
                }
            }
            rs.Close();
            cn.Close();
            success = 0;
            error = 0;
            $("#importLog").html();
            for (var i = 0; i < dictionary.size() ; i++) {
                var arr = dictionary.get(dictionary.keys[i]);
                dataAnalysis(dictionary.keys[i], arr);
            }
            setTimeout(setsummarymessage, 3000);
        }
        function dataAnalysis(title, arr) {
            title = title.trim();
            if (arr != null && arr != '' && arr != 'null')//说明用户的Excel中是存在这个任务的
            {
                if (title == arr[4] || title == arr[5]) {
                    GetErrors(title);
                    return;
                }
                if (!checktasktitleran(title)) {
                    //当条目的父级任务和前置任务都为空的时候,直接将条目加到新的集合中
                    if ((arr[4] == null || arr[4] == '' || arr[4] == 'null') && (arr[5] == null || arr[5] == '' || arr[5] == 'null')) {
                        hasrundata[hasrundata.length] = title;
                        createListItem(arr);
                    }//前置任务为空,父级任务不为空的时候
                    else if ((arr[4] == null || arr[4] == '' || arr[4] == 'null') && (arr[5] != null && arr[5] != '' && arr[5] != 'null')) {
                        if (datarelationship.ContainsKey(arr[5])) {
                            var backdata = datarelationship.get(arr[5]);
                            if (!backdata.ContainsKey(title)) {
                                backdata.set(title, title);
                                datarelationship.set(arr[5], backdata);
                            }
                        }
                        else {
                            var backdata = new Map();
                            backdata.set(title, title);
                            datarelationship.set(arr[5], backdata);
                        }
                        if (!existData.ContainsKey(arr[5])) {
                            if (!dictionary.ContainsKey(arr[5])) {
                                GetErrors(title);
                            }
                            if (errorlog.ContainsKey(arr[5])) {
                                GetErrors(title);
                            }
                        }
                        else {
                            hasrundata[hasrundata.length] = title;
                            createListItem(arr);
                        }
                    }//父级任务任务为空,前置任务不为空的时候
                    else if ((arr[5] == null || arr[5] == '' || arr[5] == 'null') && (arr[4] != null && arr[4] != '' && arr[4] != 'null')) {
                        if (datarelationship.ContainsKey(arr[4])) {
                            var backdata = datarelationship.get(arr[4]);
                            if (!backdata.ContainsKey(title)) {
                                backdata.set(title, title);
                                datarelationship.set(arr[4], backdata);
                            }
                        }
                        else {
                            var backdata = new Map();
                            backdata.set(title, title);
                            datarelationship.set(arr[4], backdata);
                        }
                        if (!existData.ContainsKey(arr[4])) {
                            if (!dictionary.ContainsKey(arr[4])) {
                                GetErrors(title);
                            }
                            if (errorlog.ContainsKey(arr[4])) {
                                GetErrors(title);
                            }

                        }
                        else {
                            hasrundata[hasrundata.length] = title;
                            createListItem(arr);
                        }
                    }//父级任务和前置任务都不为空的时候
                    else if ((arr[5] != null && arr[5] != '' && arr[5] != 'null') && (arr[4] != null && arr[4] != '' && arr[4] != 'null')) {
                        if (datarelationship.ContainsKey(arr[4])) {
                            var backdata = datarelationship.get(arr[4]);
                            if (!backdata.ContainsKey(title)) {
                                backdata.set(title, title);
                                datarelationship.set(arr[4], backdata);
                            }
                        }
                        else {
                            var backdata = new Map();
                            backdata.set(title, title);
                            datarelationship.set(arr[4], backdata);
                        }
                        if (datarelationship.ContainsKey(arr[5])) {
                            var backdata = datarelationship.get(arr[5]);
                            if (!backdata.ContainsKey(title)) {
                                backdata.set(title, title);
                                datarelationship.set(arr[5], backdata);
                            }
                        }
                        else {
                            var backdata = new Map();
                            backdata.set(title, title);
                            datarelationship.set(arr[5], backdata);
                        }
                        if (existData.ContainsKey(arr[4]) && existData.ContainsKey(arr[5])) {
                            hasrundata[hasrundata.length] = title;
                            createListItem(arr);
                        }
                        else {
                            var flagtemp = false;
                            var flagtemp1 = false;
                            if (!existData.ContainsKey(arr[4])) {
                                if (!dictionary.ContainsKey(arr[4])) {
                                    flagtemp = true;
                                }
                                if (errorlog.ContainsKey(arr[4])) {
                                    flagtemp1 = true;
                                }
                            }
                            if (!existData.ContainsKey(arr[5])) {
                                if (!dictionary.ContainsKey(arr[5])) {
                                    flagtemp = true;
                                }
                                if (errorlog.ContainsKey(arr[5])) {
                                    flagtemp1 = true;
                                }

                            }
                            if (flagtemp) {
                                GetErrors(title);
                            }
                            if (flagtemp1) {
                                GetErrors(title);
                            }
                        }
                    }
                }

            }
        }
        function GetErrors(errortitle) {
            if (!errorlog.ContainsKey(errortitle)) {
                var messagespan = document.createElement("span");
                $(messagespan).html("工作项[<span style='font-weight:bold;'>" + errortitle + '</span>]导入失败');
                $(messagespan).addClass("spanerror");
                var br = document.createElement("br");
                $(messagespan).appendTo($("#importLog"));
                $(br).appendTo($("#importLog"));
                error++;
                errorlog.set(errortitle, 1);
            }
            if (datarelationship.ContainsKey(errortitle)) {
                var backdata = datarelationship.get(errortitle);
                for (var i = 0; i < backdata.size() ; i++) {
                    GetErrors(backdata.keys[i]);
                }
            }
        }
        function checktasktitleran(tasktitle) {
            for (var i = 0; i < hasrundata.length; i++) {
                if (hasrundata[i] == tasktitle) {
                    return true;
                }
            }
            return false;
        }
        function createListItem(task) {
            var itemCreateInfo = new SP.ListItemCreationInformation();
            var oListItem = oList.addItem(itemCreateInfo);
            oListItem.set_item('Title', task[0].trim());
            var startdate = new Date(task[1]);
            var enddate = new Date(task[2]);
            if (startdate > enddate) {
                GetErrors(task[0].trim());
                return;
            }
            oListItem.set_item('StartDate', startdate.getFullYear() + '/' + (startdate.getMonth() + 1) + '/' + startdate.getDate());
            oListItem.set_item('DueDate', enddate.getFullYear() + '/' + (enddate.getMonth() + 1) + '/' + enddate.getDate());

            var users = new Array();
            users.push(SP.FieldUserValue.fromUser(task[3]));
            oListItem.set_item('AssignedTo', users);
            if (task[4] != null && task[4] != '' && task[4] != 'null') {
                if (existData.ContainsKey(task[4])) {
                    oListItem.set_item('ParentTask', existData.get(task[4]));
                    oListItem.set_item('ParentID', existData.get(task[4]));
                }
                else {
                    var parentarr = dictionary.get(task[4]);
                    dataAnalysis(task[4], parentarr);
                    return;
                }
            }
            if (task[5] != null && task[5] != '' && task[5] != 'null') {
                if (existData.ContainsKey(task[5])) {
                    oListItem.set_item('Predecessors', existData.get(task[5]));
                }
                else {
                    var parentarr = dictionary.get(task[5]);
                    dataAnalysis(task[5], parentarr);
                    return;
                }
            }
            oListItem.set_item('RelationshipType', task[6]);
            oListItem.set_item('Project', getQueryString('projectId'));
            oListItem.set_item('Status', task[7]);
            oListItem.set_item('TaskLevel', task[8]);
            if (!existData.ContainsKey(task[0].trim())) {
                oListItem.update();
                clientContext.load(oListItem);
                clientContext.executeQueryAsync(
                function () {
                    var Title = oListItem.get_item('Title');
                    if (!existData.ContainsKey(Title)) {
                        existData.set(Title, oListItem.get_id());
                    }
                    var messagespan = document.createElement("span");
                    $(messagespan).html("工作项[<span style='font-weight:bold;'>" + Title + '</span>]导入成功');
                    $(messagespan).addClass("spansuccess");
                    var br = document.createElement("br");
                    $(messagespan).appendTo($("#importLog"));
                    $(br).appendTo($("#importLog"));
                    success++;
                    if (datarelationship.ContainsKey(Title)) {
                        var backdata = datarelationship.get(Title);
                        for (var i = 0; i < backdata.size() ; i++) {
                            if (!importdata.ContainsKey(backdata.keys[i])) {
                                var childtitle = backdata.get(backdata.keys[i]);
                                var arr = dictionary.get(childtitle);
                                dataAnalysis(backdata.keys[i], arr);
                            }
                        }
                    }
                },
                function () {
                    var Title = oListItem.get_item('Title');

                    GetErrors(Title);
                });
            }
        }

        function Map() {
            this.keys = new Array();
            this.data = new Array();
            //添加键值对
            this.set = function (key, value) {
                if (this.data[key] == null) {//如键不存在则身【键】数组添加键名
                    this.keys.push(key);
                }
                this.data[key] = value;//给键赋值
            };
            //获取键对应的值
            this.get = function (key) {
                return this.data[key];
            };
            //去除键值,(去除键数据中的键名及对应的值)
            this.remove = function (key) {
                this.keys.remove(key);
                this.data[key] = null;
            };
            //判断键值元素是否为空
            this.isEmpty = function () {
                return this.keys.length == 0;
            };
            //获取键值元素大小
            this.size = function () {
                return this.keys.length;
            };
            this.ContainsKey = function (key) {
                if (this.data[key] == null) {//如键不存在则身【键】数组添加键名
                    return false;
                }
                else {
                    return true;
                }
            }
        }
        function setsummarymessage() {
            if (success + error == dictionary.size()) {
                var summary = document.createElement("span");
                $(summary).text('导入结果:');
                $(summary).addClass("spansuccess");
                var totalspan = document.createElement("span");
                $(totalspan).text('        共:' + total);
                $(totalspan).addClass("spantotal");
                var successspan = document.createElement("span");
                $(successspan).text('        成功:' + success);
                $(successspan).addClass("spansuccess");
                var errorspan = document.createElement("span");
                $(errorspan).text('        失败:' + error);
                $(errorspan).addClass("spanerror");
                var cancelspan = document.createElement("span");
                $(cancelspan).text('        取消:' + (total - dictionary.size()));
                $(cancelspan).addClass("spancancel");

                $(summary).appendTo($("#importLog"));
                $(totalspan).appendTo($("#importLog"));
                $(successspan).appendTo($("#importLog"));
                $(errorspan).appendTo($("#importLog"));
                $(cancelspan).appendTo($("#importLog"));
                alert("导入完成!");
                $("#importbutton").removeAttr("disabled");
                $("#gottaskpage").show();
                $('input[type=file]').val("");

            }
            else {
                setTimeout(setsummarymessage, 3000);
            }
        }

        function getQueryString(name) {
            var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
            var r = window.location.search.substr(1).match(reg);
            if (r != null) return unescape(r[2]); return null;
        }
        function gototaskpage() {
            var url = _spPageContextInfo.webAbsoluteUrl + "/Lists/ProjectTasks/AllItems.aspx?FilterField1=Project%5Fx003a%5FID&FilterValue1=" + getQueryString('ProjectID');
            window.location.href = url;
        }

    </script>
</head>
<body>
    <input type="file" id="importExcel" name="import" />
    <input type="button" id="importbutton" value="导入" onclick="waring()" />
    <input type="button" id="gottaskpage" style="display: none;" value="查看项目工作项" onclick="gototaskpage();" />
    <div id="importLog"></div>

</body>
</html>

 

posted @ 2014-03-24 17:41  美酒与歌  阅读(440)  评论(1编辑  收藏  举报