Sharepoint列表数据导入导出工具(支持查阅项及用户类型)

  基于.NET客户端对象模型。主要思路:获取选择的列表,读取列表字段,选择需要导出或导入的字段,导出(循环选择的字段动态产生CAML查询语句查出数据存放到GridView中,然后读取数据到Excel),导入数据(读取Excel数据到GridView,循环GridView数据给选择的需要导入的字段赋值) 

  主要代码:

1.加载Lists

 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 [email protected]查阅项源字段内部名称
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[i].Name;
 17                     //string t2 = t1.Split(‘@‘)[0].Trim();
 18                     column[i] = 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.导入数据效率不太高,尤其在包含查阅项或人员类型的情况下,如果数据量特别大可以考虑多线程解决.

时间: 2024-11-10 01:10:19

Sharepoint列表数据导入导出工具(支持查阅项及用户类型)的相关文章

HData——ETL 数据导入/导出工具

HData是一个异构的ETL数据导入/导出工具,致力于使用一个工具解决不同数据源(JDBC.Hive.HDFS.HBase.MongoDB.FTP.Http.CSV.Excel.Kafka等)之间数据交换的问题.HData在设计上同时参考了开源的Sqoop.DataX,却与之有不同的实现.HData采用“框架+插件”的结构,具有较好的扩展性,框架相当于数据缓冲区,插件则为访问不同的数据源提供实现. [HData特性] 1.异构数据源之间高速数据传输: 2.跨平台独立运行: 3.数据传输过程全内存

MySQL多线程数据导入导出工具Mydumper

http://afei2.sinaapp.com/?p=456 今天在线上使用mysqldump将数据表从一个库导入到另外一个库,结果速度特别慢,印象中有个多线程的数据导入导出工具Mydumper,于是简单的调查和测试一下. 下午导数据的过程中,这个表是没有更新的,因此不需要确保多个数据之间的一致性,就简单的写个shell脚本启动多个mysqldumper来导数据,这样有几个问题: 需要处理表数据大小不均匀的问题,有的会很快结束,有的会比较慢. 如果需要保证多个导出之间的一致性时,则无法保证.

Oracle exp/imp数据导入导出工具基本用法

一.获取帮助 exp/imp help=y 二.数据导出 1.将数据库完全导出,设置full选项exp system/[email protected] file=d:\db.dmp full=y 2.导出数据库结构,不导出数据,设置rows选项exp system/[email protected] file=d:\db.dmp rows=n full=y 3.当导出数据量较大时,可以分成多个文件导出,设置filesize选项exp system/[email protected] file=

PLSQL_数据泵Datapump导入导出数据IMPDP / EXPDP(概念)(Oracle数据导入导出工具)

2014-08-31 BaoXinjian 一.摘要 在平常备库和数据库迁移的时候,当遇到大的数据库的时候在用exp的时候往往是需要好几个小时,耗费大量时间.oracle10g以后可以用expdp来导出数据库花费的时间要远小于exp花费的时间,而且文件也要小很多. 二.exp/imp与expdp/impdp区别 (1) 把用户usera的对象导到用户userb,用法区别在于fromuser=usera touser=userb ,remap_schema=’usera’:'usera’ . 例如

功能齐全、效率一流的免费开源数据库导入导出工具(c#开发,支持SQL server、SQLite、ACCESS三种数据库),每月借此处理数据5G以上

软件名:DataPie 功能:支持SQL server.SQLite.ACCESS数据库的导入.导出.存储过程调用,支持EXCEL2007.EXCEL2003.ACCESS2007. CSV文件导入数据库,支持EXCEL.CSV.ZIP.ACCESS文件方式导出,支持数据拆分导出及自定义SQL查询与导出. 开发背景:作者从事财务管理工作,主要是出具集团的内部财务报表,随着公司精细化管理的需求,管理报表的数据量急速增长, 依赖EXCEL加工处理数据已经变得极为困难,因此团队全面转向关系数据库进行数

Sqoop -- 用于Hadoop与关系数据库间数据导入导出工作的工具

转:https://blog.csdn.net/qx12306/article/details/67014096 Sqoop是一款开源的工具,主要用于在Hadoop相关存储(HDFS.Hive.HBase)与传统关系数据库(MySql.Oracle等)间进行数据传递工作.Sqoop最早是作为Hadoop的一个第三方模块存在,后来被独立成为了一个Apache项目.除了关系数据库外,对于某些NoSQL数据库,Sqoop也提供了连接器. 一.Sqoop基础知识 Sqoop项目开始于2009年,可以在H

ORACLE EXPDP IMPDP数据导入导出命令详解及同EXP IMP命令详细对比

ORACLE EXPDP IMPDP数据导入导出命令详解及同EXP IMP 命令详细对比 一.EXPDP IMPDP EXP IMP 可以实现 1.可以实现逻辑备份和逻辑恢复 2.可以在数据库用户之间移动对象 3.可以在数据库之间移动对象 4.可以实现表空间转移 二.EXPDP的命令详解 C:\Users\Administrator>20:42:32.90>expdp help=y Export: Release 11.2.0.1.0 - Production on 星期六 10月 10 09

【源】从零自学Hadoop(16):Hive数据导入导出,集群数据迁移上

阅读目录 序 导入文件到Hive 将其他表的查询结果导入表 动态分区插入 将SQL语句的值插入到表中 模拟数据文件下载 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 上一篇,我们介绍了Hive的表操作做了简单的描述和实践.在实际使用中,可能会存在数据的导入导出,虽然可以使用sqoop等工具进行关系型数据导入导出操作,但有的时候只需要很简便的方式进行导入导出即可   下面我们开始

一个基于POI的通用excel导入导出工具类的简单实现及使用方法

前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴.经过思考,认为一百个客户在录入excel的时候,就会有一百个格式版本,所以在实现这个功能之前,所以要统一excel的格式.于是提供了一个通用excel模版的下载功能.当所有客户用模版录入好数据再上传到系统,后端对excel进行解析,然后再持久化到数据库. 概述: 此工具类的几大特点 1.基本导入导出