seasky083 发表于 2015-3-17 16:26:00

跨sheet计算cell值

在处理多个sheet之间的计算时,发现使用FpSpread_Report.Sheets.SetFormula(x, y, "sheet2!A1"); 这样的公式赋值时,刚出来的结果是空,需要切换到sheet2,然后再到sheet1对应的cell里面才有数据
有什么办法能在加载之后不用切换到sheet2,直接就能在sheet1上看到数据

自己尝试过使用FpSpread_Report.Sheets.AutoCalculation = true;
FpSpread_Report.Sheets.RecalculateAll();
FpSpread_Report.ClientAutoCalculation = true;
这些都不起作用

iceman 发表于 2015-3-17 16:42:00

回复 1楼seasky083的帖子

根据您当前的信息我并没有重现问题。以下是 Spread 8重现代码,比较简单,新建工程拖拽 spread,添加以下代码即可重现:

      protected void Page_Load(object sender, EventArgs e)
      {
            if (IsPostBack)
            {
                return;
            }
            FpSpread1.Sheets.Count = 2;
            FpSpread1.Sheets.Cells.Value = 1;
            FpSpread1.Sheets.SetFormula(0, 0, "sheet2!A1");
      }


如果没能解决问题,请发送重现问题 Demo 到论坛调试。
谢谢

seasky083 发表于 2015-3-17 17:07:00

test.Sheets.SetFormula(1, 0, "需关闭帖子!A1");//值为“模块”

第一次进去,确实为空值


demo


切换后才有值

seasky083 发表于 2015-3-18 10:38:00

没人回答么,急用

iceman 发表于 2015-3-18 12:11:00

回复 3楼seasky083的帖子

问题重现了,感谢您的反馈,接下来我会反馈给产品组,在收到反馈后第一时间通知你。谢谢

为了感谢您反馈产品问题,给您分发 300 金币。可以用于兑换论坛奖品。
金币规则:点击进入
礼品列表:点击进入

seasky083 发表于 2015-3-23 10:01:00

你好,这个东西大概什么时候有个结果,我现在应该是你们的金牌服务了,麻烦尽快解决下

iceman 发表于 2015-3-23 11:07:00

回复 6楼seasky083的帖子

由于产品组在美国受到时差和问题处理先后顺序影响,问题预计明后天后有进一步结果,我这边已经发送了确认邮件。

请问您的公司信息是?我这边在确认您的用户信息后可以把您升级到金牌服务权限。

iceman 发表于 2015-3-26 11:58:00

回复 6楼seasky083的帖子

请尝试以下代码,在设置公式前后关闭和开启 EnableCrossSheetReference属性:

public ActionResult Index(FarPoint.Mvc.Spread.FpSpread test)
      {
            test.Sheets.Clear();

            FpSpread book = new FpSpread();

            book.OpenExcel(this.Server.MapPath("test.xlsx"));
            int i = 0;
            test.EnableCrossSheetReference = false;//turn off this flag before open excel
            foreach (FarPoint.Web.Spread.SheetView sheet in book.Sheets)
            {
                FpSpread bookIn = new FpSpread();
                bookIn.Sheets.Add(sheet);
                MemoryStream ms = new MemoryStream();
                bookIn.SaveExcel(ms);

                byte[] b = ms.ToArray();

                FarPoint.Web.Spread.SheetView sv = new FarPoint.Web.Spread.SheetView();
                sv.SheetName = sheet.SheetName;
                test.Sheets.Add(sv);

                sv.OpenExcel(new MemoryStream(b), 0);

                i++;
            }
            test.Sheets.Protect = true;
            test.Sheets.PageSize = 50;
            test.Width = 1200;
            test.EnableCrossSheetReference = true;

            //test.Sheets.SetFormula(1, 0, "需关闭帖子!A1");//值为“模块”
            test.Sheets.Cells.Formula = "需关闭帖子!A1";
            test.ClientAutoCalculation = true;
            test.Sheets.RecalculateAll();
            test.Sheets.RecalculateAll();
            test.Sheets.AutoCalculation = true;
            test.Sheets.AutoCalculation = true;
            return View();
      }

seasky083 发表于 2015-3-30 09:33:00

单独运行demo可以使用,但是我这边的情况是从数据库取出多个sheet,然后用sheetview添加到spread

                FpSpread_Report.EnableCrossSheetReference = false;

                FarPoint.Web.Spread.SheetView sheetView = new FarPoint.Web.Spread.SheetView();
                sheetView.SheetName = _ReportTemplate_En.FileName;
                FpSpread_Report.Sheets.Add(sheetView);
                sheetView.OpenExcel(new MemoryStream(_ReportTemplate_En.TemplateFile), 0);

在这个之前使用了你的EnableCrossSheetReference = false

然后sheet加载完成之后,对其中一个单元格做Formula(sheet1!A1)的赋值操作,就会找不到对应源(找不到sheet1),但是spread中是有两个sheet的,sheet1也是存在的
不清楚这是为什么,能说明下情况么

seasky083 发表于 2015-3-30 09:38:00

EnableCrossSheetReference 默认值应该是为true的吧,如果前面没设置为true,对应的源是可以找到的,只要设置了false就不行了,但是不设置又会出现开始加载出来的公式结果为空的现象,只有切换sheet之后才有结果
页: [1] 2
查看完整版本: 跨sheet计算cell值