设为首页 收藏本站
查看: 947|回复: 0

[经验分享] Sharepoint列表数据导入导出工具(支持查阅项及用户类型)

[复制链接]
发表于 2015-9-25 13:41:16 | 显示全部楼层 |阅读模式
  基于.NET客户端对象模型。主要思路:获取选择的列表,读取列表字段,选择需要导出或导入的字段,导出(循环选择的字段动态产生CAML查询语句查出数据存放到GridView中,然后读取数据到Excel),导入数据(读取Excel数据到GridView,循环GridView数据给选择的需要导入的字段赋值)  DSC0000.jpg
  主要代码:
  1.加载Lists


DSC0001.gif DSC0002.gif


1 private void btnLoadLists_Click(object sender, EventArgs e)
2         {
3             string spUrl = this.tbxUrl.Text.Trim();
4             string domain = tbxDomain.Text.Trim();
5             string uname = tbxUserName.Text.Trim();
6             string pwd = tbxPasswod.Text.Trim();
7
8             lbxLists.Items.Clear();
9             var spContext = new ClientContext(spUrl);
10             var w = spContext.Web;
11             var cc = new NetworkCredential(uname, pwd, domain);
12             spContext.Credentials = cc;
13             var lts = spContext.LoadQuery(w.Lists);
14             spContext.ExecuteQuery();
15             foreach (var lt in lts)
16             {
17                 if (cbxHidden.Checked)
18                 {
19                     lbxLists.Items.Add(lt.Title);
20                 }
21                 else
22                 {
23                     if (!lt.Hidden)
24                     {
25                         lbxLists.Items.Add(lt.Title);
26                     }
27                 }
28             }
29             //MessageBox.Show(@"list加载完毕");
30         }
加载Lists  2.加载选择的lists字段





1 private void btnLoadField_Click(object sender, EventArgs e)
2         {
3             string spUrl = this.tbxUrl.Text.Trim();
4             string domain = tbxDomain.Text.Trim();
5             string uname = tbxUserName.Text.Trim();
6             string pwd = tbxPasswod.Text.Trim();
7
8             string listTitle = lbxLists.SelectedItem.ToString();
9             if (!string.IsNullOrEmpty(listTitle))
10             {
11                 cklbFields.Items.Clear();
12                 var spContext = new ClientContext(spUrl);
13                 Web w = spContext.Web;
14                 var cc = new NetworkCredential(uname, pwd, domain);
15                 spContext.Credentials = cc;
16                 var listFields = spContext.LoadQuery(w.Lists.GetByTitle(listTitle).Fields);
17                 spContext.ExecuteQuery();
18                 foreach (var field in listFields)
19                 {
20                     string fdInfo = field.Title + "@" + field.InternalName + "@" + field.TypeAsString;//Field:显示名称@内部名称@字段类型
21                     if (field.TypeAsString.Contains("ook"))
22                     {
23                         FieldLookup lvValue = field as FieldLookup;
24                         if (lvValue != null)
25                         {
26                             string listId = lvValue.LookupList;
27                             fdInfo += "@" + listId + "@" + lvValue.LookupField;//Field:显示名称@内部名称@字段类型@查阅项源list GUID@查阅项源字段内部名称
28                         }
29                     }
30                     if (cbxHidden.Checked)
31                     {
32                         cklbFields.Items.Add(fdInfo);
33                     }
34                     else
35                     {
36                         if (!field.Hidden)
37                         {
38                             cklbFields.Items.Add(fdInfo);
39                         }
40                     }
41                 }
42                 // MessageBox.Show(@"Field加载完毕");
43             }
44             else
45             {
46                 MessageBox.Show(@"为选择列表名称");
47             }
48
49         }
加载Fields  3.读取所选字段list数据至GridView





  1 private void btnGetData_Click(object sender, EventArgs e)
  2         {
  3             string spUrl = this.tbxUrl.Text.Trim();
  4             string domain = tbxDomain.Text.Trim();
  5             string uname = tbxUserName.Text.Trim();
  6             string pwd = tbxPasswod.Text.Trim();
  7
  8             var spContext = new ClientContext(spUrl);
  9             Web w = spContext.Web;
10             var cc = new NetworkCredential(uname, pwd, domain);
11             spContext.Credentials = cc;
12             DataTable dt = Caml(spContext);
13             dgv1.DataSource = dt;
14         }
15
16 private DataTable Caml(ClientContext spContext)
17         {
18             var dt = new DataTable();
19             string caml = "";
20             if (cklbFields.CheckedItems.Count > 0)
21             {
22                 foreach (var item in cklbFields.CheckedItems)
23                 {
24
25                     string fieldName = item.ToString().Split('@')[1];
26                     dt.Columns.Add(item.ToString().Split('@')[0]);
27                     // string fieldType = item.ToString().Split('@')[2];
28                     caml += "<FieldRef Name='" + fieldName + "'/>";
29                 }
30                 caml = @"<View><ViewFields>" + caml + "</ViewFields></View>";
31
32             }
33
34             var spList = spContext.Web.Lists.GetByTitle(lbxLists.SelectedItem.ToString());
35             spContext.Load(spList);
36             spContext.ExecuteQuery();
37             if (spList != null && spList.ItemCount > 0)
38             {
39                 var camlQuery = new CamlQuery();
40                 camlQuery.ViewXml = caml;
41                 ListItemCollection listItems = spList.GetItems(camlQuery);
42                 spContext.Load(listItems);
43                 spContext.ExecuteQuery();
44
45                 foreach (var item in listItems)
46                 {
47                     DataRow dr = dt.NewRow();
48                     foreach (var fd in cklbFields.CheckedItems)
49                     {
50                         string fieldName = fd.ToString().Split('@')[1];
51                         string fieldType = fd.ToString().Split('@')[2];
52                         string fieldC = fd.ToString().Split('@')[0];
53                         if (fieldType.Contains("Look"))
54                         {
55                             #region LookUp
56                             var lkFieldLookup = item[fieldName] as FieldLookupValue;
57                             if (lkFieldLookup != null) dr[fieldC] = lkFieldLookup.LookupValue;
58                             #endregion
59                         }
60                         else if (fieldType == "User")
61                         {
62                             #region User
63                             var userValue = item[fieldName] as FieldUserValue;
64                             if (userValue != null) dr[fieldC] = userValue.LookupId + ";#" + userValue.LookupValue + ";";
65                             #endregion
66                         }
67                         else if (fieldType == "UserMulti")
68                         {
69                             #region UserMulti
70                             if (item.FieldValues[fieldName] != null)
71                             {
72                                 string usersStr = "";
73                                 var uv = item.FieldValues[fieldName] as FieldUserValue[];
74                                 if (uv != null)
75                                     foreach (var userValue in uv)
76                                     {
77                                         usersStr = userValue.LookupId + ";#" + userValue.LookupValue + ";";
78                                         //usersStr += userValue.LookupValue + "@";
79                                     }
80                                 dr[fieldC] = usersStr;
81                             }
82                             #endregion
83                         }
84                         else if (fieldType == "Choice")
85                         {
86                             #region Choice
87                             if (item.FieldValues[fieldName] != null) dr[fieldC] = item.FieldValues[fieldName].ToString();
88                             #endregion
89                         }
90                         else if (fieldType == "MultiChoice")
91                         {
92                             #region MultiChoice
93                             if (item.FieldValues[fieldName] != null)
94                             {
95                                 string choice = "";
96
97                                 var mcStrings = item.FieldValues[fieldName] as String[];
98                                 if (mcStrings != null)
99                                     foreach (var s in mcStrings)
100                                     {
101                                         choice += s + "@";
102                                     }
103                                 dr[fieldC] = choice;
104                             }
105                             #endregion
106                         }
107                         else if (fieldType == "URL")
108                         {
109                             #region URL
110                             var urlValue = item[fieldName] as FieldUrlValue;
111                             if (urlValue != null) dr[fieldC] = urlValue.Url + "@" + urlValue.Description;
112                             #endregion
113                         }
114                         else
115                         {
116                             if (item[fieldName] != null) dr[fieldC] = item[fieldName].ToString();
117                         }
118                     }
119                     dt.Rows.Add(dr);
120                 }
121             }
122
123             return dt;
124         }
读取数据  4.读取GridView数据导入到list





  1 private void btnImportExcel_Click(object sender, EventArgs e)
  2         {
  3             string spUrl = this.tbxUrl.Text.Trim();
  4             string domain = tbxDomain.Text.Trim();
  5             string uname = tbxUserName.Text.Trim();
  6             string pwd = tbxPasswod.Text.Trim();
  7             string listName = lbxLists.SelectedItem.ToString();
  8             bool checking = true;
  9             #region 检查数据是否一致
10             string[] column = new string[dgv1.ColumnCount];
11             string[] fieldName = new string[dgv1.ColumnCount];
12             if (dgv1.ColumnCount == cklbFields.CheckedItems.Count)
13             {
14                 for (int i = 0; i < dgv1.ColumnCount; i++)
15                 {
16                     string t1 = dgv1.Columns.Name;
17                     //string t2 = t1.Split('@')[0].Trim();
18                     column = t1;
19                 }
20                 for (int j = 0; j < cklbFields.CheckedItems.Count; j++)
21                 {
22                     fieldName[j] = cklbFields.CheckedItems[j].ToString().Split('@')[0].Trim();
23                 }
24                 foreach (var s1 in column)
25                 {
26                     checking = fieldName.Contains(s1);
27                 }
28             }
29             else
30             {
31                 checking = false;
32
33             }
34             #endregion
35
36             if (checking)
37             {
38                 var spContext = new ClientContext(spUrl);
39                 Web w = spContext.Web;
40                 var cc = new NetworkCredential(uname, pwd, domain);
41                 spContext.Credentials = cc;
42                 var spList = spContext.Web.Lists.GetByTitle(listName);
43                 spContext.Load(spList);
44                 spContext.ExecuteQuery();
45
46                 var itemCreateInfo = new ListItemCreationInformation();
47                 for (int i = 0; i < dgv1.Rows.Count - 1; i++)
48                 {
49                     ListItem newItem = spList.AddItem(itemCreateInfo);
50
51                     var lookupField = new ArrayList();
52                     var lpField = new ArrayList();//字段名
53                     var disvalue = new ArrayList();
54                     var listId = new ArrayList();
55
56                     var userInField = new ArrayList();
57                     var userValue = new ArrayList();
58
59                     foreach (var s in cklbFields.CheckedItems)
60                     {
61                         string inName = s.ToString().Split('@')[1];//内部名称
62                         string disName = s.ToString().Split('@')[0];//显示名称
63                         string fieldType = s.ToString().Split('@')[2];//字段类型
64                         var dataGridViewColumn = dgv1.Columns[disName];
65                         int index = dataGridViewColumn.Index;
66                         string value = dgv1[index, i].Value.ToString();
67                         #region MyRegion
68                         if (!string.IsNullOrEmpty(value))
69                         {
70                             if (fieldType.Contains("Look"))
71                             {
72                                 #region Lookup
73                                 string tid = s.ToString().Split('@')[3];
74                                 string fd = s.ToString().Split('@')[4];//outlookfield
75                                 lpField.Add(inName);
76                                 lookupField.Add(fd);
77                                 disvalue.Add(value);
78                                 listId.Add(tid);
79                                 #endregion
80                             }
81                             else if (fieldType == "User")
82                             {
83                                 #region User
84                                 userInField.Add(inName);
85                                 userValue.Add(value);
86                                 //http://stackoverflow.com/questions/9406018/add-users-to-usermulti-field-type-using-client-object-model
87                                 #endregion
88                             }
89                             else if (fieldType == "UserMulti")
90                             {
91                                 #region UserMulti
92                                 userInField.Add(inName);
93                                 userValue.Add(value);
94                                 #endregion
95                             }
96                             else if (fieldType == "Choice")
97                             {
98                                 newItem[inName] = value;
99                             }
100                             else if (fieldType == "MultiChoice")
101                             {
102                                 #region MultiChoice
103                                 var t = new string[value.Split('@').Count()];
104                                 int tc = 0;
105                                 for (int k = 0; k < value.Split('@').Count(); k++)
106                                 {
107                                     if (!string.IsNullOrEmpty(value.Split('@')[k]))
108                                     {
109                                         tc += 1;
110                                         t[k] = value.Split('@')[k];
111                                     }
112                                 }
113                                 var tcc = new string[tc];
114                                 for (int j = 0; j < t.Length - 1; j++)
115                                 {
116                                     if (t[j] != null)
117                                     {
118                                         tcc[j] = t[j];
119                                     }
120                                 }
121                                 newItem[inName] = tcc.Count() > 0 ? tcc : null;
122                                 //http://www.learningsharepoint.com/2010/11/21/get-values-from-multichoice-column-client-object-model-sharepoint-2010/
123                                 #endregion
124                             }
125                             else if (fieldType == "URL")
126                             {
127                                 #region URL
128                                 var fv = new FieldUrlValue();
129                                 fv.Url = value.Split('@')[0];
130                                 fv.Description = value.Split('@')[1];
131                                 newItem[inName] = fv;
132                                 #endregion
133                             }
134                             else
135                             {
136                                 newItem[inName] = value;
137                             }
138
139                         }
140                         #endregion
141                     }
142                     newItem.Update();
143                     spContext.ExecuteQuery();
144
145                     #region Update 查阅项与用户字段
146                     if (lpField.Count > 0 || userInField.Count > 0)
147                     {
148                         int ltId = newItem.Id;
149                         ListItem updateItem = spList.GetItemById(ltId);
150                         if (lpField.Count > 0)
151                         {
152                             for (int j = 0; j < lookupField.Count; j++)
153                             {
154                                 string lpf = lpField[j].ToString();
155                                 string c = lookupField[j].ToString();
156                                 string dv = disvalue[j].ToString();
157                                 string ttId = listId[j].ToString();
158                                 string v = Getlookup(spContext, ttId, c, dv);
159                                 updateItem[lpf] = v;
160                             }
161                         }
162                         if (userInField.Count > 0)
163                         {
164                             for (int j = 0; j < userInField.Count; j++)
165                             {
166                                 string inName = userInField[j].ToString();
167                                 string uv = userValue[j].ToString();
168                                 updateItem[inName] = uv;
169                             }
170                         }
171                         updateItem.Update();
172                         spContext.ExecuteQuery();
173                     }
174                     #endregion
175
176
177                 }
178                 MessageBox.Show(@"导入完毕!");
179             }
180             else
181             {
182                 MessageBox.Show(@"Excel数据列数与选择的字段数不一致");
183             }
184
185         }
186
187 /// <summary>
188         /// 取得查域项值
189         /// </summary>
190         /// <param name="ctxClientContext">客户端上下文对象</param>
191         /// <param name="listId">列表ID</param>
192         /// <param name="fd">查域项字段</param>
193         /// <param name="lookupValue">查域项Value</param>
194         /// <returns></returns>
195         private static string Getlookup(ClientContext ctxClientContext, string listId, string fd, string lookupValue)
196         {
197             string lookup = "";
198             List toList = ctxClientContext.Web.Lists.GetById(new Guid(listId));
199             ctxClientContext.Load(toList);
200             ctxClientContext.ExecuteQuery();
201             CamlQuery cqQuery = new CamlQuery();
202             cqQuery.ViewXml = @"<View>  
203             <Query>
204                <Where><Eq><FieldRef Name='" + fd + @"' /><Value Type='Text'>" + lookupValue + @"</Value></Eq></Where>
205             </Query>
206       </View>";
207             ListItemCollection ltcCollection = toList.GetItems(cqQuery);
208             ctxClientContext.Load(ltcCollection);
209             ctxClientContext.ExecuteQuery();
210             if (ltcCollection.Count > 0)
211             {
212                 ListItem im = ltcCollection[0];
213                 lookup = im.Id.ToString(CultureInfo.InvariantCulture);
214             }
215             return lookup + ";#" + lookupValue+";";
216         }
读取GridView数据至List  导入思路:
  1.检查GridView字段数及字段名称与所选List字段显示名称是否一致;
  2.循环GridView行数据,循环Row数据中的Column给所选List字段相应字段赋值;
  3.赋值过程是首先通过新增的方式给非查域项及人员类型的字段赋值,接下来通过ID获取到刚才新增的列表项,以更新该列表项给查域项及人员类型赋值(可更改创建人修改者值);
  遇到的问题:
  1.直接以新增的方式给查域项及人员类型赋值,其他字段的值都会变成null,只有查域项或人员类型存在值;
  2.当人员类型为允许多选时,赋值报错。赋值方式为:item[user]="20;#张三;21;#李四;";
  3.导入数据效率不太高,尤其在包含查阅项或人员类型的情况下,如果数据量特别大可以考虑多线程解决.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-118757-1-1.html 上篇帖子: SharePoint 2013 App Remote Event Receivers 下篇帖子: 向SharePoint 2010中添加Permission Level,Group,以及相应的User
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表