ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 10308|回复: 16

[求助] 如何把读出来的数据填充到EXCEL内,用C#写

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-4-24 11:25 | 显示全部楼层 |阅读模式
本帖最后由 眼袋小美 于 2013-4-24 11:35 编辑

我通过VSTO把web service里面的数据读取出来后,要将整个数据填充到Excel里面,怎么写呢?
就是自动填充。

TA的精华主题

TA的得分主题

发表于 2013-4-24 12:28 | 显示全部楼层
http://club.excelhome.net/thread-941805-3-1.html

大致上和24楼的代码差不多。

或者是控件的数据动态绑定。

你起码有一个简单的代码段,和你的调试环境,别人才能帮你。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-25 10:44 | 显示全部楼层
public partial class ThisWorkbook
    {
        private void ThisWorkbook_Startup(object sender, System.EventArgs e)
        {
            #region the third method:load the dataset into the worksheet

            EHR.eHREmployeeSnapDataSoapClient HR = new EHR.eHREmployeeSnapDataSoapClient();
            DataSet ds = HR.GetFinancialData();
            MessageBox.Show("一共有 " + ds.Tables[0].Rows.Count.ToString() + " 行数据。"+ds.Tables[0].Columns.Count.ToString()+"列数据。");
            
            
            #region 获取web接口中的标题
            //int colIndex = 1;
            //foreach (DataColumn col in ds.Tables[0].Columns)
            //{            
              
            //    this.Application.Cells[1,colIndex] = col.ColumnName;
            //    colIndex++;
            //}

            int 列数 = 0;
            int 行数 = 1;
            //显示第一行列标题
            foreach (DataColumn col in ds.Tables[0].Columns)
            {
                列数++;
                this.Application.Cells[行数, 列数] = col.ColumnName;

            }
            //从第2行起逐行显示数据
            行数++;
            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                for (int i = 1; i <= 列数; i++)
                {
                    this.Application.Cells[行数, i] = dr.ItemArray[i - 1];

                }
                行数++;
                if (行数 >5000)
                    break;
#endregion
            }

            #endregion
         }
}



这个写进去很慢,怎么解决呢?

TA的精华主题

TA的得分主题

发表于 2013-4-25 13:58 | 显示全部楼层
方法之一:
把dataset的数据转到数组,然后一次性赋值。
代码在 windows7 + office2010测试通过
测试环境vs2010,NET4.0.
  1. public void DemoAccess()
  2.         {
  3.             Excel.Worksheet sh;
  4.             sh = this.Application.ActiveSheet;

  5.             string strCnn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\\myFile\\罗斯文.accdb;Jet OLEDB:Database Password=";
  6.             string strSql = "SELECT * FROM 客户";

  7.             DataSet ds = new DataSet();
  8.             OleDbConnection Cnn = null;
  9.          
  10.             Cnn = new OleDbConnection(strCnn);
  11.             OleDbCommand myCommand = new OleDbCommand(strSql, Cnn);
  12.             OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(myCommand);
  13.             try
  14.             {
  15.                 Cnn.Open();
  16.                 myDataAdapter.Fill(ds);
  17.             }
  18.             catch (Exception ex)
  19.             {
  20.                 MessageBox.Show(ex.Message);
  21.                 return;
  22.             }
  23.             finally
  24.             {

  25.                 Cnn.Close();
  26.             }

  27.             DataTable table = ds.Tables[0];
  28.             int r = table.Rows.Count;
  29.             int c =table.Columns.Count;
  30.             object[,] objarr = new object[r, c];
  31.             try
  32.             {
  33.                         
  34.                 for (int i = 0; i < r; i++)
  35.                 {
  36.                     for (int j = 0; j < c; j++)
  37.                     {
  38.                         objarr[i, j] = table.Rows[i].ItemArray[j];
  39.                     }
  40.                 }
  41.                 Excel.Range  rng;
  42.                 //定义范围
  43.                 rng = sh.Range[sh.Cells[2,1],sh.Cells[r,c]];
  44.                 //数组赋值工作表范围
  45.                 rng.Value2 = objarr;
  46.             }
  47.             catch (Exception ex)
  48.             {
  49.                 MessageBox.Show(ex.Message);
  50.                 return;
  51.             }
  52.          }
复制代码

TA的精华主题

TA的得分主题

发表于 2013-4-25 14:25 | 显示全部楼层
有没有类似cells(x,y).copyfromrecordset rst

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-25 16:29 | 显示全部楼层
lipton 发表于 2013-4-25 13:58
方法之一:
把dataset的数据转到数组,然后一次性赋值。
代码在 windows7 + office2010测试通过

你好,我用你的测试看了一下,我用的是windows7+office2007+vs2008
编译的时候发现sh=this.Application.ActiveSheet; 无法将类型“object”隐式转换为“Microsoft.Office.Interop.Excel.Worksheet”。存在一个显式转换(是否缺少强制转换?)
sh.range也提示错误,这个是怎么回事呢?

TA的精华主题

TA的得分主题

发表于 2013-4-25 17:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
眼袋小美 发表于 2013-4-25 16:29
你好,我用你的测试看了一下,我用的是windows7+office2007+vs2008
编译的时候发现sh=this.Application. ...

第二个问题:rng = sh.Range[sh.Cells[2,1],sh.Cells[r,c]];
vs2008可能是
rng = sh.get_Range[sh.Cells[2,1],sh.Cells[r,c]];

TA的精华主题

TA的得分主题

发表于 2013-4-25 17:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
xd3210 发表于 2013-4-25 14:25
有没有类似cells(x,y).copyfromrecordset rst

我只知道控件的数据绑定,和数组赋值。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-25 17:20 | 显示全部楼层
lipton 发表于 2013-4-25 17:11
第二个问题:rng = sh.Range[sh.Cells[2,1],sh.Cells[r,c]];
vs2008可能是
rng = sh.get_Range[sh.Cell ...

嗯,这个问题我已经解决了,谢谢!

发布还没有学会,正在研究中.

TA的精华主题

TA的得分主题

发表于 2013-4-25 17:33 | 显示全部楼层
眼袋小美 发表于 2013-4-25 16:29
你好,我用你的测试看了一下,我用的是windows7+office2007+vs2008
编译的时候发现sh=this.Application. ...


试一试:
Excel.Worksheet sh= ((Excel.Worksheet)Application.ActiveSheet);


您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-22 23:20 , Processed in 0.031717 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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