找回密码
 立即注册

QQ登录

只需一步,快速开始

LeeDongmei

金牌服务用户

44

主题

237

帖子

531

积分

金牌服务用户

积分
531

活字格认证微信认证勋章元老葡萄

LeeDongmei
金牌服务用户   /  发表于:2012-4-26 10:41  /   查看:9195  /  回复:14
如题:
我想在spread中动态添加若干个sheet,sheet的数量由数据库里的数据决定,sheet名也定义为数据库里的值,请问如何实现?
我的作业环境是IE6+spread4.0 for asp.net+sql2000

14 个回复

倒序浏览
LeeDongmei
金牌服务用户   /  发表于:2012-4-26 10:56:00
沙发
追加:开发工具还有vs2008---VB
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-4-26 10:58:00
板凳
LeeDongmei 你好

我对你的需求是这样理解的,你从数据库中得到一个查询结果,存放到一个DataSet或者多个DataTable中,然后Sheet的数量又DataSet中Table的数量决定,每个Table需要填充到一个Sheet上。不知理解是否和你的需求相同,如有差异请指出。

按照我的理解,又以下实现方法:
  1.         protected void Page_Load(object sender, EventArgs e)
  2.         {
  3.             FpSpread1.Sheets.Clear();

  4.             DataTable dt1 = new DataTable();
  5.             dt1.TableName = "Table1";
  6.             dt1.Columns.Add("Col1");
  7.             for (int i = 0; i < 10; i++)
  8.             {
  9.                 dt1.Rows.Add(i.ToString());
  10.             }
  11.             SheetView view1 = new SheetView();
  12.             view1.SheetName = dt1.TableName;
  13.             view1.DataSource = dt1;
  14.             FpSpread1.Sheets.Add(view1);


  15.             DataTable dt2 = new DataTable();
  16.             dt2.TableName = "Table2";
  17.             dt2.Columns.Add("Col2");
  18.             for (int i = 0; i < 10; i++)
  19.             {
  20.                 dt2.Rows.Add(i.ToString());
  21.             }
  22.             SheetView view2 = new SheetView();
  23.             view2.SheetName = dt2.TableName;
  24.             view2.DataSource = dt2;
  25.             FpSpread1.Sheets.Add(view2);

  26.             DataTable dt3 = new DataTable();
  27.             dt3.TableName = "Table3";
  28.             dt3.Columns.Add("Col3");
  29.             for (int i = 0; i < 10; i++)
  30.             {
  31.                 dt3.Rows.Add(i.ToString());
  32.             }
  33.             SheetView view3 = new SheetView();
  34.             view3.SheetName = dt3.TableName;
  35.             view3.DataSource = dt3;
  36.             FpSpread1.Sheets.Add(view3);
  37.         }
复制代码
回复 使用道具 举报
LeeDongmei
金牌服务用户   /  发表于:2012-4-26 11:16:00
地板
和我的问题多少有些差异。我的问题用具体事例解释:
我有许多条购入实际数据,是从多个厂家买来的。我想做付款汇总,每个厂家的数据要放在一个sheet中,sheet名要以厂家命名。但每个月厂家的数量是变化的,可多可少,根据实际购买决定。因此,我的sheet的数量是不确定的。如何定义SheetView view1 = new SheetView(); 因为这里的view1是固定的,而我需要变量。
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-4-26 11:36:00
5#
Spread中Sheet的数量可以根据数据源中DataTable的数量来动态生成

假设三月份的厂家信息如下:
  1.     // 假设三月份又以下厂家信息
  2.     System.Collections.Generic.List<string> names = new System.Collections.Generic.List<string>();
  3.     names.Add("厂家一");
  4.     names.Add("厂家二");
  5.     names.Add("厂家三");
  6.     names.Add("厂家四");
  7.     names.Add("厂家五");

  8.     // 创建每个厂家的实际数据
  9.     DataSet ds = new DataSet();
  10.     foreach (string name in names)
  11.     {
  12.         DataTable dt = new DataTable(name);
  13.         dt.Columns.Add("Col1");
  14.         for (int i = 0; i < 10; i++)
  15.         {
  16.             dt.Rows.Add(i);
  17.         }
  18.         ds.Tables.Add(dt);
  19.     }
复制代码


然后根据厂家的数量来动态添加Sheet:
  1.     // 将每个厂家的信息通Spread显示出来
  2.     foreach (DataTable dt in ds.Tables)
  3.     {
  4.         SheetView view = new SheetView();
  5.         view.SheetName = dt.TableName;
  6.         view.DataSource = dt;
  7.         FpSpread1.Sheets.Add(view);
  8.     }
复制代码


完整代码:
  1.         protected void Page_Load(object sender, EventArgs e)
  2.         {
  3.             if (IsPostBack)
  4.                 return;

  5.             FpSpread1.Sheets.Clear();

  6.             // 假设三月份又以下厂家信息
  7.             System.Collections.Generic.List<string> names = new System.Collections.Generic.List<string>();
  8.             names.Add("厂家一");
  9.             names.Add("厂家二");
  10.             names.Add("厂家三");
  11.             names.Add("厂家四");
  12.             names.Add("厂家五");

  13.             // 创建每个厂家的实际数据
  14.             DataSet ds = new DataSet();
  15.             foreach (string name in names)
  16.             {
  17.                 DataTable dt = new DataTable(name);
  18.                 dt.Columns.Add("Col1");
  19.                 for (int i = 0; i < 10; i++)
  20.                 {
  21.                     dt.Rows.Add(i);
  22.                 }
  23.                 ds.Tables.Add(dt);
  24.             }

  25.             // 将每个厂家的信息通Spread显示出来
  26.             foreach (DataTable dt in ds.Tables)
  27.             {
  28.                 SheetView view = new SheetView();
  29.                 view.SheetName = dt.TableName;
  30.                 view.DataSource = dt;
  31.                 FpSpread1.Sheets.Add(view);
  32.             }

  33.         }
复制代码
回复 使用道具 举报
LeeDongmei
金牌服务用户   /  发表于:2012-4-26 11:53:00
6#
谢谢!先试下。
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-4-27 15:17:00
7#
好的,你先试一试
回复 使用道具 举报
LeeDongmei
金牌服务用户   /  发表于:2012-5-3 14:57:00
8#
版主您好!
运用您的方法,我这里可以动态生成sheet,谢谢!
但是,通过这种方法生成的sheet,在IE中,只有一个sheet的内容可见,其它sheet的名称可见,但选择不了,单击没有任何反应。应该是单击哪个sheet就显示哪个sheet的数据内容呀。截图如下:
图片1.png (115.1 KB, 下载次数: 249)
回复 使用道具 举报
LeeDongmei
金牌服务用户   /  发表于:2012-5-3 15:07:00
9#
部分代码如下,请参考:  
                  comm.CommandText = (strSQL1)
                    comm.Connection = dbcnt400
                    commreader = comm.ExecuteReader
                    numn = 0
                    While commreader.Read

                        If commreader.GetValue(0).ToString <> "" Then
                            term = commreader.GetValue(0)
                            mon = commreader.GetValue(1)

                            Dim ts As Integer
                            ts = FpSpread2.Sheets.Count
                            Call sql11()
                            Adapter1 = New OleDbDataAdapter(strSQL1, dbcnt400)
                            Adapter1.Fill(db1, "tab" &amp; (numn + 1) &amp; "")
                            name = "tab" &amp; (numn + 1) &amp; ""
                            Dim t As Integer
                            t = db1.Tables("tab" &amp; (numn + 1) &amp; "").Rows.Count
                            Dim newsheet As New FarPoint.Web.Spread.SheetView
                            newsheet.SheetName = "'P-" &amp; term &amp; " 天 " &amp; mon &amp; "'"
                            FpSpread2.Sheets.Add(newsheet)
                            Dim model1 As FarPoint.Web.Spread.Model.DefaultSheetDataModel
                            model1 = New FarPoint.Web.Spread.Model.DefaultSheetDataModel(db1.Tables("tab" &amp; (numn + 1) &amp; ""))
                            FpSpread2.Sheets(numn).DataModel = model1
                            FpSpread2.Sheets(numn).SheetName = "'P-" &amp; term &amp; " 天 " &amp; mon &amp; "'"
                            FpSpread2.Sheets(numn).ColumnHeader.Cells(0, 0).Text = "" &amp; yy &amp; " 年" &amp; mm &amp; "月験収実際一覧表(" &amp; term &amp; " 天/" &amp; mon &amp; ")"
                            FpSpread2.Sheets(numn).ColumnHeader.Cells(0, 0).Font.Size = 20

                            numdbcount = db1.Tables("tab" &amp; (numn + 1) &amp; "").Rows.Count
                            For n = 0 To numdbcount - 1
                                FpSpread2.Sheets(m).Cells(n, 0).Text = n + 1
                            Next
                            db1.Tables("tab" &amp; (numn + 1) &amp; "").Rows.Add()
                            FpSpread2.Sheets(numn).Cells(n, 0).Text = "合计"
                            FpSpread2.Sheets(numn).Cells((numdbcount), 3).Formula = "sum(D1" &amp; n &amp; ")"
                            FpSpread2.Sheets(numn).Cells((numdbcount), 4).Formula = "sum(E1:E" &amp; n &amp; ")"
                            FpSpread2.Sheets(numn).Cells((numdbcount), 5).Formula = "sum(F1:F" &amp; n &amp; ")"

                            numn = numn + 1
                        Else
                        End If
                    End While
                    m = m + numn
                    ViewState("m") = m
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-5-3 16:39:00
10#
附件中的工程环境是 VS2008 + Spread for .net 4.0
4197_Sheet.zip (2.33 MB, 下载次数: 192)
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部