ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: VBA万岁

[求助] VSTO入门问题集

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-12-16 17:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
VBA万岁 发表于 2015-12-16 16:36
八、如何用C#实现Excel工作表与外部文件的数据交换?

(一)如何将XML文件的数据导入Excel工作表?

导入的方法很多吧.
1,利用excel本身的导入xml功能,但显示格式比较固定,不好变化
2,使用pia,做法与vba一致,可以逐个单元格写入,也可以先创建一个二维数组,写入数组后,直接把数组赋值给单元格,速度应该是我目前觉得最快的.
3,使用openxml写入.暂时只弄过几次而已,实际是把内容直接写入到excel文件的xml文档里面.
4,利用ado.net也可以写入数据.

我之前有个<练习>的贴,一楼就是使用上面的点2,二楼就是使用上面的点3来读写数据.
至于读取xml就更容易了,在.net里面可以使用xpath或linqtoxml来读写,代码直观,容易维护.也可以使用xmlreader等低级的类,低级的类性能好,但生产效率就低不少了.

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-16 17:20 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
VBA万岁 发表于 2015-12-16 16:55
(二)如何将Excel工作表数据导入Access数据库?
            如146楼VBA代码中第81~122句那样实现将工 ...

百度有很多相关帖,这里帖上两个以供测试用:
1、C#中实现excel文件批量导入access数据表中
2、C#将Excel导入到Access数据库表(winForm版

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-16 17:26 | 显示全部楼层
excelhomesnake 发表于 2015-12-16 17:05
导入的方法很多吧.
1,利用excel本身的导入xml功能,但显示格式比较固定,不好变化
2,使用pia,做法与vba一 ...

暂帖上<练习>链接如下,有空再研读测试:
练习

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-17 14:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
VBA万岁 发表于 2015-12-16 16:55
(二)如何将Excel工作表数据导入Access数据库?
            如146楼VBA代码中第81~122句那样实现将工 ...

(三)如何将Access数据库及其他Excel文件的数据导入Excel工作表?
            相关链接:
            1、C#导入导出EXCEL文件的代码实例
            2、C# 将Access中的数据导入到Excel

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-19 20:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
excelhomesnake 发表于 2015-12-16 17:05
导入的方法很多吧.
1,利用excel本身的导入xml功能,但显示格式比较固定,不好变化
2,使用pia,做法与vba一 ...

采用逐个单元格写入的方法做了一个,源码如下:

ExcelHelpTaskPane.rar

534.61 KB, 下载次数: 72

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-19 20:16 | 显示全部楼层
本帖最后由 VBA万岁 于 2015-12-20 12:31 编辑
VBA万岁 发表于 2015-12-19 20:16
采用逐个单元格写入的方法做了一个,源码如下:

问题八(一)测试成功的主要代码:
  1. private void button1_Click(object sender, EventArgs e)
  2.         {
  3.             object o = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
  4.             Microsoft.Office.Interop.Excel._Application app = o as Microsoft.Office.Interop.Excel._Application;
  5.             Microsoft.Office.Interop.Excel.Workbook destbook = app.ActiveWorkbook;//得到当前活动的excel文档
  6.             Microsoft.Office.Interop.Excel.Worksheet excel = (Microsoft.Office.Interop.Excel.Worksheet)destbook.ActiveSheet;//得到当前Sheet

  7.             //以下被注释掉的代码可用于在新增的工作簿工作表中导入省市区数据,以上代码用于在当前活动工作表中导入省市区数据
  8.             //Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
  9.             //excel.Application.Workbooks.Add(true);
  10.             //excel.AlertBeforeOverwriting = false;

  11.             excel.Cells[1, 1] = "省";
  12.             excel.Cells[1, 2] = "市";
  13.             excel.Cells[1, 3] = "区";
  14.             int n=1;
  15.             XmlNode provinces = doc.SelectSingleNode("/ProvinceCity");
  16.             foreach (XmlNode province in provinces.ChildNodes)
  17.             {
  18.                 XmlNodeList cities = doc.SelectNodes(string.Format("/ProvinceCity/{0}/City", province.Name));
  19.                 foreach (XmlNode city in cities)
  20.                 {
  21.                     XmlNodeList CityAreas = doc.SelectNodes(string.Format("/ProvinceCity/{0}/City[@Name='{1}']/CityArea",province.Name,city.Attributes["Name"].Value));
  22.                     foreach (XmlNode area in CityAreas)
  23.                     {
  24.                         n++;
  25.                         excel.Cells[n, 1] = province.Name;
  26.                         excel.Cells[n, 2] = city.Attributes["Name"].Value;
  27.                         excel.Cells[n, 3]=area.Attributes["Name"].Value;
  28.                     }
  29.                 }
  30.             }
  31.             //excel.Visible = true;
  32.             //excel.ActiveWorkbook.SaveAs(System.Windows.Forms.Application.StartupPath + "\\省市区三级联动.xlsx", Microsoft.Office.Interop.Excel.XlFileFormat.xlExcel9795, null, null, false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, null, null, null, null, true);
  33.             //excel.Quit();
  34.             //excel = null;
  35.         }
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-20 09:40 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 VBA万岁 于 2015-12-20 12:29 编辑
VBA万岁 发表于 2015-12-17 14:42
(三)如何将Access数据库及其他Excel文件的数据导入Excel工作表?
            相关链接:
           ...

问题八(三)测试成功,主要代码如下:
  1. private void button1_Click(object sender, EventArgs e)
  2.         {
  3.             object o = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
  4.             Microsoft.Office.Interop.Excel._Application app = o as Microsoft.Office.Interop.Excel._Application;
  5.             Microsoft.Office.Interop.Excel.Workbook destbook = app.ActiveWorkbook;//得到当前活动的excel文档
  6.             Microsoft.Office.Interop.Excel.Worksheet sh = (Microsoft.Office.Interop.Excel.Worksheet)destbook.ActiveSheet;//得到当前Sheet

  7.             sh.Cells[1, 1] = "省";
  8.             sh.Cells[1, 2] = "市";
  9.             sh.Cells[1, 3] = "区";
  10.             OleDbConnection Conn;
  11.             try
  12.             {
  13.                 //string filename2 = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + @"\数据源\省市区三级联动.xlsx";
  14.                 string filename2 = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + @"\数据源\省市区三级联动.mdb";
  15.                 //string strConn2 = "Provider=Microsoft.Ace.OleDb.12.0;Data Source=" + filename2 + ";Extended Properties=Excel 12.0";
  16.                 string strConn2 = "Provider=Microsoft.Ace.OleDb.12.0;Data Source=" + filename2;
  17.                 Conn = new OleDbConnection(strConn2);
  18.                 Conn.Open();
  19.                 //string sql = "SELECT * FROM [VBA实现省市区三级联动$]";
  20.                 string sql = "SELECT * FROM VBA实现省市区三级联动";
  21.                 DataSet myDataSet = new DataSet();

  22.                 OleDbDataAdapter myCommand = new OleDbDataAdapter(sql, Conn);
  23.                 myCommand.Fill(myDataSet, "VBA实现省市区三级联动");
  24.                 for (int i = 0; i < myDataSet.Tables[0].Rows.Count; i++)
  25.                 {
  26.                     sh.Cells[i+2, 1] = myDataSet.Tables[0].Rows[i]["省"].ToString();
  27.                     sh.Cells[i + 2, 2] = myDataSet.Tables[0].Rows[i]["市"].ToString();
  28.                     sh.Cells[i + 2, 3] = myDataSet.Tables[0].Rows[i]["区"].ToString();
  29.                 }  
  30.             }
  31.             catch (Exception exception)
  32.             {
  33.                 MessageBox.Show(exception.Message);
  34.             }  
  35.         }      
  36.     }
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-20 10:13 | 显示全部楼层
VBA万岁 发表于 2015-12-16 16:55
(二)如何将Excel工作表数据导入Access数据库?
            如146楼VBA代码中第81~122句那样实现将工 ...

测试如下代码出错(运行时出错):
  1.         private void button2_Click(object sender, EventArgs e)
  2.         {
  3.             object o = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
  4.             Microsoft.Office.Interop.Excel._Application app = o as Microsoft.Office.Interop.Excel._Application;
  5.             Microsoft.Office.Interop.Excel.Workbook destbook = app.ActiveWorkbook;//得到当前活动的excel文档
  6.             Microsoft.Office.Interop.Excel.Worksheet sh = (Microsoft.Office.Interop.Excel.Worksheet)destbook.ActiveSheet;//得到当前Sheet
  7.             try
  8.             {
  9.                 OleDbConnectionStringBuilder connectStringBuilder = new OleDbConnectionStringBuilder();
  10.                 connectStringBuilder.DataSource = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "/数据源/省市区.mdb";
  11.                 connectStringBuilder.Provider = "Microsoft.Ace.OleDb.12.0";
  12.                 connectStringBuilder.Add("Extended Properties", "Excel 12.0");
  13.                 using (OleDbConnection cn = new OleDbConnection(connectStringBuilder.ConnectionString))
  14.                 {
  15.                     DataSet ds = new DataSet();
  16.                     string sql = "Select * from [" +sh.Name + "$]";
  17.                     OleDbCommand cmdLiming = new OleDbCommand(sql, cn);
  18.                     cn.Open();
  19.                     using (OleDbDataReader drLiming = cmdLiming.ExecuteReader())
  20.                     {
  21.                         ds.Load(drLiming, LoadOption.OverwriteChanges, new string[] { sh.Name });
  22.                         DataTable dt = ds.Tables[sh.Name];
  23.                         if (dt.Rows.Count > 0)
  24.                         {
  25.                             for (int i = 0; i < dt.Rows.Count; i++)
  26.                             {
  27.                                 //写入数据库数据
  28.                                 string MySql = "insert into ClientInfo values('" + dt.Rows[i]["省"].ToString() + "','" + dt.Rows[i]["市"].ToString()
  29.                                     + "','0','" + dt.Rows[i]["区"].ToString() + "','0','" + i.ToString() + "')";
  30.                                 new DataAccess().SQLExecute(MySql);
  31.                             }
  32.                             MessageBox.Show("数据导入成功!");
  33.                         }
  34.                         else
  35.                         {
  36.                             MessageBox.Show("请检查你的Excel中是否存在数据");
  37.                         }
  38.                     }
  39.                 }
  40.             }
  41.             catch (Exception ex)
  42.             {
  43.                 MessageBox.Show(ex.ToString());
  44.             }
  45.         }
  46.     }
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-20 10:21 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2015-12-20 16:34 | 显示全部楼层
VBA万岁 发表于 2015-12-20 10:13
测试如下代码出错(运行时出错):

"数据源/省市区.mdb"
来源是一个access数据库?
查询语句是需要在表名添加 "$"  ?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-23 23:05 , Processed in 0.041498 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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