因本人比较懒,单位上有八十多号人,不想一个个去添加联系人,但现有的一些批量添加联系人的方法貌似都不怎么好用,故特意写了个针对华为Play 4t Pro批量添加联系人的软件;本软件已确认支持华为Play 4t Pro手机,至于华为其他型号或其他品牌手机暂未测试;华为品牌的手机可以试试,成功的概率估计会好高。

以下是关键代码,需要完整代码软件的请留言或发邮件1406133926@qq.com联系,看到了会回复,实在等不及的可以加QQ;

步骤1、2用于解析已有的联系人的.vcf文件,并生成.xls文件,便于个人做数据去重等操作,不需要的可以直接跳过;

步骤3为将有联系人信息的.xls文件加密成.txt文件;将步骤3生成的.txt文件直接改后缀为.vcf后,直接导入手机中,手机会自动识别。

1、以下代码用于解析已将的.vcf联系人直接改后缀成.txt文件;

/// <summary>
/// 读取,解析.vcf直接改后缀成的.txt文件,将名片信息保存在DataTable中
/// </summary>
/// <param name="file_Path_txt">将.vcf直接改后缀成.txt的文件路径</param>
private DataTable Analysis_vcf(string file_Path_txt)
{#region 创建通讯录.xls文件列名System.Data.DataTable dt = new System.Data.DataTable();DataColumn name = new DataColumn("姓名", Type.GetType("System.String"));DataColumn cell = new DataColumn("手机", Type.GetType("System.String"));DataColumn work = new DataColumn("座机", Type.GetType("System.String"));DataColumn email = new DataColumn("邮箱", Type.GetType("System.String"));DataColumn org = new DataColumn("单位", Type.GetType("System.String"));DataColumn title = new DataColumn("职位", Type.GetType("System.String"));DataColumn note = new DataColumn("备注", Type.GetType("System.String"));DataColumn group = new DataColumn("群组", Type.GetType("System.String"));dt.Columns.Add(name);dt.Columns.Add(cell);dt.Columns.Add(work);dt.Columns.Add(email);dt.Columns.Add(org);dt.Columns.Add(title);dt.Columns.Add(note);dt.Columns.Add(group);#endregion#region 解析.txt通讯录文件,并保存到DataTable中    try{using (StreamReader sr = new StreamReader(file_Path_txt))//读取.txt文件{string[] STRING = { "FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:", "TEL;CELL:", "TEL;WORK:", "EMAIL;HOME :", "ORG;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:", "TITLE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:", "NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:", "X-GROUP-MEMBERSHIP:" };//存放识别字符串;分别为姓名、手机、座机、邮件、单位、职位、备注(0,4,5,6需要解码,注意:不识别英文姓名)string[] INFOR = new string[8] { "", "", "", "","", "", "", "" };//存放空名片信息:姓名 手机 座机 邮箱 单位 职位 备注 群组  string line;while ((line = sr.ReadLine()) != null)//按行读取.txt文件(如果数据太长,原始.vcf文件会自动换行,所以存在丢数据或解析乱码情况){for (int i=0;i<STRING.Length;i++){if(line.Contains (STRING[i])){if (i==0 || i == 4 || i == 5 || i == 6)//姓名、单位、职位、备注,需要解码{if (line.Substring(STRING[i].Length).Contains("=")){INFOR[i] = UnHex(line.Substring(STRING[i].Length).Replace("=", "").Replace(";", ""));}else{INFOR[i] = line.Substring(STRING[i].Length).Replace(";", "");}}else{INFOR[i] = line.Substring(STRING[i].Length).Replace("=", "").Replace(";", "");}break;}}if (line.Contains("END:VCARD"))//结束,将读取的个人名片信息,保存到DataTable中{DataRow dr = dt.NewRow();for (int i=0;i<INFOR.Length;i++){dr[i] = INFOR[i].ToString();}dt.Rows.Add(dr);//清空个人名片信息,便于下次存放数据for(int i=0;i<INFOR .Length;i++){INFOR[i] = "";}}return dt;}}catch(Exception ex){MessageBox.Show("读取解析文件错误" + ex.Message);}}#endregion
}/// <summary>
/// 将16进制字符串转换成UTF-8汉字
/// </summary>
/// <param name="hex">16进制字符串</param>
private string UnHex(string hex)
{if (hex == null){throw new ArgumentNullException("hex");}hex = hex.Replace(",", "");hex = hex.Replace("\n", "");hex = hex.Replace("\\", "");hex = hex.Replace(" ", "");if (hex.Length % 2 != 0){hex += "20";//空格}//需要将 hex 转换成 byte 数组。 byte[] bytes = new byte[hex.Length / 2];for (int i = 0; i < bytes.Length; i++){try{//每两个字符是一个 byte。 bytes[i] = byte.Parse(hex.Substring(i * 2, 2),System.Globalization.NumberStyles.HexNumber);}catch{// Rethrow an exception with custom message. throw new ArgumentException("不是16进制字符串!", "hex");}}System.Text.Encoding chs = System.Text.Encoding.GetEncoding("utf-8");return chs.GetString(bytes);
}

2、解析后的DataTable数据保存到.xls文件中;

/// <summary>
/// 将DataTable中的数据,写入到Excel文件中
/// </summary>
/// <param name="dt">数据源DataTable</param>
/// <param name="FileName">文件名</param>
/// <param name="outres">存放文件路径</param>
private void Export_DataTable_TO_Excel(DataTable dt, string FileName, ref string outres)
{if (dt.Rows.Count > 0){int row = dt.Rows.Count;//设置表的行数  int col = dt.Columns .Count;//设置表的列数DateTime beforetime = DateTime.Now;Microsoft.Office.Interop.Excel.Application myExcel = new Microsoft.Office.Interop.Excel.Application();//创建Excel表  DateTime aftertime = DateTime.Now;myExcel.Visible = false;Microsoft.Office.Interop.Excel.Workbooks myWorkbooks = myExcel.Workbooks;//创建Excel工作表集合  Microsoft.Office.Interop.Excel.Workbook myWorkbook = myWorkbooks.Add(System.Reflection.Missing.Value);//创建Excel工作表  Microsoft.Office.Interop.Excel.Worksheet myWorksheet = (Microsoft.Office.Interop.Excel.Worksheet)myWorkbook.Worksheets[1];//创建Excel工作表Sheet1页  Microsoft.Office.Interop.Excel.Range myRange = myExcel.get_Range(myExcel.Cells[1, 1], myExcel.Cells[1, col]);//选择页的范 myExcel.Cells[1, 4]表示下面myhead中存入的好多哥表头的个数  object[] myhead = { "姓名", "手机", "座机", "邮箱","单位", "职务", "备注", "群组" };//设置表头,这种设置表头的方法是写死的,虽然有点笨,但是效果还是不错的  for (int i = 1; i <= col; i++){Microsoft.Office.Interop.Excel.Range rngA = (Microsoft.Office.Interop.Excel.Range)myWorksheet.Columns[i, Type.Missing];//设置单元格格式rngA.NumberFormatLocal = "@";//字符型格式}myRange.Value2 = myhead;myRange = myWorksheet.get_Range("A2", System.Reflection.Missing.Value);object[,] mydata = new object[row, col];int m = 0;foreach (System.Data.DataRow row2 in dt.Rows){int j = 0;foreach (System.Data.DataColumn column in dt.Columns){mydata[m, j] = row2[column.ColumnName].ToString();j = j + 1;}m = m + 1;}myRange = myRange.get_Resize(row, col);myRange.Value2 = mydata;//把mydata数组的值存到Excel表导出  myRange.EntireColumn.AutoFit();SaveFileDialog sfd = new SaveFileDialog();sfd.DefaultExt = "xls";sfd.Filter = "Excel文件(*.xls)|*.xls";sfd.FileName = FileName;myWorkbook.Saved = true;if (sfd.ShowDialog() == DialogResult.OK){myWorkbook.Saved = true;myWorkbook.SaveCopyAs(sfd.FileName);outres = "1";}//关闭活页簿myWorkbook.Close(false, Type.Missing, Type.Missing);myWorkbooks.Close();//关闭ExcelmyExcel.Quit();//释放Excel资源System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcel);myWorkbook = null;myWorksheet = null;myRange = null;myExcel = null;GC.Collect();Process[] ps = Process.GetProcesses();foreach (Process p in ps){if (p.ProcessName.ToLower().Equals("excel")){DateTime starttime = p.StartTime;if (starttime > beforetime && starttime < aftertime){p.Kill();}}}}else{outres = "0";}
}

3、将包含个人名片信息的.xls文件,加密成.txt文件;最后可手动将.txt直接改后缀成.vcf文件,导入到手机中,即可自动识别;

/// <summary>
/// 读取Excel中的数据,并将读取的数据保存到DataTable中,数据列为:姓名、手机、座机、邮箱、单位、职务、备注、群组
/// </summary>
/// <returns></returns>
private DataTable ReadExcel()
{//打开文件OpenFileDialog file = new OpenFileDialog();file.Filter = "Excel(*.xlsx)|*.xlsx|Excel(*.xls)|*.xls";file.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);file.Multiselect = false;if (file.ShowDialog() == DialogResult.Cancel)return null;//判断文件后缀var path = file.FileName;try{//连接字符串string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"; // Office 07及以上版本 不能出现多余的空格 而且分号注意//string connstring = Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"; //Office 07以下版本 using (OleDbConnection conn = new OleDbConnection(connstring)){conn.Open();DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); //得到所有sheet的名字string firstSheetName = sheetsName.Rows[0][2].ToString(); //得到第一个sheet的名字string sql = string.Format("SELECT * FROM [{0}]", firstSheetName); //查询字符串          OleDbDataAdapter ada = new OleDbDataAdapter(sql, connstring);DataSet set = new DataSet();ada.Fill(set);return set.Tables[0];}}catch (Exception){return null;}
}/// <summary>
/// 将读取到通讯录信息DataTable,加密保存到.txt中
/// </summary>
/// <param name="filePath">生成的.txt文件存放的完整路径名,含后缀</param>
private void CreateText(string filePath)
{DataTable dt = ReadExcel();StreamWriter sw = File.AppendText(filePath);//指定路径//StreamWriter sw = File.AppendText(Application.StartupPath + filePath);//程序根目录路径for(int i=1;i<dt.Rows.Count;i++)//一个个个人信息写入到.txt中{sw.WriteLine("BEGIN:VCARD"+Environment .NewLine + "VERSION:2.1");//Play 4t Pro固定的开头样式sw.WriteLine("N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=" + ToHex(dt.Rows[i][0].ToString()));//姓名,需要UTF-8转16进制(如果是英文名字,样式格式为“N:”,同时也不需要转码)sw.WriteLine("FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=" + ToHex(dt.Rows[i][0].ToString()));//姓名,需要UTF-8转16进制(如果是英文名字,样式格式为“N:”,同时也不需要转码)sw.WriteLine("TEL;CELL:" + dt.Rows[i][1].ToString());//手机if(dt.Rows[i][2].ToString().Trim().Length >0){sw.WriteLine("TEL;WORK:" + dt.Rows[i][2].ToString());//座机}if (dt.Rows[i][3].ToString().Trim().Length > 0){sw.WriteLine("EMAIL;HOME:" + dt.Rows[i][3].ToString());//邮箱}if (dt.Rows[i][4].ToString().Trim().Length > 0){sw.WriteLine("ORG;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=" + ToHex(dt.Rows[i][4].ToString()));//单位,需要UTF-8转16进制(如果是英文,样式格式可能为“ORG:”,同时也不需要转码,未测试!)}if (dt.Rows[i][5].ToString().Trim().Length > 0){sw.WriteLine("TITLE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=" + ToHex(dt.Rows[i][5].ToString()));//职务,需要UTF-8转16进制(如果是英文,样式格式可能为“ORG:”,同时也不需要转码,未测试!)}if (dt.Rows[i][6].ToString().Trim().Length > 0){sw.WriteLine("NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=" + ToHex(dt.Rows[i][6].ToString()));//备注,需要UTF-8转16进制(如果是英文,样式格式可能为“ORG:”,同时也不需要转码,未测试!)}if (dt.Rows[i][7].ToString().Trim().Length > 0){sw.WriteLine("X-GROUP-MEMBERSHIP:" + dt.Rows[i][7].ToString());//群组}sw.WriteLine("END:VCARD");//Play 4t Pro固定的结束样式}sw.Flush();sw.Close();MessageBox.Show("生成.txt文件成功!");
}/// <summary>
/// 汉字UTF-8转16进制
/// </summary>
/// <param name="s">需要转码的汉字</param>
/// <returns></returns>
private  string ToHex(string s)
{if ((s.Length % 2) != 0){s += " ";//空格//throw new ArgumentException("s is not valid chinese string!");}System.Text.Encoding chs = System.Text.Encoding.GetEncoding("utf-8");byte[] bytes = chs.GetBytes(s);string str = "";for (int i = 0; i < bytes.Length; i++){str += string.Format("{0:X}", bytes[i]);if (i != bytes.Length - 1){str += string.Format("{0}", "=");}}return str.ToLower();
}

华为Play 4T Pro批量添加联系人相关推荐

  1. 批量添加联系人的方法

    说实话,我找了一整天的帖子,好像所有关于批量添加联系人的帖子都是复制一个人的! 然后那一个人又没说清楚. 以下是我做的,可能有不对! 实现功能就好吧.我感觉 API上,还有sample里面都有现成的, ...

  2. 手机号码批量导入通讯录php,iPhone8怎么批量导入通讯录?苹果8批量添加联系人教程...

    苹果8批量添加联系人教程 方法一: 1.首先我们需要在正式使用iPhone8之前,先将所有的通讯录联系人保存到SIM卡中,然后取出SIM卡安装到新iPhone8手机当中. 2.然后我们依次进入到iPh ...

  3. Android批量添加联系人到通讯录

    由于工作上的需要,把数据库中备份的联系人添加到通讯录,一般都有几百条记录,插入一条数据系统默认commit一次,这样效率就降低了,如果把所有的数据都添加进去后再commit效率就不一样,这就需要事务 ...

  4. android批量添加联系人,Android实现批量添加联系人到通讯录

    由于工作上的需要,把数据库中备份的联系人添加到Android通讯录,一般都有几百条记录,插入一条数据系统默认commit一次,这样效率 由于工作上的需要,把数据库中备份的联系人添加到Android通讯 ...

  5. 在Office365中批量添加联系人

    在O365中,联系人项没有提供批量导入的选项,需要一个一个添加.需要大批量添加时,无疑是一件很痛苦的事! 实际上,我们可以使用Windows PowerShell和CSV文件批量导入联系人.主要分为以 ...

  6. python实现批量添加联系人到手机通讯录+python可视化编程案例

    简要 本案例通过python+pandas实现提取excel工作表中的数据,并将其添加相关代码信息,再保存为txt,然后保存为后缀名为.vcf的通讯录备份文件,此文件可以直接使用手机自带通讯录软件打开 ...

  7. android 通讯录 编程,以编程方式批量添加数千个Android联系人

    使用ContentResolver.applyBatch和ContentResolver.bulkInsert方法一次性添加数千个联系人非常慢. Android是否提供了批量添加联系人的不同方式,这种 ...

  8. 华为桌面小程序在哪里_微信Windows版更新至3.0:批量管理联系人,小程序可添加至桌面...

    玩懂手机网资讯,日前,微信的 Windows 版本推送了新版本更新,更新后的版本为「微信 for Windows 3.0.0」,更新后的微信 Windows 版可以批量管理联系人,并且可以把之前支持的 ...

  9. 批量添加Exchange邮件联系人

    公司的一个sales那天给100多个客户发送邮件,需要手动添加一个个联系人到一个组 那样比较费力,加入哪天手上客户数量有1000个呢? 于是老大提醒我说,去Exchange上面把这些客户名单批量导入到 ...

最新文章

  1. 新晋 ACM Fellow 陶大程,8 篇 NeurIPS 论文详解
  2. 计算机管理损坏的图像,损坏的图像(打开软件出现)解决方法
  3. 沿任意方向缩放、镜像、正交投影及切变及其推导
  4. 【阿里云MPS】MPS(原MTS)概述
  5. POJ 2251 Dungeon Master (BFS最短路)
  6. php获取flash上传视频文件大小,如何获取flash文件(.swf文件)的长度和宽度
  7. 华为Mate系列新机海外亮相 或将于MWC2019发布
  8. jumbo 安装mysql,关于建立社工库的经验总结
  9. delphi中单独编译pas生成dcu文件
  10. kmp算法next计算方法_【数据结构——串】KMP算法——next数组Python的实现方式
  11. 【高数】幂级数求和函数问题:用变限积分?积分下限是0?S(0)怎么求?求和时起始项n和角标有规定吗?
  12. uniapp换行符号_第15讲 : uni-app 组件 - 地图组件
  13. 华为鸿蒙系统支持什么手机_华为手机鸿蒙系统支持所有华为手机吗
  14. switch语句及其嵌套
  15. 【高级持续性威胁追踪】来自Mustang Panda的攻击? 我兔又背锅了!
  16. C++语言基础——C++一本通:C++语言入门 1005:地球人口承载力估计
  17. Java-(二)微信小程序授权获取用户信息和手机号码
  18. c++ private、protect、public、virtual详细说明***
  19. Opencv之边缘检测卷积算子(roberts与prewitt)
  20. POJ - 2008 Moo University - Team Tryouts

热门文章

  1. java 金额的大小写转换类
  2. 96Boards MIPI CSI Camera Mezzanine
  3. 补肾健脑的中药有哪些?
  4. Java规则引擎easy rules
  5. 如何写好技术部门的年度 OKR
  6. Win7中双击bat文件变成打开文本编辑器后如何恢复
  7. php页眉,FPDF页眉和页脚 - php
  8. 关于CClientDC与CPAINTDC,以及GetDC与GetWindowDC的用法。
  9. NI Multisim元件库:在Multisim中创建自定义元器件
  10. 最新php开发学习资料网盘下载